æè¿ã§ã¯ãcppcheckãXorgãããžã§ã¯ãã®è匱æ§ã®çºèŠã«åœ¹ç«ã¡ãŸãã ãXorgãããžã§ã¯ãã¯23幎è¿ãååšããŠããŸããã 圌ã¯ãã§ã«äžçäžã®äœå人ãã®ããã°ã©ããŒãæ¯æŽããŠããŸãããå ¬åŒãŠã§ããµã€ãã§ã¯ãããã°ã©ã ã§cppcheckã䜿çšããŠçºèŠãããè匱æ§ã«é¢ããæ å ±ãèŠã€ããããšãã§ãããã®ãªã¹ãã¯åžžã«å¢ãç¶ããŠããŸãã ãããã£ãŠãåžžã«ã©ãã§ãcppcheck ã䜿çšããå¿ èŠãããçç±ãç¥ãããå Žåã¯ãcatãèŠæ±ããŸãã
Cppcatããã³cppcheck
ãã®ãªã¯ãšã¹ãã¯ã³ã¡ã³ãã§ç¹°ãè¿ãè¡šæãããŠããããããããã®ãŠãŒãã£ãªãã£ãæ¯èŒããããšããå§ããŸãã CppCatéçºè ã¯ãã§ã«ãã®ãããªæ¯èŒãè¡ã£ãŠããŸãïŒPVS-Studioã䜿çšïŒãããã以æ¥å€§éã®æ°ŽãæµããPVS-StudioïŒãPVSã®äŸ¡æ ŒãååŸããããã«ç§ãã¡ã«æžããŠãã ãã-ã¹ã¿ãžãªãèå³æ·±ãã©ã€ã»ã³ã¹ã¿ã€ããæå®ããŠãã ãããïŒïŒã·ã³ã°ã«ããã°ã©ãåãã§ã¯ãããŸããã cppcheckãšåæ§ã«ãCppCat
ãããã®ã¢ãã©ã€ã¶ãŒã®æ¯èŒã¯ç°¡åã§ã¯ãããŸããã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; }
ããããããã ãã§ã¯ãããŸããã å®éã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é¢æ°ã§è¡ããããããç§ã®æèŠã§ã¯ããã®ã±ãŒã¹ã«é¢ããè°è«ããããŸãã
//[npp.6.5.3.src/PowerEditor/src/WinControls/AnsiCharPanel/ansiCharPanel.h:46]: (warning) Member variable 'AnsiCharPanel::_ppEditView' is not initialized in the constructor. class AnsiCharPanel : public DockingDlgInterface { public: AnsiCharPanel(): DockingDlgInterface(IDD_ANSIASCII_PANEL) {}; void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { DockingDlgInterface::init(hInst, hPere); _ppEditView = ppEditView; }; virtual void display(bool toShow = true) const { DockingDlgInterface::display(toShow); }; void setParent(HWND parent2set){ _hParent = parent2set; }; void switchEncoding(); void insertChar(unsigned char char2insert) const; protected: virtual BOOL CALLBACK AnsiCharPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); private: ScintillaEditView **_ppEditView; ListView _listView; };
å€æ°ã®åæåã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªãã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 // SC_EOL_CR extraEOLLength = 1;
ïŒ ã¹ã¿ã€ã« ïŒç¬Šå·ãªãå€æ° '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ãåæããå¿ èŠããããŸããã