1ãæã»ã©åãPVS-Studioã䜿çšããClickHouseãœãŒã¹ã³ãŒãã®åæãå«ãèšäºãå ¬éãããŸããã èšäºã¯éåžžã«æåããããšãå€æããŸãããããšãã°ããã®èšäºãžã®ãªã³ã¯ã¯ãå ¬éæã«å°ãªããšã1æ¥ã«10åéä¿¡ãããŸããã èšäºã®å šäœçãªããŒã³ã¯å¥œæçã§ããããã®çºè¡æ¥ã®clickhouse.yandexãŠã§ããµã€ãã®ãã©ãã£ãã¯ã¯èããå¢å ããŸããã
äŒç€Ÿã人ã培åºçã«ä»äºããããšããç§ã¯æ¬åœã«å°æ¬ããŠããŸãã ãã®ãããPVS-Studioã«ã¯ããã¢ãŒã·ã§ã³ã«å¯Ÿããå æ¬çãªã¢ãããŒãããããŸããHabrã ãã§ã337ã®èšäºããããŸãã 圌ãã¯ãã»ãŒãã¹ãŠã®ãã·ã¢ã®C ++äŒè°ã§ãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸãã ãããã«ãããããã¯æ³šç®ã«å€ããŸãã人ã ã¯èªåã®ä»äºã§ä»ã®äººã ã«å©çãäžããããšããŸãã
ãã®èšäºã¯éçã¢ãã©ã€ã¶ãŒãžã®é¢å¿ãåèµ·ããClickHouseã³ãŒãããŒã¹ã«åºã¥ããŠããã€ãã®ãããªãã¯PVS-Studioã¢ããã°ã®åäœããã¹ãããããšã«ããŸããã æ¬æ¥ã®èšäºã§ã¯ããã®èª¿æ»ã®çµæãå ±æããŸãã
èšäºããªãªãŒã¹ãããæ¥ã«ãç§ãã¡ã¯ããã«èšãããŠãããã¹ãŠã®ãã°ãä¿®æ£ããŸããã çµæã¯ãã®ã³ãããã§ç¢ºèªã§ããŸãã å
¬éæã®ãã°ã®äžã«ã¯ã以åä¿®æ£ããããmaster
ã«ååšããªããªã£ããã®ããããŸãã
éçã¢ãã©ã€ã¶ãŒã®æçšæ§ã«ã€ããŠã¯ééããããŸããã äžéšã®ã³ã¡ã³ããŒã¿ãŒã¯ãã³ãŒãã¬ãã¥ãŒããã¹ãããµãã¿ã€ã¶ãŒã®äžã§ã®å®è¡ãã¯ããã«æçšã§ãããšææããŠããŸãã ãããã®ãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯æããã§ãã ããã«ããã§ã«ã³ãŒãã¬ãã¥ãŒïŒäžçšåºŠïŒãã³ããããã¹ãïŒã«ãã¬ããžã®æªãïŒããµãã¿ã€ã¶ãŒïŒASanã1æ¥1åValgrindã®ã¿ïŒã§å®è¡ãããŠããŸãã éçã¢ãã©ã€ã¶ãŒã«ã¯ãä»ã®ãã°ãèŠã€ããå ŽåããããŸããããšãã°ãå®è¡ãããªãã³ãŒãã®ã³ããŒã¢ã³ãããŒã¹ãã§ã1幎åã«åé€ããå¿ èŠããããŸããã ãããŠããã£ãšæ·±å»ãªãã®ãèŠã€ããæ©äŒããããŸãïŒç¶ããèªãïŒã ã€ãŸããéçã¢ãã©ã€ã¶ãŒã®å©ç¹ã¯ãŒãã§ã¯ãããŸããã
èšäºã«ãã¹ãŠã®æ¬ é¥ã瀺ãããŠããããã§ã¯ãªããPVS-Studioã®è©Šçšçã©ã€ã»ã³ã¹ã䜿çšããŠæ®ãã®æ¬ é¥ãæ€çŽ¢ããããææ¡ãããŸããã ããããéãããæéã®ã©ã€ã»ã³ã¹ãèŠæ±ããåã«ãç§ãã¡ã¯ãŸããæéãç¡é§ã«ããªãããã«æºåãã§ããŠããããšã確èªãããã£ãã®ã§ãã
PVS-Studioã®ããã€ãã®ä»£æ¿æ¡ãæåã«ç 究ããããšã«ããŸããããã®çµæãClang-TidyãppcheckãCoverityãSvaceãè©ŠããŸããã ããããã«ã€ããŠãClickHouseã³ãŒãã§ããããæ£ãã䜿çšããæ¹æ³ã説æããããšãã§ããŸããã
Cppcheck
䜿çšæé ïŒ cppcheck.txt ã
ãã®ããŒã«ã«ã¯ããã€ãã®éèŠãªå©ç¹ããããŸããéåžžã«äœ¿ãããããéåžžã«é«éã«åäœããŸãã ãã®ãããæ°ç§ã§ãªããžããªãåæããŸããã æšæºã®èµ·åã¢ãŒãã§ã¯ãå°æ°ã®èª€æ€ç¥èŠåã®ã¿ãçºçããŸããã --enable-all
ã¢ãŒãã§ã¯ãçŽ200ã®èŠåãåä¿¡ããããã®ãã¡ã®ããã€ãã¯æå³ã®ãããã®ã§ããããšãå€æããŸããã
- 誰ãã1æåãå ¥åããã®ãå¿ãã ã ã©ãããŒ-ãšã©ãŒã¯ããã°ã©ã ã®åäœã«åœ±é¿ããŸããã
- log1pé¢æ°ã䜿çšããªã-ãã®ãããªãã®ãååšããããšãç¥ããŸããã§ããã ãã®å Žåãããã°ã©ã ã®åäœã«ã圱é¿ããŸããã
ããã«ãã¢ãã©ã€ã¶ãŒã¯ãé¢æ°ã«ãã©ã¡ãŒã¿ãŒãæž¡ããšããæ瀺çãªå®çŸ©ãå¿ãããšããç¹å®ã®å€æ°ã®ã¹ã³ãŒããåºããããªã©ãããã€ãã®éæé©æ§ãçºèŠããŸããã
å€ãã®èª€æ€ç¥ã¯ãã¢ãã©ã€ã¶ãŒãéåžžã«åå§çã§ãããšããäºå®ã«é¢é£ããŠããŸãã ã©ããããC ++ãå®å šã«è§£æããããšãããããŸããã ããšãã°ã次ã®ã³ãŒã
int x = 0; auto lambda = [&]{ x = 1; };
ã³ãŒãã®ããã«æ±ãããŸãïŒ
int x = 0; { x = 1; };
ãã ããå€æ°ã®èª€æ€ç¥ãéçã³ãŒãã¢ãã©ã€ã¶ãŒã®æšæºã§ãã ãããã䜿çšããã·ããªãªã¯ãæ°çŸã®ãšã©ãŒã調ã¹ãå Žåã«ãã£ãŠã¯ãããã®äžããæ¬åœã«éèŠãªãšã©ãŒãèŠã€ããããšã§ãã
ã¯ã©ã³ãžãŒ
䜿çšæé ïŒ clang-tidy.txt
ãã®ããŒã«ã®éèŠãªå©ç¹ã¯ãClangãšã³ã·ã¹ãã ã«ããããšã§ãã ã€ãŸããã·ã¹ãã ãClangã䜿çšããŠã³ã³ãã€ã«ãããŠããå ŽåãClang-Tidyã¯ãããžã§ã¯ãã®ã¢ã»ã³ããªã®ãã¹ãŠã®æ©èœãæ£ããèæ ®ããŸãã ç¬èªã®ãã§ãã¯ãè¿œå ããæ¹æ³ã«ã€ããŠã®æ瀺ããããŸãã
Clang-Tidyã¯ãå翻蚳åäœã®åæã«çŽ12ç§ãè²»ãããŸãã ããã¯ååã«é ãã§ãã
Clang-Tidyã¯ãã¹ã¿ã€ã«ãã§ãã¯ãååšããç¹ã§Clangéçã¢ãã©ã€ã¶ãŒïŒã¹ãã£ã³ãã«ããšãåŒã°ããŸãïŒãšã¯ç°ãªããŸãã äžéšã®ã¹ã¿ã€ã«ãã§ãã¯ã§ã¯ãã³ãŒããèªåçã«æžãæããããšãã§ããŸãã Clangéçã¢ãã©ã€ã¶ãŒã¯ãClang-Tidyãšã¯ç°ãªããçµæãå«ãHTMLããŒãžãçæã§ããŸãããClang-Tidyã¯ç«¯æ«ãŠã£ã³ããŠã§èŠã€ãã£ãåé¡ã«é¢ããã¡ãã»ãŒãžã®ã¿ã衚瀺ããããšã«æ³šæããŠãã ããã
ãã¹ãŠã®çš®é¡ã®ãã§ãã¯ã䜿çšããããšã¯æå³ããããŸããã ãããã£ãŠã CERT Secure Coding Standards ã C ++ Core GuidelinesããŸãã¯HTC ++ã®ãã§ãã¯ã®1ã€ã¯ãããã€ã³ã¿ãŒæŒç®ã䜿çšããªãããšè¿°ã¹ãŠããŸãã ããæå³ãããã¯åççã§ããããã®ãã§ãã¯ããªãã«ããå¿ èŠããããã¹ãŠã®ãœãŒã¹ãæ瀺çã«ããŒã¯ããã®ã¯èŠçã§ãã
æçšãªã¡ãã»ãŒãžã¯ãéçã¢ãã©ã€ã¶ãŒãšããã©ãŒãã³ã¹ãã¹ãã°ã«ãŒãã§èŠã€ãããŸããã ããã©ãŒãã³ã¹ã¯ãã€ãã¬ãŒã¿ã®ãã¹ãã€ã³ã¯ãªã¡ã³ããšãåç §æž¡ãã§ã¯ãªãå€æž¡ãã®åŒæ°ã®åãæž¡ããšãã2çš®é¡ã®ãšã©ãŒãæ€åºããŸããã æ®å¿µãªãããåç §ã«ããåŒæ°ã®åãæž¡ãã®ãã§ãã¯ã¯ãããšãã°æ¬¡ã®ãããªå°ããªæ§é ã§ãæ©èœããŸãã
struct S { int x; };
ãŸãã¯STRONG_TYPEDEF
ã
ãã®å Žåãå€ã«ããéä¿¡ãåç
§ã«ããéä¿¡ã«çœ®ãæãããšã圹ã«ç«ããªãããæ害ã§ããããããšãå€æããå ŽåããããŸãïŒé¢æ°ãã€ã³ã©ã€ã³åãŸãã¯ã¯ããŒã³åãããŠããªãå Žåããããã®å Žåã¯éãããªãããïŒã ä»ã®ç¶æ³ã§ã¯ããã§ãã¯ãããæçšã§ããããšãå€æããŸãããcommitcommitãåç
§ããŠãã ããã ãã¡ããããã®ãããªãšã©ãŒã¯ã³ãŒãã¬ãã¥ãŒã®æ®µéã§æ€åºããå¿
èŠããããŸã-ååã«æ³šæããŠããå¿
èŠããããŸãã ãã¹ãŠã®ããã©ãŒãã³ã¹èŠåãä¿®æ£ããåŸãClickHouseã®å®éã®ããã©ãŒãã³ã¹ã¯å€ãããªãããšã«æ³šæããŠãã ããã ããã¯äºæ³ãããããšã§ãã察å¿ãããšã©ãŒãããã«ããã¯ã«ããå Žåã sudo perf top
ãåããŠèµ·åãããšãã«æ°ã¥ããã§ãããã
éçã¢ãã©ã€ã¶ãŒã®èŠåã¯éåžžã«äŸ¿å©ã§ãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã®ä»®æ³é¢æ°ã®åŒã³åºã ã ä»®æ³ã¯èª€ã£ãŠæžããããšãå€æããã
- èšç®ã®ç²ŸåºŠã®äœäž
- NULLãã€ã³ã¿ãŒã®éåç § ã
ã³ããªãã£
䜿çšæé ïŒ coverity.txt
Coverityã¯éå ¬éã®åçšè£œåã§ããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®å Žåã¯ç¡æã§äœ¿çšã§ããŸãã Coverityã䜿çšããæåãªè£œåã«ã¯ãããšãã°LinuxããããŸãã
äœæ¥ã¹ããŒã ïŒãã«ãã·ã¹ãã ãã©ãããïŒ cov-build make
代ããã«åçŽã«ç€ºãããŸãïŒãã³ã³ãã€ã©ãŒåŒã³åºããã€ã³ã¿ãŒã»ãããããŠãŒãã£ãªãã£ããµã€ãããããŠã³ããŒããããŸãã åããŠåœŒå¥³ãåãããããšã¯ã§ããŸããã§ãããã©ã®ã³ã³ãã€ã©ã䜿çšãããã圌女ã«äŒããæ¹æ³ã¯ããã€ããããŸããã
äžéšã®ç¿»èš³åäœã§ã¯ãããŒã«ã¯æ倧1æéå®è¡ããããããžã§ã¯ãå
šäœã®åèšåææéã¯4æéã§ãã ãã®çµæãCoverityã«ããŠã³ããŒãã§ããtarballãäœæãããŸãã 1.5 GBã®ã¢ãŒã«ã€ããæ£åžžã«ããŠã³ããŒããããŸããã ããå€ãã®çµæãããŠã³ããŒãã§ããŸãã
次ã«ãã¢ãã©ã€ã¶ãŒã®çµæã«ã¢ã¯ã»ã¹ããããã«ãåæããããããžã§ã¯ãã®ãœãŒã¹ã³ãŒããæäœããæ©èœã®ãã¹ãã«åæ Œããå¿
èŠããããŸãã ããšãã°ã1æ¥åã¢ã¯ã»ã¹ãèš±å¯ãããŸããã
ãã®åŸãçŸããWebã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšå¯èœã«ãªããæ¬ é¥æ³šéãšã¡ã¢è§£æ±ºïŒèª€æ€ç¥ãæå³çãä¿®æ£ãå¿ èŠãªã©ïŒãå«ãã³ãŒããã€ã³ã¿ã©ã¯ãã£ãã«åŠç¿ã§ããŸãã
圌ãã¯ããã«achivkaãçºè¡ããŸããããçç±ã¯ããããŸããã§ããã
312åã®æ¬ é¥ãèŠã€ãããŸããã
- æ§æå ã®ãŠãŒã¶ãŒãã»ã¯ã·ã§ã³ã®ããããã§èŠçŽ ãæå®ããªãå Žåã åæåãããŠããªãå€æ° ã
- çµäºå埩åã®éåç §ã¯ãåã«ã¢ãã¬ã¹ã«å€æããããšã§ãã
- ãã¹ãŠã®å°ããªãã® ã
èŠã€ãã£ãããã€ãã®æ¬ é¥ã¯ãå®éã«ã¯èšèšã®äžéšã§ãã
- ãã³ãã¬ãŒãã³ãŒãã®ifã®ããŒãããžãŒæ¡ä»¶ã ããã¯å®å šã«æ£åžžã§ãããäžè¬çãªæ £è¡ããã³ã³ãŒãã¹ã¿ã€ã«ã§ãã ããã«ããã®ã³ãŒãã¯ãã³ã³ãã€ã©ãŒããããéåžžã«ããç¥ã£ãŠãããäžèŠãªã³ãŒããåé€ãããšããåæã§æžãããŠããŸãã
- ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã®åæåãããŠããªãã¯ã©ã¹ã¡ã³ããŒã ããã¯å®éã«ã¯ééãã§ãããå Žåã«ãã£ãŠã¯èš±å®¹ãããŸãã
- ãã¹ãããã°ã©ã ã®ã¡ã€ã³é¢æ°ã§åŠçãããªãäŸå€ã ããã«ãããã¹ã¿ã€ã«ãå¯èœã«ãªããŸãã ã¡ã€ã³é¢æ°ããäŸå€ãã¹ããŒãããå Žåãstd :: terminateã䜿çšããŠåŠçãããŸããæšæºã©ã€ãã©ãªã¯ããã€ãã®äŸ¿å©ãªããšãè¡ããŸãïŒè©³çŽ°ãªçµäºãã³ãã©ïŒã ããã°ã©ã ã¯äžæ¢ä¿¡å·ãåãåãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã³ã¢ãã³ããæžã蟌ã¿ãããã°ã©ã ã¯ãŒã以å€ã®ã³ãŒãã§çµäºããŸãã ããã¯ãã¹ãŠéåžžã«äŸ¿å©ã§ãã
ããã«ããšã©ãŒã®1ã€ã¯ãstd :: shared_mutexãšãã圢åŒã®Unrecoverable parse error
ããã«èŠããŸããã ã€ãŸããCoverityã¯C ++ 17ããµããŒãããŠããŸããã
ã¹ãšãŒã¹
2016幎11æ30æ¥ãäŒè°ãDatabase Technologiesãã«åå ããŸããããããã§ã¯éçåæããŒã«Svaceã®äœ¿çšã«ã€ããŠISP RASã®ååãšåæããããšãã§ããŸããã ãã®ããŒã«ã¯Samsungã§å®è£ ãããŠããŸãããåœå ã®ããã°ã©ããŒã®éã§ã¯ã»ãšãã©ç¥ãããŠããŸããã
åæçµæã¯ããœãŒã¹ã³ãŒããšæ³šéã衚瀺ãã䟿å©ãªWebã€ã³ã¿ãŒãã§ã€ã¹ã§å©çšã§ããŸãã èŠã€ãã£ããšã©ãŒã®äžã§æãæ·±å»ãªã®ã¯ãã³ãŒãåå²ã®1ã€ã« freeaddrinfo ããªãããšã§ãã åæã®çµæãšç 究ã®ããã®æ¬ é¥ã®éžæããISP RASã®ååããæäŸãããããšã¯æ³šç®ã«å€ããŸãã
çµè«
éçã¢ãã©ã€ã¶ãŒã®äœ¿çšã¯ã補åã®ã³ãŒããæ¹åããæåã®éèŠãªæ段ã§ã¯ãããŸããã ããšãã°ãå°ãªããšãAddress Sanitizerã§ãã¹ããå®è¡ããèªåã¢ã»ã³ããªããªãå Žåã¯ãæåã«ãããæäŸããæ¹ã䟿å©ã§ãã éçã¢ãã©ã€ã¶ãŒã®çµæã®åæã«ã¯ãå°ãªããšãæåããå€ãã®æéãå¿ èŠã§ãã ããããé©åã«äœ¿çšããã«ã¯ãCIã·ã¹ãã ãžã®çµ±åãå¿ èŠã§ãã ããç°¡åãªããšãè¡ã£ãå Žåã«ã®ã¿ãéçã¢ãã©ã€ã¶ãŒãªã©ã®ãã°ãããããšãè©Šãããšãã§ããŸãã ãããããªãç§ã¯ããªããæããšã©ãŸãããããšããŠããã®ã§ã-å¿ ãè©ŠããŠãã ããïŒ
çµè«ãšããŠãPVS-Studioã®ååãç¹ã«ClickHouseã®èšäºã«å¯ŸããŠè¡ã£ãŠããä»äºã«æè¬ããŸãã ãããã¯ãã³ãŒãå ã®ããã€ãã®éèŠãªåé¡ãçºèŠããããšã§ç§ãã¡ãå©ããã ãã§ãªãããã®èšäºã察象ãšããç 究ãåºæ¿ããŸããã