éçåææ¥çã®ãªãŒããŒããã³ã€ã³ã¹ãã¬ãŒã·ã§ã³ãšããŠèªç¥ãããŠããç§ãã¡ïŒGimpel SoftwareïŒã¯ãããŒã«ã®éçºã«ãããå質åºæºãšããŠãä»ã®äŒæ¥ãåœç€Ÿã®è£œåã«å°ãããŠããããšãåãã§ããŸãã éåžžãåœç€Ÿã®ã¢ãã©ã€ã¶ãŒãšä»ã®è£œåãšã®æ¯èŒçµæã«é¢ããåºçç©ã«äœããã®åœ¢ã§å¯Ÿå¿ããå¿ èŠã¯ãªããšèããŠããŸãããGrammatechããªãªãŒã¹ããCodeSonarãšPC-lintããŒã«ãæ¯èŒããããšãã¹ããŒãã¬ããŒããã¯éåžžã«äžå¿«ãªäŸå€ã§ããããšãå€æããŸããã ãã®ããã¥ã¡ã³ãã®èè ã¯ã補åã®ã¡ãªããã«çŠç¹ãåœãŠã代ããã«ãPCãªã³ããšãã®æè¡çèœåã®äžå®è¡šç€ºã«é¢ããèåœã®é³è¿°ã«é ŒããŸãããããã¯ããããåžå Žããã®å§åã®çµæã§ããããã®åã«å¯Ÿå¿ãã矩åããããšèããŠããŸããå®éã®ç¶æ³ã«ã€ããŠè©±ããŸãã
PC-lintã«ã€ããŠ
PC-lintã¯ãCããã³C ++ã§ã®éçã³ãŒãåæã®ããã®éçºè ã®éã§å¹æçã§å°æ¬ãããããŒã«ã§ãã 1985幎ã«Gimpel Softwareã«ãã£ãŠäœæããããã以æ¥ç¶ç¶çã«éçºãããŠããŸãã ãã®30幎éãPC-lintã¯æ¥çã®ãªãŒããŒã§ããããŠãŒã¶ãŒã«é©æ°çãªæ©èœãæäŸããŠããŸããããšãã°ãæ©èœãšããã°ã©ã ã¢ãžã¥ãŒã«éã移åãããšãã«ããŒã¿ã远跡ããã¡ã«ããºã ãå³å¯ãªåãã§ãã¯ãšæ¬¡å åæããŠãŒã¶ãŒå®çŸ©ã®æ©èœã®ãµããŒããªã©ã§ãã PC-lintã¯ãäœäžäººãã®éçºè ãæè¡ç®¡çã®å°é家ããã¹ã¿ãŒãæ³å»åŠã®å°é家ããä¿¡é ŒãããŠããŸãã å€æ°ã®ã³ã³ãã€ã©ãšãã©ãããã©ãŒã ããµããŒãããå€ãã®è¿œå ãªãã·ã§ã³ãæäŸããŸãã PC-lintã¯ãå»çãèªåè»ç£æ¥ãªã©ãå®å šæ§ãèŠæ±ãããåéãå«ããã»ãŒãã¹ãŠã®æ¥çã§äœ¿çšãããŠããŸãã
ã°ã©ãããã¯ã¬ããŒãã«ã€ããŠ
ãCodeSonarãšPC-lintïŒããã³åæ§ã®ããŒã«ïŒãšã®æ¯èŒæ¹æ³ããšããã¿ã€ãã«ã®å°é家ã¬ããŒãã¯ãGrammatech Webãµã€ãã§å ¥æã§ããŸãã ãã®ããã¥ã¡ã³ãã¯ãCodeSonarãšPC-lintããŒã«ãæ¯èŒããçµæã®ä¿¡é Œæ§ã®é«ããã¬ãŒã³ããŒã·ã§ã³ãæäŸãããšäž»åŒµããŠããŸãïŒä»ã®ã¢ãã©ã€ã¶ãŒã«ã€ããŠãèšåããŠããŸãããäž»ãªéç¹ã¯PC-lintã«ãããŸãïŒããå®éã«ã¯ãå®éã®äºå®ã«ãã£ãŠãµããŒããããŠããªãèªå·±å¥ä»ã®èåœã®ã¹ããŒãã¡ã³ãã«ãããŸããèªè ã誀解ãããããã«èšèšãããŠããŸãã ãããã®èåœã®äž»åŒµã«åºã¥ããŠãã¬ããŒãã®èè ã¯ãPC-lintã®ããã«CodeSonar補åã奜ãŸãã芳ç¹ããæ瀺ããããšããŠããŸãã
åè«èšç»
PC-lintãäžå·ããããšããŠãããã¥ã¡ã³ãã®äœæè ã¯ç¹å®ã®æŠè¡ã«é ŒããŸãã
- 圌ãã¯ãPC-lintã®æè¡çæ段ãšæ©èœãPC-lintã®ååšäžã«å®éã«ã¯çºå±ããªãã£ããšããä»®å®ã«åºã¥ããŠæšè«ãè¡ã£ãŠããŸãã
- 圌ãã¯æå³çã«PC-lintã®ã¿ã¹ã¯ãšæ©èœã誀解ããŠããŸãã
- PC-lintã®èšºææ©èœã«ã€ããŠèåœã®äž»åŒµãããã
ãããã®ã¹ããŒãã¡ã³ãã®æ€èšãšåè«ã¯ããã®èšäºã®2ã€ã®ã»ã¯ã·ã§ã³ã«åœãŠãããŸãã ãAccusationsãã»ã¯ã·ã§ã³ã§ã¯ãã¬ããŒãã®éèŠãªèŠå®ãæ€èšŒããŸããããã®ã»ãšãã©ã¯ãããªã蚌æ ã«ãè£ä»ããããŠããããäºå®ãæäŸããŸãã ãäŸã«ããäºå®ã®æªã¿ãã»ã¯ã·ã§ã³ã§ã¯ãèè ã«ãããšãPC-lintã䜿çšããŠæ€åºã§ããªããšã©ãŒãå«ãã¬ããŒãã§äœ¿çšãããã³ãŒãäŸãæ€èšãããããã®ãã©ã°ã¡ã³ãã®åæçµæã§ããŒã«ã®å®éã®èšºæã¡ãã»ãŒãžã衚瀺ããŸãã ãã®ã¬ããŒãã«ã¯ãããã€ãã®åççãªæ¹å€ãå«ãŸããŠããŸãã察å¿ããã»ã¯ã·ã§ã³ã§ããããæ€èšããŸãã
åçº
ã°ã©ãããã¯ã®ã¬ããŒãã¯ã次ã®ãããªãããªãææ§ã§æ¥µããŠäžæ£ç¢ºãªäžé£ã®ã¹ããŒãã¡ã³ããææ¡ããŠããŸãã
- ãœãŒã¹ã³ãŒãå ã®ãœãããŠã§ã¢ãšã©ãŒãæ€çŽ¢ããããã«èšèšãããéçåæããŒã«ã¯ãæ°å幎åããååšããŸãã ãªã³ããã¡ããªããŒã«ãªã©ã®ç¬¬1äžä»£ã®ã¢ãã©ã€ã¶ãŒã¯ãçŸåšããªããã£ããšèŠãªãããŠããŸãã ãã®ãããªããŒã«ã«ã¯ãPC-lintãªã©ã®åçšè£œåãšãCppcheckãªã©ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®äž¡æ¹ãå«ãŸããŸãã è¿å¹Žããããã¯CodeSonarãå«ãããé«åºŠãªããŒã«ã«åã£ãŠä»£ãããŸããã
Unixã®å ã®ããªã³ããã¯éåžžã«åå§çãªãã®ã§ããããšã«åæããŸãããé¡äŒŒã®ååã«åºã¥ããŠã®ã¿åãå質ã補åã«åž°ãããšããè©Šã¿ã¯ãããããäžèª å®ã«èŠããŸãã 30幎以äžã«ããããGimpel Softwareã¯éç解æã®ãªãŒããŒã§ãããPC-lintã¯ãã®éå€ãã®æè¡çé²æ©ã«è²¢ç®ããŠããŸããã
- CodeSonarã®äž»ãªã¿ã¹ã¯ã¯ã倧èŠæš¡ãªã³ãŒãããŒã¹ã®é倧ãªæ¬ é¥ãæ€çŽ¢ããããšã§ããã第äžäžä»£ã®ããŒã«ã®ã¿ã¹ã¯ã¯ã¯ããã«æ§ããã§ãã ãããã¯äž»ã«ãæ¬è³ªçã§ãªãã³ãŒãã£ã³ã°æšæºã®ã³ãŒãã®ççŸãèŠã€ããããå³å¯ãªåå¶åŸ¡ãæäŸããããã«èšèšãããŠããŸãã
ããã§ã¯ãPC-lintãšåãã第1äžä»£ã®ããŒã«ããæ··åšãããããšããå¥ã®è©Šã¿ãšãPC-lintã®ã¿ã¹ã¯ããã¯ããã«æ§ãããã§ãããšããstatementæ ¢ãªçºèšãèŠãããŸãã PC-lintã®äž»ãªã¿ã¹ã¯ã¯ãå°èŠæš¡ããã³å€§èŠæš¡ãããžã§ã¯ãã®äž¡æ¹ã§ããããã¡ãªãŒããŒãããŒãå¢çå€é åãè«çãšã©ãŒãæªå®çŸ©ã®åäœãªã©ã®ãå®éã®ããšã©ãŒãå«ãããã°ã©ã ãšã©ãŒãæ€çŽ¢ããããšã§ãã ãŸããå€ãã®ç«¶åä»ç€Ÿã®èœåãè¶ ããããŒãºãæ±ããã客æ§ã®æãå€æ§ãªããŒãºãæºããããšãç®æããŠããŸãã ãã®ãããªèŠæ±ã«ã¯ãããŸããŸãªMISRAæšæºã®ãµããŒããå³å¯ãªåå¶åŸ¡ããŠãŒã¶ãŒã»ãã³ãã£ã¯ã¹ã®ãµããŒããªã©ãå«ãŸããŸãã ååãšããŠãããããçš®é¡ã®ãšã©ãŒãå¹æçã«æ€åºã§ããããŒã«ã¯ãªãããšãç解ããããé«ãç®æšãèšå®ããŸãã PC-lintã¯ãé倧ãªæ¬ é¥ãèŠã€ããã ãã§ãªãããã®å€èŠ³ã«ã€ãªããããã°ã©ãã³ã°ãã¯ããã¯ãç¹å®ããããšãç®çãšããŠããŸãã å¹ åºãPCãªã³ãæ©èœãè€éãªãšã©ãŒãæ€åºã§ããªãããšãæå³ãããšèããã®ã¯æ£ãããããŸããã
- 第äžäžä»£ã®ããŒã«ã¯ããã€ãã®é倧ãªãšã©ãŒãèŠã€ããããšãã§ãããšäž»åŒµããŠããŸãããå®éã«ã¯ãæãäºçŽ°ãªåé¡ããæ€åºã§ããŸããã
ç¹°ãè¿ãã«ãªããŸããããã®å£°æã¯å ã®ãªã³ãã«é¢ããŠã¯æ£ãããããããŸããããPCãªã³ãã«é¢ããŠã¯ããã§ã¯ãªãããã®ãããªé£ç¶æ§ãæ瀺ããŠãã¬ããŒãã®èè ã¯åœåçã«æ¯ãèããèªè ã欺ããŸãã
ããã«ãèè ã¯é¢æ°éã®ããŒã¿è»¢éã«é¢é£ãããšã©ãŒã®äŸãããã€ã瀺ããPC-lintã¯ãããã®ããããèŠã€ããããšãã§ããªããšäž»åŒµããŸãïŒå®éã«ã¯ããããã®ãšã©ãŒã®ã»ãšãã©ãã¹ãŠãšãã¬ããŒãã«èšèŒãããŠããªããã®ããããŸãïŒ ã次ã宣èšããŸãã
- ããã§èª¬æããäŸã¯ãã¹ãŠéåžžã«åçŽã§ãã æ®å¿µãªãããå®éã®ã³ãŒãã¯ã¯ããã«è€éã§ããå€ãã®ã³ã³ãã€ã«åäœãæœè±¡åã¬ãã«ãããã³ãšã€ãªã¢ã¹ã®äœ¿çšã«ããå€æ°éã®éåžžã«æ··ä¹±ããé¢ä¿ãèæ ®ããå¿ èŠããããŸãã ãŸããæµ ãã¬ãã«ã®åæãåãã第äžäžä»£ã®ããŒã«ã¯ãçãäŸã§ã¯åçŽãªæ¬ é¥ãèŠã€ããããšã¯ã§ããŸããããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ããŸããŸãªé倧ãªãšã©ãŒãèŠã€ããã«ã¯ãŸã£ããäžé©åã§ãã äžæ¹ãCodeSonarã¯ãå€ãã®é«åºŠãªæ¹æ³ã䜿çšããŠããã°ã©ã ã®æ§é ãã¢ãã«åããŠãããããå®éã®ãšã©ãŒãèŠã€ããããšãã§ããŸãã
ãã®ã¹ããŒãã¡ã³ãã¯ããã¹ãäžã«PC-lintãã¬ããŒãã§èæ ®ããããšã©ãŒãæ€åºã§ããªãã£ããšãã誀ã£ãä»®å®ããå§ãŸããŸãããã®åŸãèè ã¯ããŒã«ã§äœ¿çšãããããã€ãã®ãŠããŒã¯ãªãããªãã¯ãããªã¹ãããŸãããå®éã«ã¯PC-lintã¯åãã¡ã«ããºã ã䜿çšããŸãã ãããªããã£ãã¢ãã©ã€ã¶ãŒã§ãèŠã€ããããšãã§ããªããšãã声æã«åããŠãCodeSonarã®ç»å Žåã«å®è£ ãããŸããã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèšãã°ãèè ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
- æ¯èŒããã補åã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯å€§ããç°ãªããŸãã PC-lintãCppcheckãªã©ã®ç¬¬1äžä»£ã®ã¢ãã©ã€ã¶ãŒã¯ãããšããšã³ã³ãã€ã©ãŒã®ãããªã³ãã³ãã©ã€ã³ããå®è¡ããããšãç®çãšããŠããŸããã ãããã£ãŠãåæã®çµæãå«ãã¬ããŒãã¯ããã¹ããšããŠè¡šç€ºãããŸãã ãããã®ããŒã«ãããåºããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšçµ±åããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããããããã®ãœãªã¥ãŒã·ã§ã³ã¯å ã ã¢ãã©ã€ã¶ãŒçšã«éçºããããã£ãããšæ¥ç¶ãããŠããã€ã³ã¿ãŒãã§ã€ã¹ãããå¹æãäœããªããŸãã 以äžã«äŸã瀺ããŸãã
ãŸããPC-lintã«ã¯åºå圢åŒã®éåžžã«æè»ãªèšå®ããããããã©ã«ãã§ã¯ããã¹ããHTMLãããã³XML圢åŒããµããŒãããŠããããšã«æ³šæããŠãã ããã ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããŠã¯ãPCãªã³ãã¢ãã©ã€ã¶ãŒèªäœãšäžç·ã«ããŠãŒã¶ãŒã¯æ¢åã®ã¢ããªã±ãŒã·ã§ã³ãšã®çµ±åã«å¿ èŠãªããŒã«ãåãåããŸãã ãã®ãããå€ãã®äžè¬çãªéçºç°å¢ã®æ§æãæäŸããŠããŸãã ããã«ãVisual StudioãEclipseãªã©ã®éçºç°å¢ãšçµ±åããããã®çå£ã§å®å šãªãœãªã¥ãŒã·ã§ã³ãéçºããŠãããµãŒãããŒãã£çµç¹ãããã€ããããŸãã
ã¬ããŒãã¯æ¬¡ã®çµè«ã§çµãããŸãã
- PC-lintãCppcheckãªã©ã®ç¬¬1äžä»£ã®éçã¢ãã©ã€ã¶ãŒã§äœ¿çšãããŠããæè¡ã¯ãéå»30幎éããŸãå€ãã£ãŠããŸããã ãã®ããã圌ãã¯æ·±å»ãªãœãããŠã§ã¢ãšã©ãŒãèŠã€ããããšãã§ããŸããã ãããã®ããŒã«ã䜿ãç¶ããéçºè ã¯ãæ°å幎ã«ãããéç解æã®éçºã®å©ç¹ã奪ã£ãŠããŸãã
å ±åæžã®ã»ãŒæ®ãã®éšåã®ããã«ãåŒçšãããäžç¯ã®3ã€ã®å£°æã®ãããã«ãçå®ã®ç²ãå«ãŸããŠããŸããã ããã¯ã以åã®æ æã«èª€ã£ãè«æã«åºã¥ãã絶察çãªãã£ã¯ã·ã§ã³ã§ãã
äŸã«ããäºå®ã®ããã¿
ã泚æ
ã¬ããŒãã«ç€ºãããŠããäŸã¯äžå®å šãªããšãå€ããããã¯ãããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®æ§è³ªã«ãããã®ã§ããããã補åã®å®¢èŠ³çãªæ¯èŒãGrammartechã®å£°æã®ç¢ºèªãèš±å¯ããŠããŸããã ãã®ãããã¬ããŒãã®äœæè ã¯ã䜿çšããã»ãšãã©ã®äŸãã埮調æŽãããŠãå®å šãªèªå·±å®çµåã®ã³ãŒããã©ã°ã¡ã³ãã®ããã«èŠããããŸããïŒããšãã°ããã¢ããŒãžOnline Demoã®ããã« ïŒã ãããè¡ãã«ã¯ãé¢æ°å ã«ã³ãŒããããã¯ãé 眮ããæåã¯æªå®çŸ©ã®åãšé¢æ°ã宣èšããã¿ã€ããã¹ãä¿®æ£ããŸãã ãããã®å Žåã§ãããããã®å€æŽã¯ã³ãŒãã®ã»ãã³ãã£ã¯ã¹ãç®çã®ãšã©ãŒãæ€åºããPC-lintã®æ©èœã«ã¯åœ±é¿ããŸããããä»ã®ããŒã«ã§åãçµæãåçŸããã¿ã¹ã¯ãä¿é²ããã ãã§ãã
ãããã¡ãªãŒããŒãããŒïŒéçïŒ
void test_buffer_overrun(int p[]) { p[4] = 1729; } void test_driver(void) { int test[4]; test_buffer_overrun(test); }
ãã®ãã©ã°ã¡ã³ãã«é¢é£ããŠãã¬ããŒãã«ã¯æ¬¡ã®ããšãèšèŒãããŠããŸãã
PC-lintã¯ãããã·ãŒãžã£ã®å¢çãééããããŒã¿ã®ãã¹ã远跡ã§ããªãããããã®ãšã©ãŒã蚺æã§ããŸããã
ããã¯æãäžè¬çãªåã§ãã æ©èœéã移åãããšãã«ããŒã¿ã远跡ããã¡ã«ããºã ã¯ã15幎åã«PC-lintã§å®è£ ãããŸããããã¬ããŒãå ã§ã®ãã®ååšã¯åŠå®ãããŠããŸãã ãŠãŒã¶ãŒããããžã§ã¯ãã®ããŒãºãšå©çšå¯èœãªããŒããŠã§ã¢ãªãœãŒã¹ã®ãã©ã³ã¹ãèŠã€ããããšãã§ããããã«ãPC-lintã¯ããã«ããã¹ãåæã¢ãã«ã䜿çšããŠããã®ã¿ã€ãã®ãšã©ãŒã«å¿ èŠãªæ€çŽ¢æ·±åºŠãèšå®ã§ããŸãã ããã©ã«ãã§ã¯ãæ€çŽ¢ã®æ·±ãã¯1ã§ãããæ©èœéã®é¢ä¿ã«é¢é£ããã»ãšãã©ã®åé¡ã蚺æããã«ã¯ãæ€çŽ¢ã®æ·±ã2ãå¿ èŠã§ãããã®ã¡ã«ããºã ã®æäœã®è©³çŽ°ã«ã€ããŠã¯ãPC-lintãŠãŒã¶ãŒããã¥ã¢ã«ãããã³å ¬åŒWebãµã€ããšãã¢ãµã€ããåç §ããŠãã ãããªã³ã©ã€ã³ãã¢ããŒãžã ããŒ-passes = 2ã§PC-lintãèµ·åãããšïŒãªã³ã©ã€ã³ãã¢ã®äŸã§ã¯èªåçã«ç»é²ãããŸãïŒã次ã®çµæãåŸãããŸãã
During Specific Walk: line 7: test_buffer_overrun([4]) #1 2 Warning 415: Likely access of out-of-bounds pointer (1 beyond end of data) by operator '[' [Reference: file ipa2.c: lines 2, 7] 2 Info 831: Reference cited in prior message 7 Info 831: Reference cited in prior message
ã¡ãã»ãŒãžN415ã¯ããªãŒããŒãããŒãçºçããããšãèŠåãããšåæã«ããããçºçããé åã®ç¯å²å€ãããã³ã³ãŒãã®ã©ã®ã»ã¯ã·ã§ã³ã®å®è¡ããšã©ãŒã«ã€ãªãã£ããã瀺ããŸãã æåŸã®2ã€ã®ã¡ãã»ãŒãžïŒN831ïŒã¯ãªãã·ã§ã³ã§ãããéçºç°å¢ãä»ã®ã¢ããªã±ãŒã·ã§ã³ã§èªèã§ããæšæºåœ¢åŒã§èŠåããã¹ãã衚瀺ããããã«äœ¿çšãããŸãã 次ã®äŸã§ã¯ãåãæ å ±ããã§ã«ã¡ã€ã³ã¡ãã»ãŒãžã«å«ãŸããŠãããããã¹ããŒã¹ãç¯çŽããããã«N831ã¡ãã»ãŒãžãïŒ -e831ãã©ã¡ãŒã¿ãŒãä»ããŠïŒç¡å¹ã«ãããŠããŸãã
ãããã¡ãªãŒããŒãããŒïŒåçïŒ
typedef unsigned long size_t; void* malloc(size_t); void test_buffer_overrun(int p[]) { p[4] = 1729; } void test_driver(void) { int *p = malloc(4); test_buffer_overrun(p); }
åã®ã±ãŒã¹ãšåæ§ã«ããã®äŸã§ã¯ãPC-lintããšã©ãŒãæ€åºã§ããªããšèª€ã£ãŠäž»åŒµããŠããŸãã
åã®äŸã®ããã«ãéçã«å²ãåœãŠããããããã¡ã®ãªãŒããŒãããŒãæ€åºã§ããªãã®ãšåãçç±ã§ãPC-lintã¯ãã®ãããªãšã©ãŒãæ€åºã§ããŸããã
-passes = 2ãã©ã¡ãŒã¿ãŒãæå®ããPC-lintã§ãã®ã³ãŒãããã§ãã¯ãããšã次ã®çµæãåŸãããŸãã
During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 662: Possible creation of out-of-bounds pointer (4 beyond end of data) by operator '[' [Reference: file ipa3.c: lines 5, 9, 10] During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 613: Possible use of null pointer 'p' in left argument to operator '[' [Reference: file ipa3.c: lines 9, 10] During Specific Walk: line 10: test_buffer_overrun([1]? | 0?) #1 5 Warning 661: Possible access of out-of-bounds pointer (4 beyond end of data) by operator '[' [Reference: file ipa3.c: lines 5, 9, 10]
PC-lintã¯ããããã¡ãŒã®å¢çãè¶ããŠæããã€ã³ã¿ãŒãäœæãããå Žæãšäœ¿çšãããŠããå Žæã®äž¡æ¹ãæ€åºãããã®ãã€ã³ã¿ãŒã®nullããã§ãã¯ããŸãïŒmallocé¢æ°ã¯nullãè¿ãããšãã§ããŸããããã®äŸã¯ãã§ãã¯ãããŸããïŒã
èŠåããã¹ãã®åã®test_buffer_overrunïŒ[1]ïŒ| 0ïŒïŒïŒ1åŒã³åºãã®è©³çŽ°ãªèª¬æã¯ãã¡ãã»ãŒãžã衚瀺ãããåã®ã³ãŒãå®è¡ãã¹ã瀺ããŠããŸãã ãã®å Žåã test_buffer_overruné¢æ°ã®åŒã³åºããæ€èšããŸãããã®é¢æ°ã§ã¯ã1ã€ã®èŠçŽ ã®é åãæããã€ã³ã¿ãŒãæž¡ãããïŒããšãã°ã intåã®åäžã®å€ããïŒããnullãã€ã³ã¿ãŒïŒ 0ïŒ ïŒã§ãã çå笊ã¯ãnullã®å€ããã§ãã¯ãããŠããªããããããã2ã€ã®ãªãã·ã§ã³ã®ã©ã¡ããå®éã«è¡ãããããäžæã§ããããšãæå³ããŸãã ãããã£ãŠãPC-lintã¯åã«åé¡ã蚺æããã ãã§ãªããç¹å®ã®çµè«ã«è³ã£ãçµç·¯ã説æããŸãã
NULLãã€ã³ã¿ãŒã®éåç §
#define NULL (void *)0 void test_deref(int *p) { *p = 55; } void test_driver(void) { int *pi1 = NULL; test_deref(pi1); }
ãããŠåã³ãã¬ããŒãã®èè ã¯ãPC-lintã®äžããããäŸã¯åœŒãã®åãè¶ ããŠãããšå®£èšããŸãïŒ
ããã¯ããããã2ã€ã®ããã·ãŒãžã£ã䜿çšããŠNULLãã€ã³ã¿ãŒãéåç §ããæãåçŽãªäŸã§ãã CodeSonarã®ã¿ããã®ãããªãšã©ãŒãèŠã€ããããšãã§ããŸãã
ç¹°ãè¿ããŸããããã®ã¹ããŒãã¡ã³ãã¯-passes = 2ãã©ã¡ãŒã¿ãŒãå«ããããšã§åè«ããããšãã§ããŸãã
During Specific Walk: File ipa4.c line 9: test_deref(0) #1 4 Warning 413: Likely use of null pointer 'p' in argument to operator 'unary *' [Reference: file ipa4.c: lines 8, 9]
PC-lintã¯ãnullãã€ã³ã¿ãŒéåç §èŠåãçºè¡ãããããçºçããæ¹æ³ãšçç±ã説æããŸãã
ã¡ã¢ãªãªãŒã¯
typedef unsigned long size_t; void *malloc(size_t); void free(void *); void test_free(int *p, int x) { if (p && x < 10) free(p); } void test_driver(void) { int *pi1 = malloc(20); test_free(pi1, 20); }
ãã®äŸã§ã¯ãã¬ããŒãã«ã¯æ¬¡ã®ããã«èšèŒãããŠããŸãã
ãã®äŸã§ã¯ãããããã·ãŒãžã£ã§ãããã¡ãå²ãåœãŠãããå¥ã®ããã·ãŒãžã£ã§ãããã¡ã解æŸãããŸãããã ããç¹å®ã®æ¡ä»¶ãæºããããå Žåã®ã¿ã§ãã ãã®ãšã©ãŒã¯CodeSonarã§ã®ã¿èŠã€ããããšãã§ããŸãã
ãã ãã -passes = 2ãã©ã¡ãŒã¿ãŒãæå®ããŠPC-lintãå®è¡ãããšã ããã§ã¯ãªãããšãããããŸãã
During Specific Walk: line 11: test_free([5]? | 0?, 20) #1 8 Warning 429: Custodial pointer 'p' (line 5) has not been freed or returned
PC-lintã¯ããã®ãšã©ãŒãæ€åºããèŠåãåŒãèµ·ãããåŒã³åºãã®è©³çŽ°ãªèŠçŽãæäŸã§ããŸããã
é³å£°ã³ã¡ã³ã
åããŒã«ã«ã¯é·æãšçæããããç¹å®ã®ããŒã«ã®çæãç¥ã£ãŠããã°ããããã匷調ããããã®äººçºçãªäŸãèŠã€ããããšã¯é£ãããããŸããã ã¬ããŒãã§ã¯ãPC-lintã®ããç¥ãããŠããæ¬ ç¹ã§ã¯ããããå®éã®æ¬ ç¹ãæªçšãããéåžžã«æ éã«èšèšãããã³ãŒãäŸãèŠã€ããããšãã§ããŸãã ãããã®äŸã®ã»ãšãã©ã¯ããã€ã³ã¿ãŒé¢é£ã®ããŒã¿ã远跡ããPC-lintã®æ©èœã®å¶éãæããã«ããŠããŸãã ããŒã¿è¿œè·¡ã·ã¹ãã ã¯PC-lint PlusïŒPC-lintã®éçºã®æ¬¡ã®ã¹ããããã¢ããªã±ãŒã·ã§ã³ã¯çŸåšããŒã¿ãã¹ãäžïŒã§æçµæ±ºå®ããããããã®å¶éã¯ãªããªããŸããã 以äžã®äŸã¯PC-lintã§ã¯èšºæãããŸããããPC-lint Plusã䜿çšããåæçµæãæ瀺ããŠã補åã®æ¹åã«åžžã«åãçµãã§ããããšã瀺ããŸãã
åæåãããŠããªãå€æ°
int foo() { int iret; int *p = &iret; return iret; }
PC-Lint Plusã¡ãã»ãŒãžïŒ
4 warning 530: likely using an uninitialized value return iret; ^ 2 supplemental 891: allocated here int iret; ^
解æŸãããã¡ã¢ãªãžã®ã¢ã¯ã»ã¹
typedef unsigned long size_t; void *malloc(size_t); void free(void *); void foo() { char *p = (char *)malloc(10); char *q = p; if (p) { p[0] = 'X'; free(p); q[0] = 'Y'; } }
PC-lint Plusã¡ãã»ãŒãžïŒ
11 warning 449: memory was likely previously deallocated q[0] = 'Y'; ^ 10 supplemental 891: deallocated here free(p); ^ 6 supplemental 891: allocated here char *p = (char *)malloc(10); ^
äºéã¡ã¢ãªå²ãåœãŠè§£é€
typedef unsigned long size_t; void *malloc(size_t); void free(void *); void test_double_free(int *p) { if (p) free(p); } void test_driver(void) { int *pi1 = (int *)malloc(sizeof(int)); if (pi1) test_double_free(pi1); if (pi1) free(pi1); }
PC-lint Plusã¡ãã»ãŒãžïŒ
15 warning 2432: memory was potentially deallocated free(pi1); ^ 15 supplemental 894: during specific walk free([4]@0/1) free(pi1); ^ 7 supplemental 891: deallocated here free(p); ^ 11 supplemental 891: allocated here int *pi1 = (int *)malloc(sizeof(int)); ^
ãããã¡ãªãŒããŒãããŒ
void foo() { char buffer[10]; char *pc; pc = buffer; for (int i = 0; i <= 10; i++) *pc++ = 'X'; }
ãã®äŸã¯ã forã«ãŒãã§ã®ãããã¡ãŒãªãŒããŒãããŒã瀺ããŠããŸãã ç¶æ å€ã远跡ããããã«PC-lintããã³PC-lint Plusã§äœ¿çšãããã¢ãã«ïŒçŸæç¹ã§ã¯ïŒã¯ããã®ã³ãŒãã®iãšpcã®é¢ä¿ãèæ ®ããŠããŸããã ããã¯çŸåšãPC-lintã®å®¢èŠ³çãªæ¬ ç¹ã§ãã CodeSonarã®åŒ±ç¹ã匷調ããåæ§ã®äŸãç°¡åã«æãä»ãããšãã§ããŸãããããã§ã¯äœãåŸãããŸããã äžèšã®ããã«ãåããŒã«ã«ã¯é·æãšçæããããåããŒã«ã¯ä»äººã«ã¯èŠããªããšã©ãŒã蚺æã§ããããšãèªèããŠããŸãã ä»ã®ã¢ãã©ã€ã¶ãŒã®æ¬ ç¹ãææãã代ããã«ãPC-lintã®ã¡ãªããã«åãçµã¿ããŠãŒã¶ãŒã®ããŒãºãæºããããã«è£œåãç¶ç¶çã«æ¹åããããšã奜ã¿ãŸãã
ãŸãšã
以äžã®è¡šã§ã¯ãPCãªã³ãã«é¢ããGrammatechã®äž»èŠãªèåœã®ç³ãç«ãŠãšãç§ãã¡ããããã«åè«ããäºå®ããŸãšããŸããã
èåœã®é³è¿° | å®éã« |
PC-lintã¯ãUnixã®å ã®lintãã¡ããªãŒã®åå§çãªããŒã«ã§ãã | PC-lintã¯ãéå»30幎éã«ããã£ãŠä»ã®ããŒã«ãšã¯ç¬ç«ããŠç¶ç¶çã«éçºããã³æ¹åãããé«åºŠãªéçã¢ãã©ã€ã¶ãŒã§ãããåè³æŽã®ããé©æ°çãªåæããŒã«ãæäŸããŸãã ãããã®1ã€ã¯ãæ©èœãšã¢ãžã¥ãŒã«éã®è»¢éäžã«ããŒã¿ã远跡ããã·ã¹ãã ã§ãã |
PC-lintã¯ãæãæãããªãšã©ãŒã®ã¿ãæ€åºã§ããŸãã | PC-lintã¯ãGrammartechã¬ããŒãã®äŸã®ãšã©ãŒãå«ããè€éãªãšã©ãŒãæ€åºã§ããå€ãã®é«åºŠãªæè¡ã䜿çšããŠããŸã |
PC-lintã¯ã倧èŠæš¡ãããžã§ã¯ãã§é倧ãªãšã©ãŒãæ€çŽ¢ããããã«ã¯èšèšãããŠããŸããã | PC-lintã¯ãæ°çŸè¡ã®ã³ãŒãããæ°çŸäžè¡ãŸã§ãããããèŠæš¡ã®ãããžã§ã¯ãã§äœ¿çšãããŠããŸãã |
PC-lintã¯ããã¹ãåºå圢åŒã®ã¿ããµããŒãããç¶ç¶ççµ±åããŒã«ã§ã®äœ¿çšã«ã¯é©ããŠããŸããã | PC-lintã¯ããã¬ãŒã³ããã¹ããHTMLãXMLãå«ãã»ãŒãã¹ãŠã®ã¬ããŒã圢åŒããµããŒãããã¯ã©ã€ã¢ã³ãã®çµéšã瀺ãããã«ãHudsonãJenkinsãªã©ã®ç¶ç¶ççµ±åããŒã«ãå«ãä»ã®ã¢ããªã±ãŒã·ã§ã³ãšçµã¿åãããŠããŸããŸãªæ¹æ³ã§äœ¿çšã§ããŸãã |
PC-lintã¯ãè€éãªãšã©ãŒãæ€çŽ¢ãããšãã«èŠåãããªã¬ãŒããã³ãŒãã®å®è¡ãã¹ã衚瀺ããŸããã | PC-lintã¯ãå¯èœãªå Žåãçµè«ã«è³ã£ãåŒã³åºãã®ã·ãŒã±ã³ã¹ãå€ãªã©ã®è©³çŽ°æ å ±ãæäŸããŸãã |
PC-lintã¯éçºè å°çšã§ãã | PC-lintã¯ããã®ç®çã«å¿ããŠããœãããŠã§ã¢éçºè ãæè¡ç®¡çã®å°é家ããã¹ã¿ãŒãããã³æ³å»åŠã®å°é家ã«ãã£ãŠäœ¿çšãããŸãã |
PC-lintã¯ãã¡ã€ã«å ã®åé¡ã®ã¿ãèªèã§ããŸãã | PC-lintã¯ããã®ååšã®æåãããã¢ãžã¥ãŒã«éã®é¢ä¿ãå«ããããã°ã©ã å šäœãåæããæ¹æ³ãç¥ã£ãŠããŸãã ãã®æ©èœã¯ããšããããä»ã®ããŒã«ãšåºå¥ãããŸããã |
PC-lintã¯ãèãããããã¹ãŠã®ãœãããŠã§ã¢ãšã©ãŒãèŠã€ããããšãã§ããŸããã | éçã¢ãã©ã€ã¶ãŒã¯ãã¹ãŠã®ãšã©ãŒã蚺æã§ããªããããPC-lintã¯ãå€ãã®è€éã§å®éã®ãšã©ãŒãå«ããæ€åºãããæ¬ é¥ã®å€§ããªå®çžŸãæã¡ããã®æ©èœã¯æ¹åããç¶ããŠããŸãã |
ãããã«
Gimpel Softwareã¯ããŠãŒã¶ãŒãšç«¶åä»ç€Ÿã®äž¡æ¹ããã®èª å®ãªã¬ãã¥ãŒãšå»ºèšçãªæ¹å€ãæè¿ããŸãããã¬ããŒãã®èè ã«ããæå³çãªèåœã®èšè¿°ã¯èª å®ã§ã建èšçã§ããªããããã°ã©ããŒãéçåææ¥çã®å©çã«ã¯ãªããŸããã Grammartechã®ããªã·ãŒã¯ã競å補åã«é¢ããèåœããã³è»œrogçãªçºèšã«åºã¥ããŠããã競åä»ç€Ÿã§ã¯ãªããã®äŒç€Ÿãäžå©ãªç«å Žã«çœ®ããŠããŸãã
ã¬ããŒãããçµè«ã§ããããã«ãPC-lintãšCodeSonarã®äž»ãªéãã¯æ¬¡ã®ãšããã§ãã
- CodeSonarã¯ç·å¯ã«çµ±åãããã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãåããŠããŸãããPC-lintã¯ãVisual StudioãEclipseãªã©ã®ææ°ããŒã«ãšã¢ãã©ã€ã¶ãŒãçµ±åããããã®æè»ãªãªãã·ã§ã³ããŠãŒã¶ãŒã«æäŸããŸãã
- CodeSonarã®ç¯å²ã¯PC-lintã®ç¯å²ãããçãããããã®æ©èœã¯åœç€Ÿè£œåã®æ©èœãããå°ãããªã£ãŠããŸãã
- CodeSonarã«ã¯ãPC-lintã§ãŸã ãµããŒããããŠããªãå€ãã®æ©èœããããŸãã ç¹ã«ããã®ã¬ããŒãã§ã¯ã¡ããªãã¯åæãšãã€ã³ãåæã«èšåããŠããŸã-å°æ¥ã®ããŒãžã§ã³ã®PC-lint Plusåãã«ãããã®ã¡ã«ããºã ã®äž¡æ¹ãéçºããŠããŸãã ãã¡ãããPCãªã³ãæ©èœã®å€ãã¯CodeSonarã«ã¯ãããŸããã
翻蚳è ã®ã¡ã¢
以äžã«ãã¢ãã©ã€ã¶ãŒã®æ¯èŒã«ã€ããŠèšè¿°ããããªãçç±ã®è¯ãäŸã瀺ããŸãã ãããè€éãªäœæ¥ã§ããã䞻芳çã§ã¯ãªããããŸããŸãªæ¥œåšãåãããã«ããç¥ãå¿ èŠããããŸãã 幟åãã£ãšããããè©äŸ¡ã§ãããå€æ°ã®ãããžã§ã¯ããç°ãªãã¢ãã©ã€ã¶ãŒã§ãã§ãã¯ããçµæãæ¯èŒããå Žåã«ã®ã¿å¯èœã§ãããšä¿¡ããŠããŸãã ããããããã¯å€ãã®ãã¥ã¢ã³ã¹ã䌎ãéåžžã«å€§ããªã¿ã¹ã¯ã§ãã ä»ã®ãã¹ãŠã®è©äŸ¡ã¯äž»èŠ³çãªæèŠã«éãããããã§èŠãããããã«ãç°¡åã«å¯Ÿç«ç¶æ³ã«çºå±ããå¯èœæ§ããããŸãã