TortoiseSVNéçºè ã«PVS-Studioã¢ãã©ã€ã¶ãŒã®ç¡æã®ããŒããã°ããéä¿¡ããŸããã 圌ããããã䜿çšããæéããããŸã§ãç§ã¯TortoiseSVNã®ãœãŒã¹ã³ãŒãããã°ããããŠã³ããŒãããèªåã§åæãå®è¡ããããšã«ããŸããã ç®æšã¯æ確ã§ãã PVS-Studioã宣äŒããããã®ãã1ã€ã®å°ããªèšäºã
TortoiseSVNãããžã§ã¯ãã¯æ¢ã«ãã¹ãæžã¿ã§ãã ããã¯ãã£ãšåã®ããšã§ãã ãããžã§ã¯ãã®æ€èšŒã¯ãäžè¬çãªèšºæã«ãŒã«ãæåã«ç»å ŽããPVS-Studio 4.00ã®ãªãªãŒã¹ãšåæã«è¡ãããŸããã
å®æçã«ãã§ãã¯ãç¹°ãè¿ããããŒã«ãå®æçã«äœ¿çšããããšã®å©ç¹ãå®èšŒããŸãã ãããžã§ã¯ãã1åãŸãã¯2åãã§ãã¯ããããšã¯æå³ããããŸããã å¯å€ã³ãŒãã§ã¯ãæ°ãããšã©ãŒãåžžã«è¡šç€ºãããŸãã ãããŠããã£ãããšæ²ããããšã«ä¿®æ£ããŸããã ãããã£ãŠãPVS-Studioãæ¯æ¥äœ¿çšããããšã§æ倧ã®ã¡ãªãããåŸãããŸãã ããã«è¯ãã®ã¯ã å¢ååæã䜿çšããããšã§ãã
ããã§ã¯ã PVS-StudioããŒãžã§ã³5.05ã䜿çšãããããžã§ã¯ãã§èå³æ·±ãããšãããã£ããã®ãèŠãŠã¿ãŸãããã TortoiseSVNã®ãœãŒã¹ã³ãŒãã¯ã2013幎6æ19æ¥ã«http://tortoisesvn.googlecode.com/svn/trunkããååŸãããŸããã ãšããã§ãTortoiseSVNãããžã§ã¯ãã¯éåžžã«é«å質ã§ããŠãŒã¶ãŒããã°ã©ããŒã®å·šå€§ãªããŒã¿ããŒã¹ãæã£ãŠããŸãã ãããã£ãŠãå°ãªããšãäœããèŠã€ããå Žåãããã¯ãã§ã«å€§ããªææã§ãã
å¥åŠãªæ¡ä»¶
static void ColouriseA68kDoc (....) { if (((sc.state == SCE_A68K_NUMBER_DEC) && isdigit(sc.ch)) .... || ((sc.state == SCE_A68K_MACRO_ARG) && isdigit(sc.ch)) || ((sc.state == SCE_A68K_MACRO_ARG) && isdigit(sc.ch)) .... }
蚺æã¡ãã»ãŒãžïŒV501ã||ãã®å·Šãšå³ã«åäžã®å¯æ¬¡åŒãïŒïŒsc.state == 11ïŒ&& isdigitïŒsc.chïŒïŒãããããŸã æŒç®åã lexa68k.cxx 160
2ã€ã®åäžã®æ¯èŒããããŸãã ã¿ã€ããã¹ããããŸãã
ã¿ã€ããã¹ã¯ããããã次ã®ã³ãŒãã«ååšããŸãã å€æ°ãrvãã®å€ã¯2åãã§ãã¯ãããŸãã
struct hentry * AffixMgr::compound_check( .... if (rv && forceucase && (rv) && ....) .... }
蚺æã¡ãã»ãŒãžïŒV501 '&&'æŒç®åã®å·Šå³ã«åãå¯æ¬¡åŒããããŸãïŒrv && forceucase &&ïŒrvïŒïŒ
- affixmgr.cxx 1784
- affixmgr.cxx 1879
次ã®ã³ãŒãã¹ããããïŒ
bool IsAllASCII7 (const CString& s) { for (int i = 0, count = s.GetLength(); i < count; ++i) if (s[i] >= 0x80) return false; return true; }
蚺æã¡ãã»ãŒãžïŒV547 Expression 's [i]> = 0x80'ã¯åžžã«falseã§ãã charåã®å€ã®ç¯å²ïŒ[-128ã127]ã logdlgfilter.cpp 34
IsAllASCII7ïŒïŒé¢æ°ã¯åžžã«ãtrueããè¿ããŸãã æ¡ä»¶ã®[i]> = 0x80 'ã¯åžžã«falseã§ãã ã¿ã€ã 'char'ã®å€æ°ã®å€ã¯0x80以äžã«ã¯ã§ããŸããã
誀ã£ãæ¯èŒãå«ã次ã®ã³ãŒãã¹ããããïŒ
int main(int argc, char **argv) { .... DWORD ticks; .... if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; } else { ticks = INFINITE; } .... }
蚺æã¡ãã»ãŒãžïŒV547åŒ 'ticks <0'ã¯åžžã«falseã§ãã 笊å·ãªãã®åã®å€ã<0ã«ãªãããšã¯ãããŸããwinplink.c 635
å€æ° 'ticks'ã¯ç¬Šå·ãªãã§ãã ã€ãŸãããifïŒticks <0ïŒãããã§ãã¯ããŠãæå³ããããŸããã ãªãŒããŒãããŒç¶æ³ã¯åŠçãããŸããã
strncmpé¢æ°ãæååãå®å šã«æ¯èŒã§ããªããšã©ãŒãèæ ®ããŠãã ããã
int AffixMgr::parse_convtable(...., const char * keyword) { char * piece; .... if (strncmp(piece, keyword, sizeof(keyword)) != 0) { .... }
蚺æã¡ãã»ãŒãžïŒV579 strncmpé¢æ°ã¯ããã€ã³ã¿ãŒãšãã®ãµã€ãºãåŒæ°ãšããŠåãåããŸãã ééããããããŸããã 3çªç®ã®åŒæ°ã調ã¹ãŸãã affixmgr.cxx 3654
'sizeof'æŒç®åã¯ããã€ã³ã¿ãŒã®ãµã€ãºãèšç®ããŸãã ãã®å€ã¯ãæååã®é·ããšã¯é¢ä¿ãããŸããã
çãããã¹ããªã³ã°åœ¢æ
å¯å€æ°ã®åŒæ°ãæã€é¢æ°ã¯åžžã«ã©ãã«ã§ããããåžžã«å±éºã§ãã
class CTSVNPath { .... private: mutable CString m_sBackslashPath; mutable CString m_sLongBackslashPath; mutable CString m_sFwdslashPath; .... }; const FileStatusCacheEntry * SVNFolderStatus::BuildCache( const CTSVNPath& filepath, ....) { .... CTraceToOutputDebugString::Instance() (_T(__FUNCTION__) _T(": building cache for %s\n"), filepath); .... }
蚺æã¡ãã»ãŒãžïŒV510 'operatorïŒïŒ'é¢æ°ã¯ã2çªç®ã®å®åŒæ°ãšããŠã¯ã©ã¹åå€æ°ãåãåãããšãæåŸ ãããŠããŸããã
- svnfolderstatus.cpp 150
- svnfolderstatus.cpp 355
- svnfolderstatus.cpp 360
æå®å "ïŒ s"ã¯ãé¢æ°ãæååãå®éã®åŒæ°ãšããŠæåŸ ããããšã瀺ããŸãã ãã ããå€æ° 'filepath'ã¯ãŸã£ããæååã§ã¯ãªããå€ãã®è¡ã§æ§æãããè€éãªãªããžã§ã¯ãã§ãã äœãå°å·ãããã®ãããã®ã³ãŒãããŸã£ããèœã¡ãã®ãã©ãããèšãã®ã¯éæ¹ã«æ®ããŠããŸãã
ãprintfïŒïŒããªã©ã®é¢æ°ã次ã®ããã«äœ¿çšããã®ã¯å±éºã§ãïŒãprintfïŒmyStrïŒ;ãã 'myStr'å ã«ã³ã³ãããŒã«ä¿®é£Ÿåãååšããå Žåãããã°ã©ã ã¯æ³å®ãããŠããªããã®ãã¯ã©ãã·ã¥ããå¯èœæ§ã®ãããã®ãåºåããå ŽåããããŸãã
TortoiseSVNã®ã³ãŒããæ€èšããŠãã ããã
BOOL CPOFile::ParseFile(....) { .... printf(File.getloc().name().c_str()); .... }
蚺æã¡ãã»ãŒãžïŒV618ãã®ãããªæ¹æ³ã§ 'printf'é¢æ°ãåŒã³åºãã®ã¯å±éºã§ããæž¡ãããè¡ã«ã¯åœ¢åŒã®ä»æ§ãå«ãŸããŠããå¯èœæ§ãããããã§ãã å®å šãªã³ãŒãã®äŸïŒprintfïŒ "ïŒ s"ãstrïŒ; pofile.cpp 158
ãã¡ã€ã«åããmyfileïŒ sïŒ iïŒ s.txtãã®å Žåãçµæã¯æ²æšãªãã®ã«ãªããŸãã
ã泚æ printfïŒïŒé¢æ°ã䜿çšããããšã®å±éºæ§ã«ã€ããŠèå³æ·±ãã¡ã¢ããããŸã ã
é åã®èª€ã£ããŒãå
TortoiseSVNããããã¡ãŒã®å 容ããªã»ããããã«ãã®ãŸãŸã«ããŠããããšã®å±éºæ§ã¯ããããŸããã ããããäžè¬çã«å®å šã§ãã ãã ãããããã¡ããªã»ããããã³ãŒãããããŸãã ãŸããæ©èœããªããããèšåãã䟡å€ããããŸãã ãšã©ãŒã¯æ¬¡ã®ããã«ãªããŸãã
static void sha_mpint(SHA_State * s, Bignum b) { unsigned char lenbuf[4]; .... memset(lenbuf, 0, sizeof(lenbuf)); }
蚺æã¡ãã»ãŒãžïŒV597ã³ã³ãã€ã©ãŒã¯ããlenbufããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sshdss.c 23
é¢æ°ãçµäºããåã«ãé åãlenbufããã¯ãªã¢ããå¿ èŠããããŸãã ãã®åŸãé åã¯äœ¿çšãããªããªãããããªããã£ãã€ã¶ã¯ãmemsetãé¢æ°ã®åŒã³åºããåé€ããŸãã ãããé²ãã«ã¯ãç¹å¥ãªæ©èœã䜿çšããå¿ èŠããããŸãã
ã³ã³ãã€ã©ããmemsetïŒïŒãã®åŒã³åºããåé€ããä»ã®å ŽæïŒ
- sshdss.c 37
- sshdss.c 587
- sshdes.c 861
- sshdes.c 874
- sshdes.c 890
- sshdes.c 906
- sshmd5.c 252
- sshrsa.c 113
- sshpubk.c 153
- sshpubk.c 361
- sshpubk.c 1121
- sshsha.c 256
å¥åŠãª
BOOL InitInstance(HINSTANCE hResource, int nCmdShow) { .... app.hwndTT; // handle to the ToolTip control .... }
蚺æã¡ãã»ãŒãžïŒV607ææè ãªãã®è¡šçŸãapp.hwndTTãã tortoiseblame.cpp 1782
ã»ãšãã©ã®å Žåãé¢æ°ãInitInstanceïŒïŒãã§ã¯ãã¡ã³ããŒãhwndTTãã¯äœãã§åæåãããå¿ èŠããããŸãã ããããã¿ã€ããã¹ã«ãããã³ãŒãã¯äžå®å šã§ããããšãå€æããŸããã
64ããããšã©ãŒ
ç§ã¯ãšã©ãŒã®éåžžã«è¡šé¢çãªæ€çŽ¢ãè¡ããŸãã äžå¯§ã§ãèšäºãæžãã®ã«ååãªäŸããããŸãã ããããç§ã¯å¥ããŸããã ãããžã§ã¯ãã®äœæè ããç§ãã§ãããããåªããåæãå®è¡ããã ãã§ãã
64ããããšã©ãŒãããã«è¡šé¢çã«èŠãŸãã ãããžã§ã¯ãã®æ§é ãç¥ããã«ããã®ãšã©ãŒãŸãã¯ãã®ãšã©ãŒãçºçãããã©ãããå€æããããšã¯éåžžã«å°é£ã§ãã
å±éºãªå Žæãããã€ãã ã玹ä»ããŸãã
void LoginDialog::CreateModule(void) { .... DialogBoxParam(g_hmodThisDll, MAKEINTRESOURCE(IDD_LOGIN), g_hwndMain, (DLGPROC)(LoginDialogProc), (long)this); .... }
蚺æã¡ãã»ãŒãžïŒV220åãã£ã¹ãã®äžå¯©ãªã·ãŒã±ã³ã¹ïŒmemsize-> 32ãããæŽæ°-> memsizeã ãã£ã¹ããããå€ïŒ 'this'ã logindialog.cpp 105
ãããžã®ãã€ã³ã¿ãŒã¯ãlongåã«æ瀺çã«ãã£ã¹ããããŸãã 次ã«ãLPARAMåïŒLONG_PTRïŒã«æé»çã«å±éãããŸãã éèŠãªããšã¯ããã€ã³ã¿ãŒããã°ãããé·ããã«å€ããããšã§ãã ããã°ã©ã ã64ãããã®å Žåãããã¯æªãããšã§ãã ãã€ã³ã¿ãŒã¯64ããããå æããŸãã Win64ã®ãlongãåã¯ããŸã 32ãããåã§ãã ãã®çµæã64ãããå€æ°ã®æäžäœãããã倱ãããŸãã
ãªããžã§ã¯ããè¥ã4 GBã®RAMã®å€åŽã«äœæãããå Žåãããã°ã©ã ã¯äºæž¬äžèœã«ãªããŸãã ãã®ãããªã€ãã³ãã®å¯èœæ§ã¯ç¢ºãã«å€§ãããããŸãããããã®ãããªãšã©ãŒãåçŸããããšã¯éåžžã«å°é£ã§ãã
æ£ããã³ãŒãïŒDialogBoxParamïŒ....ãïŒLPARAMïŒthisïŒ;
å¥ã®å±éºãªãã£ã¹ããæ€èšããŠãã ããïŒ
static int cmpforsearch(void *av, void *bv) { Actual_Socket b = (Actual_Socket) bv; unsigned long as = (unsigned long) av, bs = (unsigned long) b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; }
蚺æã¡ãã»ãŒãžïŒV205ãã€ã³ã¿ãŒåãã32ãããæŽæ°åãžã®æ瀺çãªå€æïŒïŒç¬Šå·ãªãlongïŒavïŒ
- winnet.c 139
- winhandl.c 359
- winhandl.c 348
ãã€ã³ã¿ã¯æ瀺çã«ãunsigned longãåã«ãã£ã¹ããããå€æ°ãasãããã³ãbsãã«é 眮ãããŸãã ãã®å Žåãã¢ãã¬ã¹ã®äžäœãããã倱ãããå¯èœæ§ããããããæ¯èŒãæ£ããæ©èœããªãå ŽåããããŸãã äžè¬ã«ãããã§ãã€ã³ã¿ãæŽæ°åã«ãã£ã¹ããããçç±ã¯æ確ã§ã¯ãããŸããã ãã€ã³ã¿ãåçŽã«æ¯èŒã§ããŸãã
éæšå¥šã®ãã«ãã€ã³ã¿ãŒãã§ãã¯
ãnewãæŒç®åã¯ãã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãå Žåããã£ãšåã«NULLãè¿ããŸããã§ããã äŸå€std :: bad_allocãã¹ããŒããŸãã ãã¡ãããæŒç®å 'new'ã0ãè¿ãããã«ããããšãã§ããŸãããããã¯ä»ã§ã¯ç¡é¢ä¿ã§ãã
ããã§ãã次ã®ã³ãŒãã¯ããã°ã©ã å ã«ååšãç¶ããŸãã
int _tmain(....) { .... pBuf = new char[maxlength]; if (pBuf == NULL) { _tprintf(_T("Could not allocate enough memory!\n")); delete [] wc; delete [] dst; delete [] src; return ERR_ALLOC; } .... }
蚺æã¡ãã»ãŒãžïŒV668ãnewãæŒç®åã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãããããããpBufããã€ã³ã¿ãŒãnullã«å¯ŸããŠãã¹ãããŠãæå³ããããŸããã ã¡ã¢ãªå²ãåœãŠãšã©ãŒã®å ŽåãäŸå€ãçæãããŸãã
- subwcrev.cpp 912
- repositorybrowser.cpp 2565
- repositorybrowser.cpp 4225
- svnstatuslistctct.cpp 5254
- svnprogressdlg.cpp 2357
- bugtraqassociations.cpp 116
- xmessagebox.cpp 792
- xmessagebox.cpp 797
- hyperlink_base.cpp 166
- affixmgr.cxx 272
- hashmgr.cxx 363
- hashmgr.cxx 611
ãããŠããã¯è¡ã
ã³ãŒãã®åŠç¿äžã«çºçããå€ãã®ãšã©ãŒã«ã€ããŠã¯ãèšäºã«ã¯æžããŸããã äºå®ã¯ã圌ããããã°ã©ã ã«å¹²æžããªããšããããšã§ãã ä»åã¯ããã®ãããªã±ãŒã¹ãããã€ãæžãããšã«ããŸããã ããã°ã©ã ãæ£ããæžãããŠããããéã®ããã«æ©èœããªãç¶æ³ãèŠãã®ã¯ãšãŠãé¢çœãã§ãã
void CBaseView::OnContextMenu(CPoint point, DiffStates state) { .... popup.AppendMenu(MF_STRING | oWhites.HasTrailWhiteChars ? MF_ENABLED : (MF_DISABLED|MF_GRAYED), POPUPCOMMAND_REMOVETRAILWHITES, temp); .... }
蚺æã¡ãã»ãŒãžïŒV502ãããã 'ïŒïŒ'ãªãã¬ãŒã¿ãŒã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã®åªå é äœã¯ã|ããããäœã æŒç®åã baseview.cpp 2246
å€æ° 'oWhites.HasTrailWhiteChars'ã®å€ã«å¿ããŠãå®æ°ã®çµã¿åããã®1ã€ãå¿ èŠã§ãã
- MF_STRING | MF_ENABLED
- MF_STRING | MF_DISABLED | MF_GRAYED
ããããã³ãŒãã¯ãã®ããã«ã¯æ©èœããŸããã æäœã®åªå 床ã|ã æäœã®åªå 床ãïŒïŒããããé«ãã ããããããããããã«æ¬åŒ§ãä»ããŠããŸãã
ïŒMF_STRING | oWhites.HasTrailWhiteCharsïŒïŒ MF_ENABLEDïŒMF_DISABLED | MF_GRAYED
ãã®ã³ãŒãã¯ãå®æ°ãMF_STRINGãã0ã§ããããã«ã®ã¿æ£ããæ©èœããŸããçµæã«ã¯åœ±é¿ããŸããã ãã®çµæãééã£ãåŒãæ£ããæ©èœããŸãã
éã®å¥ã®äŸãèããŠã¿ãŸãããã TortoiseSVNã§ã¯ãHWNDã¿ã€ãã¯ã笊å·ãªããã¿ã€ããšããŠãã䜿çšãããŸãã ãã®ããã«ã¯ãæ瀺çãªåå€æãå®è¡ããå¿ èŠããããŸãã ããšãã°ã次ã®é¢æ°ã«ç€ºãããã«ïŒ
HWND m_hWnd; UINT_PTR uId; INT_PTR CBaseView::OnToolHitTest(....) const { .... pTI->uId = (UINT)m_hWnd; .... } UINT_PTR idFrom; HWND m_hWnd; BOOL CBaseView::OnToolTipNotify( UINT, NMHDR *pNMHDR, LRESULT *pResult) { if (pNMHDR->idFrom != (UINT)m_hWnd) return FALSE; .... }
ãŸãã¯ãããšãã°ãHWNDåã®å€æ°ã®å€ã¯ã 'long'åã§ãããã®ããã«åºåãããŸãã
bool CCommonAppUtils::RunTortoiseProc(....) { .... CString sCmdLine; sCmdLine.Format(L"%s /hwnd:%ld", (LPCTSTR)sCommandLine, AfxGetMainWnd()->GetSafeHwnd()); .... }
æ£åŒã«ã¯ããã®ã³ãŒãã¯æ£ãããããŸããã å®éã«ã¯ãã¿ã€ã 'HWND'ã¯ãã€ã³ã¿ãŒã§ãã ããã¯ã32ãããæŽæ°åã«å€æã§ããªãããšãæå³ããŸãã ãããŠãPVS-Studioã¢ãã©ã€ã¶ãŒã¯ãããå¿é ããŠãããèŠåãçºããŸãã
ããããèå³æ·±ãã®ã¯ããã®ã³ãŒããå®å šã«æ£ããæ©èœããããšã§ãïŒ
HWNDåã¯ãããŸããŸãªã·ã¹ãã ãªããžã§ã¯ããæäœããããã«Windowsã§äœ¿çšãããèšè¿°åãæ ŒçŽããããã«äœ¿çšãããŸãã åãã¿ã€ãã¯ããã³ãã«ãHMENUãHPALETTEãHBITMAPãªã©ã§ãã
èšè¿°åã¯64ããããã€ã³ã¿ãŒã§ãããäºææ§ãé«ããããïŒããšãã°ã32ãããããã»ã¹ãš64ãããããã»ã¹éã®çžäºéçšæ§ã®ããïŒãäžäœ32ãããã®ã¿ã䜿çšããŸãã 詳现ã«ã€ããŠã¯ãã Microsoftã€ã³ã¿ãŒãã§ã€ã¹å®çŸ©èšèªïŒMIDLïŒïŒ64ãããããŒãã£ã³ã°ã¬ã€ã ãïŒUSERããã³GDIãã³ãã«ã¯ç¬Šå·æ¡åŒµ32bå€ïŒãåç §ããŠãã ããã
HWNDåã32ãããåã«é 眮ãããšããéçºè ã¯ãããã®ä»®å®ã«ã»ãšãã©åºã¥ããŠããŸããã§ããã ã»ãšãã©ã®å Žåãããã¯Windows APIéçºè ã®å¹žéãšåªåã®ããã«ãæ£ããåäœããããŸãããããªã³ãŒãã§ã¯ãããŸããã
ãããã«
éçºäžã¯éç解æãå®æçã«äœ¿çšããŠãã ãããåæ段éã§å€ãã®ãšã©ãŒãèŠã€ãããŸãã åœç¶ãæåã«PVS-Studioã³ãŒãã¢ãã©ã€ã¶ãŒãç解ããããšããå§ãããŸãã ãã ããä»ã«ãå€ãã®åªããã³ãŒãã¢ãã©ã€ã¶ãŒããããŸãã éçã³ãŒãåæããŒã«ã§ãã
åç §è³æ
èšäºã«èšèŒãããŠãã埮åŠãªç¹ã®ããã€ããæ確ã«ããè¿œå ã®ãªã³ã¯ã
- ç¥èããŒã¹ã ã¡ã¢ãªã®äžæžã-ãªãã§ããïŒ
- ããã¥ã¡ã³ããŒã·ã§ã³ V668 ãnewãæŒç®åã䜿çšããŠã¡ã¢ãªãå²ãåœãŠããããããnullã«å¯ŸããŠãã€ã³ã¿ãŒããã¹ãããŠãæå³ããããŸããã
- ç¥èããŒã¹ã 64ãããããã°ã©ã ã§intã«ãã€ã³ã¿ãæ£ãããã£ã¹ãããæ¹æ³ã¯ïŒ
- ã«ã«ããã»ã¢ã³ãã¬ã€ããšãã²ããŒã»ãªãºã³ãã 64ãããC / C ++ã¢ããªã±ãŒã·ã§ã³ã®éçºã®ããã®ã¬ãã¹ã³ ã