Hi Julien, On Thursday, 2011-08-04 23:10:08 +0200, Julien Nabet wrote:
/libs-gui/i18npool/source/calendar/ calendar_gregorian.cxx 62 va_start(ap, pat); 59 static void debug_cal_msg(const char *pat, ...) 60 { 61 va_list ap; 62 va_start(ap, pat); 63 vfprintf(stderr, pat, ap); 64 } I read that vfprintf didn't call automatically va_end (http://www.cplusplus.com/reference/clibrary/cstdio/vfprintf/) so I would add a va_end there
Yes please.
/libs-core/sfx2/source/menu/ mnumgr.cxx 444 va_start(pArgs, pArg1); 439 sal_uInt16 SfxPopupMenuManager::Execute( const Point& rPoint, Window* pWindow, const SfxPoolItem *pArg1, ... ) 440 { 441 DBG_MEMTEST(); 442 443 va_list pArgs; 444 va_start(pArgs, pArg1); 445 446 return (Execute( rPoint, pWindow, pArgs, pArg1 )); 447 } which seems to call in the same file : 422 sal_uInt16 SfxPopupMenuManager::Execute( const Point& rPoint, Window* pWindow, va_list pArgs, const SfxPoolItem *pArg1 ) 423 { 424 DBG_MEMTEST(); 425 426 PopupMenu* pPopMenu = ( (PopupMenu*)GetMenu()->GetSVMenu() ); 427 pPopMenu->SetSelectHdl( LINK( this, SfxPopupMenuManager, SelectHdl ) ); 428 sal_uInt16 nId = pPopMenu->Execute( pWindow, rPoint ); 429 pPopMenu->SetSelectHdl( Link() ); 430 431 if ( nId ) 432 GetBindings().GetDispatcher()->_Execute( nId, SFX_CALLMODE_RECORD, pArgs, pArg1 ); 433 434 return nId; 435 } which seems to call in the file /libs-core/sfx2/source/control/dispatch.cxx : const SfxPoolItem* SfxDispatcher::_Execute 1381 ( 1382 sal_uInt16 nSlot, // the Id of the executing function 1383 SfxCallMode eCall, // SFX_CALLMODE_SYNCRHON, ..._ASYNCHRON or 1384 //..._SLOT 1385 va_list pVarArgs, // Parameter list from the 2nd parameter 1386 const SfxPoolItem* pArg1 // First parameter 1387 ) 1388 1389 /* [Description] 1390 1391 Method to excecute a <SfxSlot>s over the Slot-Id. 1392 1393 [Return value] 1394 1395 const SfxPoolItem* Pointer to the SfxPoolItem valid to the next run 1396 though the Message-Loop, which contains the return 1397 value. 1398 1399 Or a NULL-Pointer, when the function was not 1400 executed (for example canceled by the user). 1401 */ 1402 1403 { 1404 if ( IsLocked(nSlot) ) 1405 return 0; 1406 1407 SfxShell *pShell = 0; 1408 const SfxSlot *pSlot = 0; 1409 if ( GetShellAndSlot_Impl( nSlot, &pShell, &pSlot, sal_False, 1410 SFX_CALLMODE_MODAL==(eCall&SFX_CALLMODE_MODAL) ) ) 1411 { 1412 SfxAllItemSet aSet( pShell->GetPool() ); 1413 1414 for ( const SfxPoolItem *pArg = pArg1; 1415 pArg; 1416 pArg = va_arg( pVarArgs, const SfxPoolItem* ) ) 1417 MappedPut_Impl( aSet, *pArg ); 1418 1419 SfxRequest aReq( nSlot, eCall, aSet ); 1420 _Execute( *pShell, *pSlot, aReq, eCall ); 1421 return aReq.GetReturnValue(); 1422 } 1423 return 0; 1424 } so I would add a va_end in SfxPopupMenuManager::Execute
The one that has va_start, yes.
3) there are some cases (above all in win32 parts that I can't compile to check patch) like this one : /components/setup_native/source/win32/customactions/reg64/ reg64.cxx 77 va_start( args, pFormat ); inline void OutputDebugStringFormat( const wchar_t* pFormat, ... ) 73 { 74 wchar_t buffer[1024]; 75 va_list args; 76 77 va_start( args, pFormat ); 78 StringCchVPrintf( buffer, sizeof(buffer), pFormat, args ); 79 OutputDebugString( buffer ); 80 } I found nothing which tells if StringCchVPrintf calls automatically va_end or not. Since this function seems derived from Vprintf, I would add a va_end too.
I think so, though I don't know those Windows functions. I'd assume that any function that takes a va_list does not call va_end itself. Except our own code ... :-/ Eike -- PGP/OpenPGP/GnuPG encrypted mail preferred in all private communication. Key ID: 0x293C05FD - 997A 4C60 CE41 0149 0DB3 9E96 2F1A D073 293C 05FD
Attachment:
pgpWzq1l3Lz3G.pgp
Description: PGP signature