çµããã®ãªãã³ãŒãã¬ãã¥ãŒããããã°ã«ããããããŠãç掻ãç°¡çŽ åããæ¹æ³ãèããããšããããŸãã ãããŠãå°ãæ€çŽ¢ããããå¶ç¶èŠã€ããããããšããéç解æããšããéæ³ã®ãã¬ãŒãºã衚瀺ãããŸãã ãããäœãªã®ãããããŠããããããžã§ã¯ããšã©ã®ããã«çžäºäœçšããã®ããèŠãŠã¿ãŸãããã
å®éãçŸä»£ã®èšèªã§æžããšãæ°ã¥ããªããã¡ã«éçã¢ãã©ã€ã¶ãŒãå®è¡ããããšã«ãªããŸãã å®éã®ãšãããææ°ã®ã³ã³ãã€ã©ã¯ãã³ãŒãå
ã®æœåšçãªåé¡ã«ã€ããŠãããšãå°èŠæš¡ã§ãã£ãŠãäžé£ã®èŠåãæäŸããŸãã ããšãã°ãVisual Studio 㧠C++ ã³ãŒããã³ã³ãã€ã«ãããšã次ã®ããã«è¡šç€ºãããå ŽåããããŸãã
ãã®åºåã§ã¯ãå€æ°ã VAR é¢æ°ã®ã©ãã«ã䜿çšãããŠããŸããã ãããã£ãŠãå®éã«ã¯ãã»ãšãã©ã®å ŽåãåçŽãªéçã³ãŒã ã¢ãã©ã€ã¶ãŒã䜿çšããŠããŸããã ãã ããCoverityãKlocworkãPVS-Studio ãªã©ã®å°éçãªã¢ãã©ã€ã¶ãŒãšã¯ç°ãªããã³ã³ãã€ã©ãŒã«ãã£ãŠæäŸãããèŠåã¯ãçãç¯å²ã®åé¡ã®ã¿ã瀺ãå ŽåããããŸãã
éç解æãšã¯äœãããŸããã®å®è£
æ¹æ³ãããããããªãå Žåã¯ã
ãªãéç解æãå¿ èŠãªã®ã§ãããã?
äžèšã§èšãã°ãé«éåãšç°¡çŽ åã§ãã
éçåæã䜿çšãããšãèšèªæ§é ã®èª€ã£ã䜿çšããã¿ã€ããã¹ãŸã§ãã³ãŒãå ã®ããŸããŸãªåé¡ãèŠã€ããããšãã§ããŸãã ããšãã°ã代ããã«
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;
次ã®ã³ãŒããæžããŸããã
auto x = obj.x;
auto y = obj.y;
auto z = obj.x;
ã芧ã®ãšãããæåŸã®è¡ã«ã¿ã€ããã¹ããããŸãã ããšãã°ãPVS-Studio ã¯æ¬¡ã®èŠåãçºè¡ããŸãã
ãã®ãšã©ãŒã«æãåºãããå Žåã¯ãã³ã³ãã€ã© ãšã¯ã¹ãããŒã©ãŒã§æ¢è£œã®äŸãè©ŠããŠãã ããã
ãããŠããåç¥ã®ãšãããã³ãŒãã®ãã®ãããªã»ã¯ã·ã§ã³ã«ããã«æ³šæãæãããšãåžžã«å¯èœã§ãããšã¯éããŸããããã®ããããã¹ãŠããªãããã»ã©å¥åŠãªåäœãããã®ãçåã«æããªãããååãªæéãããã°ã«åº§ãããšãã§ããŸãã
ããããããã¯æããã«ééãã§ãã éçºè
ãèšèªã®åŸ®åŠãªç¹ãå¿ããŠæ¬¡åã®ã³ãŒããæžãããã©ããªãã§ãããã? ãããã¯ã³ãŒãå
ã§èš±å¯ããããšãã§ããŸã
ãã®ãããªç¶æ³ã®ããã«ãéçåæãç»å ŽããŸããã ããã¯éçºè
ã®ã¢ã·ã¹ã¿ã³ãã§ãããã³ãŒãå
ã®ããŸããŸãªåé¡ãææãããªããã®ããã«æžãå¿
èŠããªãã®ããããã«ãã£ãŠäœãèµ·ããã®ãããããŠãããä¿®æ£ããæ¹æ³ãããã¥ã¡ã³ãã§èª¬æããŸãã 以äžã«ãã®äŸã瀺ããŸã: *
ã¢ãã©ã€ã¶ãŒãæ€åºã§ããããã«èå³æ·±ããšã©ãŒãèšäºã§èŠã€ããããšãã§ããŸãã
10 幎㮠C++ ãããžã§ã¯ãã®ããã 2019 ãšã©ãŒ 10 幎㮠C# ãããžã§ã¯ãã®ããã 2019 ãšã©ãŒ 10 幎㮠Java ãããžã§ã¯ãã®ãã° ããã 2019
ãã®è³æãèªã¿ãéç解æã®å©ç¹ãç解ããã®ã§ãéç解æãè©ŠããŠã¿ãããšããå§ãããŸãã ããããã©ãããå§ããã°ããã§ãããã? æ°ããããŒã«ãçŸåšã®ãããžã§ã¯ãã«çµ±åããã«ã¯ã©ãããã°ããã§ãã? ãããŠããŒã ã圌ã«çŽ¹ä»ããã«ã¯ã©ãããã°ããã§ããããïŒ ãããã®è³ªåã«å¯Ÿããçãã¯ä»¥äžã«ãããŸãã
泚æããŠãã ããã éçåæã¯ãã³ãŒã ã¬ãã¥ãŒãªã©ã®äŸ¿å©ãªæ©èœã眮ãæãããããã£ã³ã»ã«ããããããã®ã§ã¯ãããŸããã ãã®ããã»ã¹ãè£å®ããã¿ã€ããã¹ãäžæ£ç¢ºããå±éºãªãã¶ã€ã³ãäºåã«çºèŠããŠä¿®æ£ããã®ã«åœ¹ç«ã¡ãŸãã ééã£ãŠé
眮ãããæ¬åŒ§ãã³ãŒããæ¢ãããããã¢ã«ãŽãªãºã ãšã³ãŒãã®æ確ãã«é¢ããã³ãŒã ã¬ãã¥ãŒã«éç¹ã眮ãæ¹ãã¯ããã«çç£çã§ãã
0. ããŒã«ã«ã€ããŠç¥ã
ãã¹ãŠã¯è©Šçšçããå§ãŸããŸãã å®éãããŒã«ãå®éã«èŠãããšããªãå Žåãéçºããã»ã¹ã«äœããå°å
¥ããããšã決å®ããã®ã¯å°é£ã§ãã ãããã£ãŠãæåã«è¡ãå¿
èŠãããã®ã¯ããŠã³ããŒãã§ã
ãã®æ®µéã§åŠã¶ããš:
- ã¢ãã©ã€ã¶ãŒãšå¯Ÿè©±ããæ¹æ³ã¯äœã§ããã
- ã¢ãã©ã€ã¶ãŒã¯éçºç°å¢ãšäºææ§ããããŸãã?
- çŸåšããªãã®ãããžã§ã¯ãã«ã¯ã©ã®ãããªåé¡ããããŸãã?
å¿
èŠãªãã®ããã¹ãŠã€ã³ã¹ããŒã«ããããæåã«ãããžã§ã¯ãå
šäœã®åæãå®è¡ããå¿
èŠããããŸã(
å®éãéçã¢ãã©ã€ã¶ãŒã¯éåžžã倧èŠæš¡ãªã³ãŒã ããŒã¹ãæã€ãããžã§ã¯ãã«å¯ŸããŠå€§éã®èŠåãçºè¡ããŸãã ãããžã§ã¯ãã¯ãã§ã«æ©èœããŠããããããã¹ãŠãä¿®æ£ããå¿
èŠã¯ãããŸãããã€ãŸãããããã®åé¡ã¯é倧ã§ã¯ãããŸããã ããããããªãã¯
å®éã178 件ã®èŠåã¯ãæ°å件ã®èŠåãããã¯ããã«èŠããããªããŸãã
ã¿ãå
M О ã㌠å€ãã®å Žåãé©åãªèŠåããããŸããããããã®ã«ããŽãªã«ã¯ã粟床 (ä¿¡é Œæ§) ãäœã蚺æãå«ãŸããŸãã Windows ã§åäœããããã®èŠåã¬ãã«ãšãªãã·ã§ã³ã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ãã: *
æãèå³æ·±ããšã©ãŒãæ£åžžã«ã¬ãã¥ãŒããããããæ£åžžã«ä¿®æ£ããããšã«ã¯äŸ¡å€ããããŸãã
1. èªåå
æ £ããŠãããããã©ã°ã€ã³ãèšå®ã㊠CI ã«çµ±åããŸãã ããã¯ãããã°ã©ããéçã¢ãã©ã€ã¶ãŒã®äœ¿çšãéå§ããåã«è¡ãå¿ èŠããããŸãã å®éã®ãšãããããã°ã©ãã¯åæãæå¹ã«ããããšãå¿ããããåæããŸã£ããããããªãå¯èœæ§ããããŸãã ãããè¡ãã«ã¯ããã¹ããããŠããªãã³ãŒããäžè¬çãªéçºãã©ã³ãã«å ¥ããªãããã«ããã¹ãŠã®æçµãã§ãã¯ãè¡ãå¿ èŠããããŸãã
ãã®æ®µéã§åŠã¶ããš:
- ãã®ããŒã«ã¯ã©ã®ãããªèªååãªãã·ã§ã³ãæäŸããŸããã
- ã¢ãã©ã€ã¶ãŒã¯ããªãã®çµã¿ç«ãŠã·ã¹ãã ãšäºææ§ããããŸãã?
å®ç§ãªããã¥ã¡ã³ãã¯ååšããªããããå Žåã«ãã£ãŠã¯æžã蟌ãå¿
èŠããããŸãã
次ã«ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ (CI) ãµãŒãã¹ã«ç§»ããŸãããã ã©ã®ãããªã¢ãã©ã€ã¶ãŒãæ·±å»ãªåé¡ãªããããã«å®è£ ã§ããŸãã ãããè¡ãã«ã¯ããã€ãã©ã€ã³å ã«å¥ã®ã¹ããŒãžãäœæããå¿ èŠããããŸããéåžžããã®ã¹ããŒãžã¯ãã«ããšåäœãã¹ãã®åŸã«é 眮ãããŸãã ããã¯ãããŸããŸãªã³ã³ãœãŒã« ãŠãŒãã£ãªãã£ã䜿çšããŠè¡ãããŸãã ããšãã°ãPVS-Studio ã¯æ¬¡ã®ãŠãŒãã£ãªãã£ãæäŸããŸãã
PVS-Studio_Cmd.exe (Windows äžã®ãœãªã¥ãŒã·ã§ã³ãC#ãC++ ãããžã§ã¯ãã®åæ)CLMonitor.exe (ã³ã³ãã€ã«ç£èŠ)pvs-ã¹ã¿ãžãªã¢ãã©ã€ã¶ãŒ (Linux / macOS äžã® C++ ãããžã§ã¯ãã®åæ)pvs-studio-dotnet (ãœãªã¥ãŒã·ã§ã³åæãLinux / macOS äžã® C# ãããžã§ã¯ã)pvs-studio.jar (Javaãããžã§ã¯ãã®åæ)ããã°ã³ã³ããŒã¿ãŒ (ã¬ããŒããã¡ã€ã«ã³ã³ããŒã¿ãŒ)
åæã CI ã«çµ±åããã«ã¯ã次㮠XNUMX ã€ã®ããšãè¡ãå¿ èŠããããŸãã
- ã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããŸãã
- åæãå®è¡ããŸãã
- çµæãåºããŸãã
ããšãã°ãPVS-Studio ã Linux (Debian ããŒã¹) ã«ã€ã³ã¹ããŒã«ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸãã
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
Windows ãå®è¡ããŠããã·ã¹ãã ã§ã¯ãããã±ãŒãž ãããŒãžã£ãŒããã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããæ¹æ³ã¯ãããŸããããã³ãã³ã ã©ã€ã³ããã¢ãã©ã€ã¶ãŒãå±éããããšã¯å¯èœã§ãã
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplications
Windows * ãå®è¡ããŠããã·ã¹ãã ãžã® PVS-Studio ã®å±éã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ã€ã³ã¹ããŒã«åŸãåæãçŽæ¥å®è¡ããå¿ èŠããããŸãã ãã ããã³ã³ãã€ã«ãšãã¹ããå®äºããåŸã«ã®ã¿ãããå®è¡ããããšããå§ãããŸãã ããã¯ãéç解æã«ã¯éåžžãã³ã³ãã€ã«ã® XNUMX åã®æéããããããã§ãã
èµ·åæ¹æ³ã¯ãã©ãããã©ãŒã ãšãããžã§ã¯ãã®æ©èœã«äŸåãããããäŸãšã㊠C++ (Linux) ã®ãªãã·ã§ã³ã瀺ããŸãã
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w
æåã®ã³ãã³ãã¯åæãå®è¡ããXNUMX çªç®ã®ã³ãã³ãã¯åæãå®è¡ããŸãã
泚æããŠãã ããã ããã¹ã圢åŒã¯äžäŸ¿ã§ãã ããã¯åãªãäŸãšããŠæäŸãããŠããŸãã ããã«èå³æ·±ãã¬ããŒã圢åŒã§ãã FullHtml ã«æ³šç®ããŠãã ããã ããã«ãããã³ãŒãå ã移åã§ããŸãã
CI ã§ã®åæã®ã»ããã¢ããã®è©³çŽ°ã«ã€ããŠã¯ãèšäºãããåç
§ããŠãã ããã
ããã§ããã«ã ãµãŒããŒäžã§ã¢ãã©ã€ã¶ãŒãæ§æãããŸããã ããã§ã誰ãããã¹ããããŠããªãã³ãŒããã¢ããããŒãããå Žåãæ€èšŒæ®µéã¯å€±æããåé¡ãæ€åºã§ããããã«ãªããŸãããã ãããã©ã³ããããŒãžãããåŸã§ã¯ãªããããžã§ã¯ãããã§ãã¯ããæ¹ãå¹ççã§ãããããããã¯å®å šã«äŸ¿å©ãšããããã§ã¯ãããŸããããã®åã®ããã« ãªã¯ãšã¹ãã®æ®µéã§ã
äžè¬ã«ããã« ãªã¯ãšã¹ãåæã®ã»ããã¢ããã¯ãCI ã§ã®éåžžã®åæã®éå§ãšããã»ã©å€ãããŸããã ãã ããå€æŽããããã¡ã€ã«ã®ãªã¹ããååŸããå¿ èŠãããå Žåãé€ããŸãã ãããã¯éåžžãgit ã䜿çšããŠãã©ã³ãéã®å·®ç°ãã¯ãšãªããããšã§ååŸã§ããŸãã
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
次ã«ããã®ãã¡ã€ã«ã®ãªã¹ããå ¥åãšããŠã¢ãã©ã€ã¶ãŒã«æž¡ãå¿ èŠããããŸãã ããšãã°ãPVS-Studio ã§ã¯ãããã¯ãã©ã°ã䜿çšããŠå®è£ ãããŸãã -S:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
ãã« ãªã¯ãšã¹ãã®åæã«ã€ããŠè©³ããã¯ããã¡ããã芧ãã ãã *
ãã« ãªã¯ãšã¹ãã®åæãèšå®ãããšãèŠåãå«ãã³ãããããããã¯ã§ããããããã¹ããããŠããªãã³ãŒããè¶ããããªãå¢çãäœæãããŸãã
確ãã«ããã¯ãã¹ãŠè¯ãããšã§ããããã¹ãŠã®èŠåã XNUMX ãæã§ç¢ºèªã§ããããã«ããããšèããŠããŸãã éçã¢ãã©ã€ã¶ãŒã ãã§ãªããåäœãã¹ããåçã¢ãã©ã€ã¶ãŒããã䜿çšã§ããŸãã ããã«ã¯ããŸããŸãªãµãŒãã¹ããã©ã°ã€ã³ããããŸãã ããšãã°ãPVS-Studio ã«ã¯ã
2. éçºè ãã·ã³ãžã®çµ±å
次ã«ãæ¥åžžã®éçºã§äœ¿çšããããã«ã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããŠæ§æããŸãã ãã®æç¹ã§ãã§ã«ã»ãšãã©ã®äœæ¥æ¹æ³ã«æ £ããŠããããããããæãç°¡åãªéšåãšèšããŸãã
æãç°¡åãªãªãã·ã§ã³ãšããŠãéçºè
ã¯å¿
èŠãªã¢ãã©ã€ã¶ãŒãèªåã§ã€ã³ã¹ããŒã«ã§ããŸãã ãã ããããã«ã¯æéãããããéçºã«éäžã§ããªããªããããã€ã³ã¹ããŒã©ãŒãšå¿
èŠãªãã©ã°ã䜿çšããŠãã®ããã»ã¹ãèªååã§ããŸãã PVS-Studio ã«ã¯ããŸããŸãªãã®ããããŸã
次ã«ãå¿
èŠãªãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸããããšãã°ã
3. æ¥åžžäœ¿çš
ãã®æ®µéã§ã¯ãæ¥åžžäœ¿çšäžã«ã¢ãã©ã€ã¶ãŒãé«éåããæ¹æ³ã«ã€ããŠå°ã説æããŸãã ãããžã§ã¯ãå
šäœã®å®å
šãªåæã«ã¯å€ãã®æéãããããŸããããããžã§ã¯ãå
šäœã®ã³ãŒããäžåºŠã«å€æŽããé »åºŠã¯ã©ããããã§ãããã? ã³ãŒãããŒã¹å
šäœã«çŽã¡ã«åœ±é¿ãäžããã»ã©å€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ã¯ã»ãšãã©ãããŸããã äžåºŠã«å€æŽããããã¡ã€ã«ã®æ°ã XNUMX ãè¶
ããããšã¯ã»ãšãã©ãªããããããããåæããããšã¯çã«ããªã£ãŠããŸãã ãã®ãããªç¶æ³ã«å¯ŸããŠã¯ã
ã¢ãã©ã€ã¶ãŒã¯ãæè¿å€æŽãããã³ãŒãå ã§åé¡ãæ€åºããå Žåããããåå¥ã«å ±åããŸãã ããšãã°ãPVS-Studio ã¯ã¢ã©ãŒãã䜿çšããŠããã«ã€ããŠéç¥ããŸãã
ãã¡ãããéçºè
ã«ãã®ããŒã«ã䜿çšããããã«æ瀺ããã ãã§ã¯ååã§ã¯ãããŸããã ç§ãã¡ã¯ããããäœã§ããããããã©ã®ãããªãã®ã§ããããäœããã®æ¹æ³ã§åœŒãã«äŒããå¿
èŠããããŸãã ããšãã°ãããã«ã¯ PVS-Studio ã®ã¯ã€ã㯠ã¹ã¿ãŒãã«é¢ããèšäºããããŸããã奜ã¿ã®ããŒã«ã«ã€ããŠã¯åæ§ã®ãã¥ãŒããªã¢ã«ãèŠã€ããããšãã§ããŸãã
Windows 㧠PVS-Studio ãå®è¡ããæ¹æ³ (CãC++ãC#) Linux ããã³ macOS 㧠PVS-Studio ãå®è¡ããæ¹æ³ (CãC++) PVS-Studio Java ã®èµ·åæ¹æ³
ãã®ãããªèšäºã«ã¯ãæ¥åžžäœ¿çšã«å¿ èŠãªãã¹ãŠã®æ å ±ãèšèŒãããŠãããããã»ã©æéã¯ããããŸããã ð
ããŒã«ã«æ £ãã段éã§ããæåã®èµ·åæã«å€ãã®èŠåãæå¶ããŸããã æ®å¿µãªãããéçã¢ãã©ã€ã¶ãŒã¯å®ç§ã§ã¯ãªããããæã 誀æ€ç¥ãçºçããããšããããŸãã éåžžãããããæå¶ããã®ã¯ç°¡åã§ããããšãã°ãVisual Studio ã® PVS-Studio ãã©ã°ã€ã³ã§ã¯ããã¿ã³ã XNUMX ã€ã¯ãªãã¯ããã ãã§ãã
ãã ããåã«æå¶ããã ãã§ã¯ãããŸããã ããšãã°ãåé¡ããµããŒãã«å ±åã§ããŸãã 誀æ€ç¥ãä¿®æ£ã§ããã°ãä»åŸã®æŽæ°ã§ãã³ãŒãããŒã¹ã«ç¹æã®èª€æ€ç¥ãã©ãã©ãæžã£ãŠããããšãããããŸãã
çµ±ååŸ
ãã®ãããç§ãã¡ã¯éçåæãéçºããã»ã¹ã«çµ±åãããã¹ãŠã®æ®µéãçµãŠããŸããã ãã®ãããªããŒã«ã CI ã«ã»ããã¢ããããããšã®éèŠæ§ã«ãããããããããŒã«ãå®è¡ããæãéèŠãªå Žæã¯éçºè ã®ã³ââã³ãã¥ãŒã¿ãŒã§ãã çµå±ã®ãšãããéçã¢ãã©ã€ã¶ãŒã¯ãé ãé¢ãããšããã§ãã®ã³ãŒãã¯ãã¡ã ãšèšãè£å€å®ã§ã¯ãããŸããã éã«ãç²ããŠãããã©ãããæããŠãããããå¿ãç©ãããŠããã°æãåºãããŠãããã¢ã·ã¹ã¿ã³ãã§ãã
確ãã«ãéç解æãå®æçã«äœ¿çšããªãéããéçºãå€§å¹ ã«ç°¡çŽ åãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã çµå±ã®ãšãããéçºè ã«ãšã£ãŠã®äž»ãªå©ç¹ã¯ãã³ãŒãã®è€éã§ç©è°ãéžãã»ã¯ã·ã§ã³ãæ€çŽ¢ããããšã§ã¯ãªããæ©æã«æ€åºããããšã«ãããŸãã ç·šéå 容ããã¹ãã«éä¿¡ããåŸã«åé¡ãçºèŠããã®ã¯äžå¿«ãªã ãã§ãªããéåžžã«æéããããããšã«åæããŸãã éçåæãå®æçã«äœ¿çšãããšãã³ã³ãã¥ãŒã¿ãŒäžã®ãã¹ãŠã®å€æŽãçŽæ¥èª¿ã¹ãããã³ãŒãã®äœæ¥äžã«çãããå Žæãå ±åãããŸãã
ããªããããªãã®ååãã¢ãã©ã€ã¶ãŒãå®è£
ãã䟡å€ããããã©ãããŸã ããããªãå Žåã¯ãä»ããèšäºãèªã¿å§ããããšããå§ãããŸãã
ãã®èšäºãè±èªåã®èªè
ãšå
±æãããå Žåã¯ã翻蚳ãªã³ã¯ãMaxim Zvyagintsevãã䜿çšããŠãã ããã
åºæïŒ habr.com