C ++ã³ãŒãã®éçåæ
ã«é¢ãã æè¿ã®
å€ã ã® èšäºãèžãŸããŠããŠãŒã¶ãŒã¯
cppcheckã¢ãã©ã€ã¶ãŒã«ç¹°ãè¿ãèå³ãæã£ãŠããŸãã ããã¯æ¯èŒçæ°ãããªãŒãã³ãœãŒã¹ã®éçè§£æãããžã§ã¯ãã§ãããäž»ã«ã³ãŒãå
ã®å®éã®ãšã©ãŒãæå°éã®èª€æ€ç¥ã§èŠã€ããããšã«çŠç¹ãåœãŠãŠããŸãã
æè¿ã§ã¯ãcppcheckãXorgãããžã§ã¯ãã®è匱æ§ã®çºèŠã«åœ¹ç«ã¡
ãŸãã ãXorgãããžã§ã¯ãã¯23幎è¿ãååšããŠããŸããã 圌ã¯ãã§ã«äžçäžã®äœå人ãã®ããã°ã©ããŒãæ¯æŽããŠããŸãããå
¬åŒãŠã§ããµã€ãã§ã¯ãããã°ã©ã ã§cppcheckã䜿çšããŠ
çºèŠãããè匱æ§ã«é¢ããæ
å ±ãèŠã€ããããšãã§ãããã®ãªã¹ãã¯åžžã«å¢ãç¶ããŠããŸãã ãããã£ãŠãåžžã«ã©ãã§ãcppcheck
ã䜿çš
ããå¿
èŠãããçç±ãç¥ãããå Žåã¯ãcatãèŠæ±ããŸãã
Cppcatããã³cppcheck
ãã®ãªã¯ãšã¹ãã¯ã³ã¡ã³ãã§ç¹°ãè¿ã衚æãããŠããããããããã®ãŠãŒãã£ãªãã£ãæ¯èŒããããšããå§ããŸãã CppCatéçºè
ã¯ãã§ã«ãã®ãããªæ¯èŒã
è¡ã£ãŠããŸãïŒPVS-Studioã䜿çšïŒãããã以æ¥å€§éã®æ°ŽãæµããPVS-StudioïŒãPVSã®äŸ¡æ ŒãååŸããããã«ç§ãã¡ã«æžããŠãã ãã-ã¹ã¿ãžãªãè峿·±ãã©ã€ã»ã³ã¹ã¿ã€ããæå®ããŠãã ãããïŒïŒã·ã³ã°ã«ããã°ã©ãåãã§ã¯ãããŸããã cppcheckãšåæ§ã«ãCppCat
ã¯èª°ã§ãã¢ã¯ã»ã¹ã§ããŸã ïŒç¹å®ã®ããŒãžã§ã³ãVisualStudioã«ãã€ã³ãããããã®äºçŽãš1幎éã®ã©ã€ã»ã³ã¹ãå¿
èŠã§ãïŒã
ãããã®ã¢ãã©ã€ã¶ãŒã®æ¯èŒã¯ç°¡åã§ã¯ãããŸãããLinuxçšã®Visual Studioã®ããŒãžã§ã³ã¯æå
ã«ãããŸããã ãããã£ãŠããŸã
ãæè¿ã®CppCatã¬ãã¥ãŒã§æ¢ã«åæã
ããã³ãŒãã®åæ
ã«éå®ããŸã ãcppcheckãNotepad ++ã«èšå®ããæ¢ã«æºåãããCppCatåæãšæ¯èŒã§ãããšã©ãŒ/èŠåã®çµ±èšãæäŸããŸãã
䞊è¡ããŠãä»®æ³ãã·ã³ã«CppCatãã€ã³ã¹ããŒã«ããããšããŠããŸãã Visual Studio 2010ãã€ã³ã¹ããŒã«ãããåŸãã€ã³ã¹ããŒã©ãŒã¯æ¬¡ã®ããšãäºåºŠãšèããã«çæãããšèšããªããã°ãªããŸããïŒ

ãã®ãããfind-install-Visual-Studio-2013-reinstall-IE-11-reboot-updateã¯ãšã¹ãã«ãã£ãŠãã¹ããè€éã«ãªããã¢ããããŒãã®è² æ
ã®ãªãä»®æ³ãã·ã³ã§æ£ç¢ºã«åæ¥ããããŸããã
çµæã¯äœã§ããïŒ Notepad ++ãããžã§ã¯ããéããšãVisual StudioãããªãŒãºããŸãã æ°ãããããžã§ã¯ããäœæããããšãããšãCppCatåæã§ããããŒãã¡ã€ã«ãèŠã€ãããªããšãããšã©ãŒãçºçããŸããã ãããã£ãŠãåã®èšäºã§èª¬æããå
å®¹ãšæ¯èŒããå¿
èŠããããŸãã Visual Studioãã»ãŒåããŠäœ¿çšããŸãããã䜿ããããã®å¹æã¯æãââãã§ãã
æºåãã
cppcheckã¯ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ããããã誰ãgitaããææ°ããŒãžã§ã³ãããŠã³ããŒãããŠèªåã§ã³ã³ãã€ã«ããå¿
èŠã¯ãããŸããã Cppcheckã¯éçºè
ã察象ãšããŠããããããœãŒã¹ã³ãŒãããããã°ã©ã ãã³ã³ãã€ã«ããŠãåé¡ã¯çºçããŸããã
unzip cppcheck-master.zip cd cppcheck-master make
ã§ãã å
·äœçã«ã¯ãgitaããææ°ããŒãžã§ã³ãåãåºããŠå¥ã®ãã©ã«ããŒã«å
¥ããŸãããå°æ¥çã«ã¯cppcheckã倧å¹
ã«æ¹åããã³ã«ã¹ã¿ãã€ãºã§ãããããäœæ¥ãç°¡åã«ãªããŸãã
ãã¹ãæ§æïŒRHEL 6.1ãi5-2400 @ 3.10GHzããã»ããµãŒïŒã¢ãã©ã€ã¶ãŒã©ã³ã¿ã€ã ã®è©äŸ¡çšïŒã
ã¢ã¯ã·ã§ã³ã®ããã®äŸ¿å©ãã¯ã³ãã³ãã©ã€ã³ã§è¡ãããŸã-å¿
èŠã«å¿ããŠãããããç¹°ãè¿ãããšãã§ããŸãïŒLinuxã§ã¯:)ã ãã¡ãããcppcheckã«ã¯äžè¬çãªIDEçšã®ãã©ã°ã€ã³ãããã€ããããŸããã仿¥ã§ã¯ããã§ã¯ãããŸããã
ã¡ã¢åž³++åæ
cppcheckã¯ããã¹ãŠã®ã¢ã©ãŒããã«ããŽãªã«åé¡ãããããã«èšèšãããŠããŸãã ããã©ã«ãã§ã¯ã1ã€ã®ã¿ã€ãã®åæã®ã¿ãæå¹ã«ãªã£ãŠããŸã-ãšã©ãŒã ãšã©ãŒã¯ç¡èŠã§ããŸãããcppcheckããšã©ãŒãè¿ããå Žåã99ïŒ
ã®ã±ãŒã¹ã§ãã®å Žæãæžãæããå¿
èŠãããããã§ãã cppcheckã®äž»ãªåé¡ã¯ãã¡ã¢ãªãªãŒã¯ãšãããã¡ãªãŒããŒãããŒã§ããããã¯ãã§ã«äŸ¡å€ããããŸãã
åççãªçåãçããå ŽåããããŸã-notepad ++ãWInAPIã®ã¿ã䜿çšããå ŽåãLinuxãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§notepad ++ãåæããæ¹æ³ã¯ïŒ çãã¯ç°¡åã§ããç§ã®ã¡ã¢ãªå
ã®cppcheckã¯
ããã«ãç°å¢ãŸãã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«é¢é£ä»ããããŠããªãå¯äžã®ã¢ãã©ã€ã¶ãŒã§ãã ç¬èªã®ã¬ãã·ã«ã«ã¢ãã©ã€ã¶ãŒã䜿çšãããã¹ãŠã®ããããŒãã¡ã€ã«ã®ååšãå¿
èŠãšãããã¯ã©ã¹ãªã©ã®è€éãã«å¿ å®ã§ãããã®ãã°ãããããããã£ã«ãããcppcheckãã©ãã§ã䜿çšã§ããŸãã ã
Cppcheckåæã¯äžåèªã«ç°¡åã§ãïŒ
./cppcheck-master/cppcheck -q -j4 npp.6.5.3.src/
æãåçŽãªåæã¯ãã®ãŸãŸäœ¿çšã§ããŸãã ãã®ã³ãã³ãã¯ã2ã€ã®ãã©ã¡ãŒã¿ãŒ-qïŒããµã€ã¬ã³ããã¢ãŒã-ç»é¢ã«é²è¡ç¶æ³ã衚瀺ããªãïŒãš-j4-ããã»ããµãŒã³ã¢ã®æ°ã«ãã4ã¹ã¬ããã®ãã«ãã¹ã¬ããåæãå®çŸ©ããŸãã
åã®ã³ãã³ãã®çµæïŒ
[npp.6.5.3.src/PowerEditor/src/tools/ChangeIcon/ChangeIcon.cpp:214]: (error) Mismatching allocation and deallocation: resData [npp.6.5.3.src/PowerEditor/src/tools/ChangeIcon/ChangeIcon.cpp:216]: (error) Mismatching allocation and deallocation: resData [npp.6.5.3.src/scintilla/lexers/LexBash.cxx] -> [npp.6.5.3.src/scintilla/lexers/LexBash.cxx:194]: (error) Internal error. Token::Match called with varid 0. Please report this to Cppcheck developers
皌åæé-5åã ãšã©ãŒãïŒerrorïŒInternal errorãToken :: Match called with varid0ããããCppcheckéçºè
ã«å ±åããŠãã ããããšãããšã©ãŒãããã«ç®ã«å
¥ããŸãã ããã¯ãåæãããããã°ã©ã ã®ãã°ã®ä»£ããã«ãã¢ãã©ã€ã¶ãŒèªäœã«ãã°ããã£ãããšãæå³ããŸã:)ãããžã§ã¯ããWinçšã«èª¿æŽãããŠãããcppcheckã¯DWORDãLPTRãªã©ã®æå³ãçã£ãŠããŸããã ã
å®éã«ã¯ããã£ã1ã€ã®ãã¹ïŒ2è¡ã®éãïŒããããŸããã æªãã¯ãããŸããããããããã¡ã¢åž³++ã®äœæè
ã¯cppcheckèªäœã䜿çšããŠããŸãã cppcheckãäžå¯©ã«ããã³ãŒãã®äžéšïŒ
BYTE* resData = new BYTE[cbRes]; LPBYTE writePtr = resData; ... if(!UpdateResource(hUpdate, RT_GROUP_ICON, lpResName, resLangId, resData, cbRes)) { _tprintf(_T("Unable to update icon group\n")); delete resData; return false; } IFDEBUG( _tprintf(_T("Updated group %d (lang %d)\n"), lpResName, resLangId); ) delete resData; }
ççŽã«èšã£ãŠããœãŒã¹ã¯è¡æçã§ãããåœéœæ§ã®ããã«èŠããŸãã UPDïŒããã¯æªå®çŸ©ã®åäœã§ãããdelete []æŒç®åã䜿çšããŠé
åãè§£æŸããå¿
èŠããããŸãã
ããããããã ãã§ã¯ãããŸããã å®éãcppcheckã®ã¢ãããŒã¯èª€æ€ç¥ããªãããšã§ããã€ãŸããããã©ã«ãã§ã¯ãã¹ãã£ããŒã¯éåžžã«é倧ãªãšã©ãŒïŒãããã¡ãŒãªãŒããŒãããŒãã¡ã¢ãªãªãŒã¯ïŒã®ã¿ãæ€çŽ¢ããŸãã ãã¹ãŠã®ãšã©ãŒãèŠã€ãã£ãããèŠåãã©ã°ãæå¹ã«ããŠåã¹ãã£ã³ã§ããŸãã
./cppcheck-master/cppcheck -q -j4 --enable=performance,portability,warning,style npp.6.5.3.src/ 2> npp.out
--enableãã©ã¡ãŒã¿ãŒã䜿çšãããããã«ã¯ãã§ãã¯ã®ã«ããŽãªãŒãå«ãŸããŸãã
-ããã©ãŒãã³ã¹-ããã©ãŒãã³ã¹ã®åé¡ã
-ç§»æ€æ§-äºææ§ã®åé¡ã
-èŠå-èŠå-äžå¯©ãªããã°ã©ã ã®å Žæã
-ã¹ã¿ã€ã«-ããã°ã©ãã³ã°ã¹ã¿ã€ã«ãšã©ãŒã
ãã®ã¢ãŒãã§ã¯ãæäœç/è«ççãšã©ãŒãšæœåšçãªãã°ïŒã€ãŸããcppcheckããäžæãã§ãããšã©ãŒïŒã®å€§éšåããã£ãããããŸãã ã¹ãã£ã³æé-5åã çµæãããã«ãã¡ã€ã«ã«éä¿¡ããŠãçµ±èšãåéããŸããã
åèšã¡ãã»ãŒãžïŒ
wc -l < npp.out 379
èŠã€ãã£ããšã©ãŒã®ã¿ã€ãã«é¢ããå°ããªçµ±èšïŒ
tr '()' '*' < npp.out | cut -d* -f2 | sort | uniq -c 3 error 39 performance 14 portability 211 style 112 warning
ã¡ãã»ãŒãžçµ±èš sort -t] -k2 npp.out | grep -v '(error)' | cut -d\) -f2- | sed "s/'[^']*'/%{VAR}/g" | sort | uniq -c | sort -n 1 Function parameter %{VAR} should be passed by reference. 1 memset() called to fill 0 bytes of %{VAR}. 1 scanf without field width limits can crash with huge input data. 1 The class %{VAR} does not have a constructor. 1 Unused variable: ent 1 Unused variable: loc 2 Array index %{VAR} is used before limits check. 2 Checking if unsigned variable %{VAR} is less than zero. 2 Found duplicate branches for %{VAR} and %{VAR}. 2 The class %{VAR} defines member variable with name %{VAR} also defined in its parent class %{VAR}. 2 Unsigned variable %{VAR} can't be negative so it is unnecessary to test it. 2 %{VAR} should return %{VAR}. 3 scanf without field width limits can crash with huge input data on some versions of libc. 4 Same expression on both sides of %{VAR}. 4 %{VAR} does not have a copy constructor which is recommended since the class contains a pointer to allocated memory. 5 Assignment of function parameter has no effect outside the function. 5 Ineffective call of function %{VAR}. Did you intend to call %{VAR} instead? 7 Consecutive return, break, continue, goto or throw statements are unnecessary. 11 Exception should be caught by reference. 11 The extra qualification %{VAR} is unnecessary and is considered an error by many compilers. 12 Variable %{VAR} is reassigned a value before the old one has been used. 22 Variable %{VAR} is assigned a value that is never used. 26 Variable %{VAR} is assigned in constructor body. Consider performing initialization in initialization list. 42 C-style pointer casting 98 Member variable %{VAR} is not initialized in the constructor. 108 The scope of the variable %{VAR} can be reduced.
åèš28ã®äžæã®ã¡ãã»ãŒãžã
ã倿°ïŒ
{VAR}ã®ã¹ã³ãŒããçž®å°ã§ããŸããããCã¹ã¿ã€ã«ãã€ã³ã¿ãŒãã£ã¹ãããã倿°ïŒ
{VAR}ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒæ¬äœã§å²ãåœãŠãããŸãããå€ãããã«æžãããã
倿°ã®æµ·ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããŸããïŒ
èŠå ïŒã¡ã³ããŒå€æ°ïŒ
{VAR}ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããŸããã ãã®ãšã©ãŒcppcheckã¯èŠåãèæ
®ããŸãã nppã¯äœããã®å¥è·¡ã«ãã£ãŠæ©èœããããããããããã®ãããªã³ãŒãã®åäœã¯ã³ã³ãã€ã©ã«äŸåããŸãã
äŸ
倿°ã®åæåã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªããinit颿°ã§è¡ããããããç§ã®æèŠã§ã¯ããã®ã±ãŒã¹ã«é¢ããè°è«ããããŸãã
ïŒ
ã¹ã¿ã€ã« ïŒ '||'ã®äž¡åŽã§åãåŒã åãæ¡ä»¶ã®æ€èšŒã CppCatã«ãã£ãŠåããšã©ãŒãçæãããŸãããããã®èšäºã§ã¯nppããŒãžã§ã³ãå€ããããšã©ãŒãæ¢ã«ä¿®æ£ãããŠããŸãããåãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
while (closeFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING) && searchStartPoint <= caret);
ãããŠãããã¯æ°ããcppcheckãã£ããã§ãïŒ
if (!(!commentLineSybol || !commentLineSybol[0] || commentLineSybol == NULL))
ïŒ
ããã©ãŒãã³ã¹ ïŒå€æ° 'lineIndent'ã«ã¯ãå€ãå€ã䜿çšãããåã«å€ãåå²ãåœãŠãããŸãã æ¬è³ªçã«ãäºéã®å²ãåœãŠã ããã¯éåžžãã³ããŒãšè²Œãä»ãã®çµæã§ãããcppckeckã¯ãã®ãããªãšã©ãŒãããã©ãŒãã³ã¹ãšã©ãŒãšããŠç¹åŸŽä»ããŸãã ãã®ã³ãŒãã¯ãã§ãã¯ãã䟡å€ããããŸããããã°ã©ã ã®äœè
ã®æå³ãããããªãããã§ãã ã³ãŒãã«ãã倿°ã®æªäœ¿çšå€ãšåæ§ã«ããã®ãããªäºéã®å²ãåœãŠã倿°ãããŸãã
int lineIndent = lineStart; ... lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i); _pEditView->getGenericText(linebuf, linebufferSize, lineIndent, lineEnd);
éåžžããã®èŠåã¯åœ¹ã«ç«ã¡ãŸãããã³ãŒãã®ç¹å®ã®ã»ã¯ã·ã§ã³ã«ãšã©ãŒãããå Žåããªãã¡ã¯ã¿ãªã³ã°äžã«å€ãå€ãåé€ããã®ãå¿ãããšããããšã¯ãŸãã§ãã
ïŒ
ç§»æ€æ§ ïŒè¿œå ã®ä¿®é£Ÿ 'FunctionListPanel ::'ã¯äžèŠã§ãããå€ãã®ã³ã³ãã€ã©ãŒã«ãã£ãŠãšã©ãŒãšèŠãªãããŸãã ç©ççã«å©çšã§ãããCppCatã§èšç»ãããŠããªãæçšãªèŠåïŒç°ãªããã©ãããã©ãŒã éã®ç§»æ€æ§ãšã©ãŒïŒç§»æ€æ§ïŒã ãã®ã³ãŒãã¯ããã¹ãŠã®ã³ã³ãã€ã©ã§æ©èœããããã§ã¯ãããŸããã
virtual BOOL CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
ãã®ãæ¿æ²»çã«æ£ãããã¡ãã»ãŒãžã¯ãå®éã«ã¯ãgccã³ã³ãã€ã©ã§æŸèæãªãã§ã¯ã³ãŒããæ§ç¯ã§ããªãããšãæå³ããŸãã ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®ãã©ãããã©ãŒã ã§å®è¡ããäºå®ãããå Žåãcppcheckã¯éåžžã«åœ¹ç«ã¡ãŸãã
ïŒ
ã¹ã¿ã€ã« ïŒäŸå€ã¯åç
§ã«ãã£ãŠãã£ããããå¿
èŠããããŸãã è峿·±ãèŠåã¯ãå€ã§ã¯ãªã
åç
§ã§
äŸå€ããã£ããããããšã§ãã
catch(std::exception e) { ::MessageBoxA(NULL, e.what(), "Exception", MB_OK); return -1; }
ïŒ
ã¹ã¿ã€ã« ïŒé£ç¶ããreturnãbreakãcontinueãgotoããŸãã¯throwã¹ããŒãã¡ã³ãã¯äžèŠã§ãã ãããã³ãŒãïŒãªã¿ãŒã³åŸãã¬ãŒã¯ïŒ
switch(lpnm->wID) { case REBAR_BAR_TOOLBAR: { ... return TRUE; break; } }
ïŒ
èŠå ïŒé¢æ°ãã©ã¡ãŒã¿ãŒã®å²ãåœãŠã¯ã颿°ã®å€éšã«ã¯åœ±é¿ããŸããã éåžžãããã¯ã¿ã€ããã¹ãç¥ããã䟿å©ãªèŠåã§ãã颿°å
ã§å²ãåœãŠãããå€ã¯ã©ãã«ãéä¿¡ãããŸããã ãã ããå€ã¯ã¯ã©ã¹å€æ°ã§ãããããããã¯æããã«èª€æ€ç¥ã§ãã
void SetValue( const TCHAR* _value ) { value = _value; }
ïŒ
ç§»æ€æ§ ïŒäžéšã®ããŒãžã§ã³ã®libcã§ã¯ããã£ãŒã«ãå¹
å¶éã®ãªãscanfã巚倧ãªå
¥åããŒã¿ã§ã¯ã©ãã·ã¥ããå¯èœ
æ§ããããŸãã scanfã䜿çšãããã®ç¿æ
£ã¯
ãå±éºãªãããã¡ãªãŒããŒãããŒãåŒãèµ·ããå¯èœæ§
ããããŸãã æ°å€å€æ°ã®å Žåãããã¯ç°¡åãªæªå®çŸ©ã®åäœã§ãã
if ( sscanf( value.c_str(), "%d", ival ) == 1 )
æ°å€ã倿ããã«ã¯ãå®å
šãªstrtolã䜿çšããããšããå§ãããŸãã
å¥ã®ä»£è¡šè
ïŒ
sscanf( wordBuffer, "%[^.<>|&=\\/]", sKeywordBuffer );
wordBufferãšsKeywordBufferãåããµã€ãºã§ãããšããçç±ã ãã§ããããã¡ãŒãªãŒããŒãããŒã¯ãããŸããã
ïŒ
ã¹ã¿ã€ã« ïŒãTiXmlStringA :: operator =ãã¯ãTiXmlStringAïŒããè¿ãå¿
èŠããããŸãã =æŒç®åã¯voidãè¿ããŸãã
void operator = (const TiXmlStringA & copy);
ãã®æŒç®åã§ã¯ãæšæºã®C ++ãã§ãŒã³ã䜿çšã§ããŸããã
a = b = c;
ïŒ
èŠå ïŒã¯ã©ã¹ãControlsTabãã¯ã芪ã¯ã©ã¹ãTabBarãã§ãå®çŸ©ãããŠããã_isVerticalããšããååã®ã¡ã³ããŒå€æ°ãå®çŸ©ããŸãã ã¯ã©ã¹å
ã®å€æ°ã®äºéå®çŸ©ã®ãšã©ãŒïŒ
class ControlsTab : public TabBar { public : ... private : ... bool _isVertical; };
芪ã¯ã©ã¹ã§ãã§ã«å®çŸ©ãããŠããŸãïŒ
class TabBar : public Window { ... protected: ... bool _isVertical; };
ããã®å°éå®¶ã§ã¯ãªãã®ã§ããããå¯èœãã©ããïŒä¿è·ããã/ãã©ã€ããŒãïŒããã«çããããšã¯ã§ããŸããã
ïŒ
ã¹ã¿ã€ã« ïŒ 'if'ãš 'else'ã®éè€ãã©ã³ããèŠã€ãããŸããã CppCatã§ãåæ§ã®ãšã©ãŒãèŠã€ãããŸããã è¿œå æ¡ä»¶ïŒ
if(eol_mode == SC_EOL_CRLF) extraEOLLength = 2; else if(eol_mode == SC_EOL_LF) extraEOLLength = 1; else
ïŒ
ã¹ã¿ã€ã« ïŒç¬Šå·ãªã倿° 'lenFile'ããŒãããå°ãããã©ããã確èªããŸãã åæ§ã®ã¡ãã»ãŒãžãCppCatã«ãã£ãŠçºè¡ãããŸããããwindows.hãã¡ã€ã«ãæ€åºããã«cppcheckãWPARAMãªã©ã®åãä»®å®ããªãã£ãããšãé€ããŸãã Windowså°çšã®æ¹åæ§ããªããšããæ¬ ç¹ããŸã ãããŸãã
size_t lenFile = 0; ... if (lenFile <= 0) break;
WindowsããããŒãã¡ã€ã«ãããå Žåã-Iãªãã·ã§ã³ã䜿çšããŠããããžã®ãã¹ãæå®ã§ãããšãããã«å€ãã®ãšã©ãŒãçºçããŸãã
ïŒ
ã¹ã¿ã€ã« ïŒå¶éãã§ãã¯ã®åã«é
åã€ã³ããã¯ã¹ 'j'ã䜿çšãããŸãã èŠåã®åªå
床ã¯äœãã«ãããããããèŠã€ãã£ããšã©ãŒã¯é
åã®å¢çãè¶
ããå±éºæ§ããããŸãã
int j; int ReturnValue; j=startcol; if(direction == 1){j++;} if(direction != 1){j--;} while((BGHS[SI].columnwidths[j] == 0)&&(j<=BGHS[SI].cols)&&(j>0))
startcolãã©ã¡ãŒã¿ãŒãå€éšã§ããå Žåã-1ã€ã³ããã¯ã¹ã¯ãã¡ããã®ããšãé
åã®å¢çããé£ã³åºãããšãã§ããŸãã
ïŒ
ã¹ã¿ã€ã« ïŒç¬Šå·ãªã倿° 'i'ãè² ã«ããããšã¯ã§ããªãããããã¹ãããå¿
èŠã¯ãããŸããã ã«ãŒãå
ã®æ¡ä»¶ã¯åžžã«æ£==ç¡éã«ãŒãã§ãã
for(unsigned int i = position_of_click; i >= 0; --i)
ãã®ãšã©ãŒã¯ãgccã³ã³ãã€ã©ãš-Wall -Wextraãã©ã°ã䜿çšããŠãããžã§ã¯ãããã«ããããšãã«åé¿ã§ããŸããã ãã®ãšã©ãŒã¯ããããžã§ã¯ããå¥ã®ã³ã³ãã€ã©ãšã©ãŒïŒã¿ã€ãã®äžäžèŽïŒã«ãªãã¡ã¯ã¿ãªã³ã°ãããšãã«ãã衚瀺ããããšæããŸãã ããã¯intã§ãã-ããã¯ç¬Šå·ãªãã«ãªããŸãããããã«çµæããããŸãã
è»œåŸ®ãªæ¬ é¥
ïŒ
ã¹ã¿ã€ã« ïŒæªäœ¿çšã®å€æ°ïŒentã ãã®èŠåã¯ã³ã³ãã€ã©ã§ãçºè¡ã§ããŸãããè峿·±ãããšã¯ãããŸããã
ïŒ
èŠå ïŒãã©ãŒãããæååïŒ2çªïŒã®ïŒ
dã«ã¯ãintããå¿
èŠã§ãããåŒæ°ã®åã¯ãDWORD {aka unsigned long}ãã§ã-éåžžã«äžè¬çãªãšã©ãŒã§ãprintfã®ããã°ã©ããŒã¯å€æ°ã®åãšäžèŽããªãåãèšè¿°ããŸãã ããã¯ãã»ãšãã©ã®ã³ã³ãã€ã©ã§ãèµ·åãããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãªãã¯ã©ã¹ïŒ
class CachedValue { generic_string fullname; int index; };
ïŒ
ããã©ãŒãã³ã¹ ïŒé¢æ°ãã©ã¡ãŒã¿ãŒ 'range'ã¯åç
§æž¡ãããå¿
èŠããããŸãã cppcheckã¯ãåŒæ°ãã³ããŒããªãããã«ãåç
§ã«ãã£ãŠãã©ã¡ãŒã¿ãŒãæž¡ãããšããå§ãããŸãã
XYScrollPosition XYScrollToMakeVisible(const SelectionRange range, const XYScrollOptions options);
ïŒ
èŠå ïŒé¢æ° 'emptyïŒïŒ'ã®ç¡å¹ãªåŒã³åºãã 代ããã«ãclearïŒïŒããåŒã³åºãã€ããã§ãããïŒ emptyã¡ãœããã¯æ¡ä»¶å
ã§ã®ã¿æå³ããããè¡ãã¯ãªã¢ããŸããã ããã¯èª€æ€ç¥ã§ãããcppcheckã¯äœæè
ãç¬èªã®Stringã¯ã©ã¹ãäœæããããšãçããŸããã§ãã:)ã¡ãœããã®åœåããžãã¯ã確èªããå¿
èŠããããŸãã
ïŒ
ã¹ã¿ã€ã« ïŒ 'class ByteArray'ã«ã¯ãã¯ã©ã¹ã«å²ãåœãŠãããã¡ã¢ãªãžã®ãã€ã³ã¿ãå«ãŸãããããæšå¥šãããã³ããŒã³ã³ã¹ãã©ã¯ã¿ããããŸããã cppcheckã¯ãããã°ã©ããå®è£
ãå¿ããå Žåã«åããŠãã¯ã©ã¹ã«æ¬ èœããŠããã³ããŒã³ã³ã¹ãã©ã¯ã¿ãäœæããããšãæšå¥šããŠããŸãã
ãããã«
ã©ã¡ãã®ã¢ãã©ã€ã¶ãŒãããªãã®éã®ãšã©ãŒãæ€åºãããããã®å€ãã¯åã¢ãã©ã€ã¶ãŒã«åºæã®ãã®ã§ãã äžè¬ã«ããªãŒãã³ã§ã¯ãã¹ãã©ãããã©ãŒã ã§ããããã°ãèŠã€ããŠããã°ã©ãã³ã°ã¹ã¿ã€ã«ã®æ¹åã«åœ¹ç«ã€ãããåžžã«cppcheckãæå
ã«çœ®ããŠãããšããã§ãããã éåžžãcppcheckã䜿çšããŠãåé¡ã¯ãããŸããã
ãã®åæãããããŒã«ã¯äºãã«è£å®ãåããšçµè«ä»ããããšãã§ããŸãã äžéšã®äººã«ãšã£ãŠãcppcheckã®äž»ãªæ¬ ç¹ã¯Visual Studioã®ãã©ã°ã€ã³ããªãããšã§ãããã®ãããcppcheckã®äœæè
ã¯PVS-Studioã詊ããŠã¿ãããšããå§ãããŸãã ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã«ãããããããcppcheckã®äœ¿çšã¯éåžžã«äŸ¿å©ã§ãã ã³ã³ãã€ã©ãIDEãããããŒãã¡ã€ã«ãå¿
èŠãããŸãããããã¯ããããŸã§èŠãäžã§æã䜿ããããéçã¢ãã©ã€ã¶ãŒã§ãã ããã«ãä»®æ³ãã·ã³ã«Windowsçšã®cppcheckã¢ã»ã³ããªãç¹å¥ã«ã€ã³ã¹ããŒã«ããŸãã-çŽ æŽãããã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ããããè¿
éã«ã€ã³ã¹ããŒã«ããŠãåé¡ãªãåæãå®è¡ããŸãã

åæçµæãXMLã«ãšã¯ã¹ããŒãããŠããã©ãŠã¶ãŒã§è¡šç€ºã§ããŸãã
äž¡æ¹ã®ãããžã§ã¯ãã§éçºã®æåãé¡ãã¹ãã§ã-ãããã¯æ¬åœã«éåžžã«å¿
èŠãªããã°ã©ã ã§ãã ãããŠãä»ããcppcheckéçºã«åå ã§ããŸãããããžã§ã¯ãããã§ãã¯ããèŠã€ãã£ããšã©ãŒãŸãã¯èŠã€ãããªããšã©ãŒã«ã€ããŠcppcheckéçºè
ã«æžã蟌ã¿ããã°ãå ±åããæçšãªããã
ãgithubã«éä¿¡ããŸãã æè¿ãŸã§cppcheckãifïŒmallocïŒïŒïŒãšã©ãŒãèŠã€ããããšãã§ããªãã£ãå Žåãã¡ã¢ãªãªãŒã¯ã«é¢ããã¡ãã»ãŒãžã泚ãã§ããã ãã§ã-ç«¶åã®çµæã¯æããã§ãã
cppcheckã§ããããŒãã¡ã€ã«ãæ¢ãå Žæãæç€ºçã«æå®ãããšããã®åæã¯å€§å¹
ã«æ¹åãããå¯èœæ§ããããŸãã颿°ã¯ã¡ã¢ãªãå²ãåœãŠããè§£æŸãããããŸãã èšäºã倧ãããªã£ããããç¹å®ã®ãããžã§ã¯ãçšã«cppcheckãæ§æããåæã®å質ãåäžãããcppcheckã®ã«ãŒã«ãç¬èªã«äœæããæ¹æ³ïŒæ¬¡åïŒã
PSãã³ã»ã³ã¹ãèš±ããŠãã ããã Cppcheckã®èšå®ã«ã¯ãWindowså°çšã®ã³ãŒããåæããæ©èœããããŸãããã®ãããå€ãã®è峿·±ããšã©ãŒãèŠéãããŠããŸããã ãã©ã°--platform = win32Aã䜿çšããŠnppãåæããå¿
èŠããããŸããã