GolangïŒç¥ããŠGoïŒã¯ãæå¿«ããã·ã³ãã«ãããããŠããã©ãŒãã³ã¹ãæ žãšããŠèšèšãããŸãããäžŠè¡æ§ã¢ãã«ãæå°éã®æ§æããããŠåŒ·åãªåä»ãã¯ãé«éã§ä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãæ§ç¯ããããã®åŒ·åãªéžæè¢ãšãªããŸããããããèšèªã®åŒ·ã¿ã ãã§ã¯ãå€§èŠæš¡ã§è€éãªã³ãŒãããŒã¹ã®é·æçãªå質ãä¿èšŒããããšã¯ã§ããŸãããããã§éçè§£æããŒã«ãäžå¯æ¬ ã«ãªããŸããéçè§£æããŒã«ã¯ãéçºè ãåé¡ãæ©æã«ç¹å®ããä¿å®æ§ãåäžãããããŒã ããããžã§ã¯ãéã§ã³ãŒãã®å¥å šæ§ã®äžè²«æ§ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã
éçè§£æã¯ãã³ãŒããå®è¡ããã«æ€æ»ããŸãããããã®ããŒã«ã¯ãè«çãšã©ãŒãããã©ãŒãã³ã¹ã®ããã«ããã¯ãã³ãŒãã®éè€ãã¹ã¿ã€ã«éåãæœåšçãªã»ãã¥ãªãã£è匱æ§ãªã©ãå¹ åºãåé¡ãæããã«ããŸããGoèšèªã§æžããã忣ã·ã¹ãã ãããã¯ãšã³ããµãŒãã¹ãã€ã³ãã©ã©ã€ãã©ãªãéçºããéçºè ã«ãšã£ãŠãäºçްãªãã¹ã§ãããéçšäžã®é倧ãªåé¡ã«çºå±ããå¯èœæ§ããããŸãããããã®ãã¹ãæ©æã«æ€åºããããšã¯ãåã«æçã§ããã ãã§ãªããäžå¯æ¬ ã§ãã
Goã¯ç¹ã«éçè§£æã«é©ããŠããŸããã³ã³ãã€ã©ã¯å³å¯ã§ãæ§æã¯äºæž¬å¯èœã§ããããšã³ã·ã¹ãã ã¯èªååã«æ·±ãæè³ãããŠããŸãã go vet, go fmt, golint ãããã¯é·å¹ŽãGoã®æšæºããŒã«ãã§ãŒã³ã®äžéšã§ãããããããããã以å€ã«ããé«åºŠãªã¢ãã©ã€ã¶ãŒããªã³ã¿ãŒãã»ãã¥ãªãã£ã¹ãã£ããŒãã³ãŒãå質ãã©ãããã©ãŒã ãããªããããåºç¯ãªãšã³ã·ã¹ãã ãååšããŸããGoã®æ
£çšçãªèŠçŽã®é©çšã«éç¹ã眮ããã®ãããã°ã䞊è¡ã³ãŒãã«ããã埮åŠãªãã°ã®çºèŠã«ç¹åãããã®ããããå®çšŒåã¬ãã«ã®ã·ã¹ãã ã®ã»ãã¥ãªãã£ç£æ»ããµããŒããããã®ãããã€ãç»å ŽããŠããŸãã
æ¡å€§ãç¶ããã³ãŒãããŒã¹ã管çããéçºè ã«ãšã£ãŠãé©åãªéçè§£æããŒã«ãå°å ¥ããããšã§ããªã³ããŒãã£ã³ã°ã®è¿ éåãã¬ãã¥ãŒã®ãªãŒããŒãããã®åæžããããŠãªã°ã¬ãã·ã§ã³ã®é²æ¢ãå¯èœã«ãªããŸããå°èŠæš¡ãªããŒã ã§ã¯ããããã®ããŒã«ã¯ã»ãŒããã£ããããšããŠæ©èœããŸãããšã³ã¿ãŒãã©ã€ãºç°å¢ã§ã¯ãå€§èŠæš¡ãªäžè²«æ§ãšã³ã³ãã©ã€ã¢ã³ã¹ã®ç¢ºä¿ã«åœ¹ç«ã¡ãŸãã
ãã®ã¬ã€ãã§ã¯ãGoèšèªã§æã广çã§åºã䜿çšãããŠãã20çš®é¡ã®éçè§£æããŒã«ã玹ä»ããŸããåããŒã«ã¯ããã®éç¹åéã匷ã¿ãçµ±åæ©èœããããŠå®éã®éçºãã€ãã©ã€ã³ã«ãããé¢é£æ§ã«åºã¥ããŠè©äŸ¡ãããŠããŸããæ°ãããããžã§ã¯ããéå§ããå Žåã§ããæ¢åã®ãããžã§ã¯ããæ¹åããå Žåã§ãããããã®ããŒã«ã¯ãããã¯ãªãŒã³ã§å®å šããããŠä¿å®æ§ã®é«ãGoã³ãŒããèªä¿¡ãæã£ãŠèšè¿°ããã®ã«åœ¹ç«ã¡ãŸãã
SMART TS XL
SMART TS XL ã¯ãåŸæ¥ã®ãªã³ã¿ãŒãåé§ããã¬ãã«ã®æ·±åºŠã§ãå€§èŠæš¡ãªGoã³ãŒãããŒã¹ã®è€éããåŠçããããã«èšèšããã匷åãªéçè§£æãã©ãããã©ãŒã ã§ããå ã ã¯ã¬ã¬ã·ãŒã³ãŒãè§£æçšã«æ§ç¯ãããŸããããçŸåšã§ã¯ãã€ã¯ããµãŒãã¹ãã¢ããªã¹ããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ã·ã¹ãã ã«ãããææ°ã®Goèšèªã¢ããªã±ãŒã·ã§ã³åãã«å ç¢ãªæ©èœãæäŸããŠããŸãã
ã¹ã¿ã€ã«ããã©ãŒãããã®ã¿ã«çŠç¹ãåœãŠãããŒã«ãšã¯ç°ãªãã SMART TS XL ã³ãŒãããŒã¹ã®è©³çްãªã»ãã³ãã£ãã¯ã¢ãã«ãæ§ç¯ããŸããå®è¡ããžãã¯ãåæå®è¡åäœããµãŒãã¹éã®ããŒã¿ãããŒãåæããåºæ¬çãªæ§æãã§ãã¯ã§ã¯ç¹å®ãé£ãããªã¹ã¯ãæããã«ããŸãã
äž»ãªæ©èœ SMART TS XL Go ã®å Žåã¯æ¬¡ã®ãšããã§ãã
- å¶åŸ¡ãããŒåæ
ãŽã«ãŒãã³ããã£ãã«ãselectãããã¯ã颿°ãæ€åºå¯Ÿè±¡:- å°éäžèœã³ãŒã
- ãããããã¯
- ç¡éã«ãŒã
- ãããã¯ãžã®å¯ŸåŠãæ ã£ã
- ããã·ãŒãžã£éããŒã¿ãããŒè¿œè·¡
倿°ã®ç¶æ ãã€ã³ã¿ãŒãã§ãŒã¹ã®äœ¿çšãããã±ãŒãžéã®ããŒã¿ç§»åããã¬ãŒã¹ããŸãã以äžã®ç¹å®ã«åœ¹ç«ã¡ãŸãã- å€ããŸãã¯æ€èšŒãããŠããªãå ¥å
- æªäœ¿çšã®å²ãåœãŠ
- åæå®è¡æ§ã«é¢é£ããããŒã¿ã®ç«¶å
- äŸåé¢ä¿ãããã³ã°ãšã¢ãŒããã¯ãã£ç£æ»
ããã±ãŒãžãã¢ãžã¥ãŒã«ããµãŒãã¹ãã©ã®ããã«çžäºäœçšããããã°ã©ãã£ã«ã«ã«è¡šç€ºããŸããæ¬¡ã®å Žåã«äŸ¿å©ã§ãã- ã¿ã€ãã«ãããªã³ã°ã®æ€åº
- ã¯ãªãŒã³ãªã¬ã€ã€ãªã³ã°ã«ãŒã«ã®é©çš
- ãªãã¡ã¯ã¿ãªã³ã°ããŒããããã®æºå
- éçã»ãã¥ãªãã£ã¹ãã£ã³
次ã®ãããªåé¡ããã©ã°ä»ãããŸã:- å®å šã§ãªãæšæºã©ã€ãã©ãªã®äœ¿çš
- ããŒãã³ãŒããããè³æ Œæ å ±
- åå°ããŒã¹ã®è匱æ§
- ææãªãã£ãŒã«ããžã®é²åº
- ãšã³ã¿ãŒãã©ã€ãºèŠæš¡ã®å¯èŠå
ããŒã å šäœã®çè§£ãšèšç»ããµããŒãããããã«ã詳现ãªå³ããã㌠ãããã圱é¿ã¬ããŒããçæããŸãã
SMART TS XL è€éæ§ãé«ãã皌åæéèŠä»¶ãå³ããå€§èŠæš¡ãªGoã³ãŒãããŒã¹ãæ±ãããŒã ã«ç¹ã«é©ããŠããŸããCI/CDã¯ãŒã¯ãããŒãžã®çµ±åããµããŒãããæé·ããã·ã¹ãã å šäœã®åè³ªç¶æãæ¯æŽãããªãã¡ã¯ã¿ãªã³ã°ãšã¢ããã€ãŒãŒã·ã§ã³ã®åãçµã¿ã«èªä¿¡ãäžããŸãã
GolangCI ãªã³ã
GolangCI ãªã³ã golangci-lintã¯ãGoãšã³ã·ã¹ãã ã§æã人æ°ããããåºãæ¡çšãããŠããã¡ã¿ãªã³ã¿ãŒããŒã«ã®äžã€ã§ããè€æ°ã®ãªã³ã¿ãŒãåæã«å®è¡ããããã®çµ±åã€ã³ã¿ãŒãã§ãŒã¹ãšããŠæ©èœããéçºè ã¯ã³ãŒãããŒã¹å šäœã§å¹ åºãéçãã§ãã¯ãè¿ éãã€äžè²«ããŠå®è¡ã§ããŸãã50以äžã®åå¥ã®ãªã³ã¿ãŒãXNUMXã€ã®ã³ãã³ãã§ãµããŒãããgolangci-lintã¯ãã¹ã¿ã€ã«ã®åŒ·å¶ãè€éãã®ãã§ãã¯ããããšã©ãŒåŠçãã¿ãŒã³ãæªäœ¿çšã³ãŒãã®æ€åºãŸã§ãããããåŠçãå¹çåããŸãã
é«éæ§ãæè»ãªèšå®ããããŠCI/CDç°å¢ã§ã®å®è¡èœåã«ããã軜éã§ãããªãã广çãªéçè§£æãæ±ããããŒã ã«ãšã£ãŠæé©ãªéžæè¢ãšãªã£ãŠããŸãããŸããã«ã¹ã¿ã èšå®ããªã³ã¿ãŒé€å€ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ããããŠåºåãã©ãŒãããããµããŒããããšãã£ã¿ããã€ãã©ã€ã³ãšã®ã·ãŒã ã¬ã¹ãªçµ±åãå®çŸããŸãã
golangci-lint ã®æ¬ ç¹
golangci-lint ã«ã¯é·æããããŸãããéçºè ãèæ ®ãã¹ãéèŠãªãã¬ãŒããªããããã€ããããŸãã
- 衚é¢ã¬ãã«ã®æ€æ»ã®ã¿
golangci-lint ã¯å€ãã®ãªã³ã¿ãŒãçµã¿åãããŠããŸããããã®ã»ãšãã©ã¯æµ ãæ§æã¬ãã«ãŸãã¯ãã¥ãŒãªã¹ãã£ãã¯ã¬ãã«ã§åäœããŸããgolangci-lint ã¯æ·±ãå¶åŸ¡ãããŒãããŒã¿ãããŒè§£æã¯è¡ããŸãããè€æ°ã®ãã¡ã€ã«ã«ããã倿°ã®ç¶æ ã远跡ãããã䞊è¡ããžãã¯ã«æœãå®è¡ãªã¹ã¯ãæ€åºãããããããšã¯ã§ããŸããã - éå®çãªåæå®è¡æ§èªè
golangci-lint ã®ããŒã«ã¯ãgoroutineããã£ãã«ããŸã㯠select ãããã¯ã«ã€ããŠãæå³çã«å®å šãªæ¹æ³ã§ã¢ãã«åãããæšè«ãããããããšã¯ã»ãšãã©ãããŸããããã®çµæãããé«åºŠãªã¢ãã©ã€ã¶ãŒãæ€åºã§ããç«¶åãçºçãããããã¿ãŒã³ããããããã¯ãèŠéããŠããŸãå¯èœæ§ããããŸãã - ããã·ãŒãžã£éãããŒã®è¿œè·¡ãªã
ã¡ã¿ãªã³ã¿ãŒã¯ãããã±ãŒãžã颿°ã®å¢çãè¶ããå®å šãªããã°ã©ã è§£æããµããŒãããŠããŸãããå€§èŠæš¡ãªã³ãŒãããŒã¹ã§ã¯äžå¯æ¬ ãªãæ±æè¿œè·¡ãäŸåé¢ä¿ã°ã©ãã®è§£æ±ºãã³ãŒã«ã°ã©ãè§£æãšãã£ãæ©èœãæ¬ ããŠããŸãã - ã»ãã¥ãªãã£ã«ãã¬ããžã®ã®ã£ãã
åºæ¬çãªã»ãã¥ãªãã£ãªã³ã¿ãŒãå«ãŸããŠããŸãããgosecãããã®ããŒã«ã¯ã·ã°ããã£ããŒã¹ã§ã«ãŒã«ã«å¶éããããã³ã³ããã¹ãäŸåã®è匱æ§ãå®å šã§ãªãå¶åŸ¡ãã¹ãå®å šã§ãªãæšæºã©ã€ãã©ãªæ©èœã®äžæ£äœ¿çšãå€§èŠæš¡ã«æ€åºããããšã¯ã§ããŸããã - ãªã³ã¿ãŒãã€ãºã®ãªãŒããŒããã
æ°åã®ãªã³ã¿ãŒãããã©ã«ãã§æå¹ã«ãªã£ãŠãããããgolangci-lint ã¯èšå€§ãªéã®åºåãçæããå¯èœæ§ãããããã®çµæãã¢ã©ãŒãç²ãããå®éã®åé¡ã誀ã£ãŠç¡èŠãããå¯èœæ§ããããŸããçµæãå®çšçãªãã®ã«ããã«ã¯ãèšå®ã埮調æŽããå¿ èŠãããããšããããããŸãã
GolangCI Lintã¯ãGoã³ãŒãã®å質ãå®ãããã®è²Žéãªç¬¬äžç·ã§ããããããããã·ã§ã³ã¯ãªãã£ã«ã«ãªã·ã¹ãã ãå€§èŠæš¡ãªã¢ãã¬ããžããªãè€éãªããžãã¹ããžãã¯ãæ±ãããŒã ã§ã¯ãå®å šæ§ãäžŠè¡æ§ãä¿å®æ§ã«é¢ããŠãã匷åãªä¿èšŒãæäŸãããããé«åºŠãªã»ãã³ãã£ãã¯ã¢ãã©ã€ã¶ãŒã§è£å®ããå¿ èŠããããããããŸããã
éçãã§ãã¯
éçãã§ã㯠ã¯ã粟床ãããã©ãŒãã³ã¹ããããŠå®äžçãžã®é©åæ§ã®ãã©ã³ã¹ã«åªããŠããããšã§ç¥ããããæãè©äŸ¡ã®é«ãGoèšèªçšéçè§£æããŒã«ã®äžã€ã§ããDominik Honnefæ°ã«ãã£ãŠéçºãããStaticcheckã¯ãåãªãã¹ã¿ã€ã«åŒ·å¶ã«ãšã©ãŸãããåé·ãªæŒç®ã誀ã£ãå倿ãããã©ãŒãã³ã¹äžã®èœãšã穎ãçãããã³ãŒãæ§é ãšãã£ããããã°ã©ãã³ã°äžã®åŸ®åŠãªåé¡ãç¹å®ããŸãã
åºæ¬çãªãªã³ã¿ãŒãšã¯ç°ãªããStaticcheckã¯æ·±ãèšèªçè§£ã«åºã¥ããç¬èªã®æŽå¯ãæäŸããŸããGoã³ãŒããåæããŠãäžè¬çãªãã°ãAPIã®èª€çšãå±éºãªã€ãã£ãªã ãæ€åºããŸãã蚺æçµæã¯ããã¹ã§ããå¯èœæ§ãé«ããæå³çãªãšããžã±ãŒã¹ã§ã¯ãªãå¯èœæ§ã®é«ãåé¡ãåæ ããããã«æ éã«ãã¥ã¬ãŒã·ã§ã³ãããŠãããããå°èŠæš¡ããŒã ãããšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ãããžã§ã¯ããŸã§ãå¹ åºããŠãŒã¶ãŒããä¿¡é ŒãããŠããŸãã
IDEãCIã·ã¹ãã ãšããŸãçµ±åããã golangci-lint ãã©ã°ã€ã³ãšããŠäœ¿çšã§ããŸããStaticcheckã¯ã¢ãžã¥ãŒã«ããµããŒãããããã±ãŒãžã®å¢çãè¶ããŠåäœãããããæ¬çªç°å¢ãœãããŠã§ã¢ã«ãããã³ãŒãã®å¥å
šæ§ãšä¿¡é Œæ§ã®åŒ·åãªããŒã¹ã©ã€ã³ããŒã«ãšãªããŸãã
Staticcheckã®å¶éãšãã¬ãŒããªã
Staticcheck ã¯å ç¢ã§ææ ®æ·±ãèšèšãããŠããŸãããå®å šã«ã«ããŒãããŠããªãé åãããã€ããããŸãã
- å®å
šãªããã°ã©ã åæã®æ¬ åŠ
Staticcheckã¯ããã±ãŒãžã¬ãã«ã§ã³ãŒããæ€æ»ããŸãããå€§èŠæš¡ãªã³ãŒãããŒã¹å šäœã«ãããå®å šãªã³ãŒã«ã°ã©ããæ§ç¯ããããæšªæçã«èª¿æ»ãããããããšã¯ã§ããŸãããããã¯ãæ·±ãçžäºæ¥ç¶ãããã·ã¹ãã ããã€ã¯ããµãŒãã¹ã®å ŽåãããŒã¿ãããŒã®ç Žæãããã±ãŒãžéã®å¯äœçšãšãã£ãå¢çãè¶ããåé¡ãèŠéãå¯èœæ§ãããããšãæå³ããŸãã - 詳现ãªããŒã¿ãããŒãæ±æåæã¯è¡ãããªã
Staticcheckã¯è«ççãªèª€ããæ€åºããèœåã«åªããŠããŸããã颿°ãã§ãŒã³å ã§ããŒã¿ãã©ã®ããã«ç§»åããããä¿¡é Œã§ããªãå ¥åãéèŠãªæäœã«ã©ã®ããã«å°éãããã远跡ããããšã¯ã§ããŸããããã®ãããé«åºŠãªã»ãã¥ãªãã£åæãããŒã¿ã©ã€ããµã€ã¯ã«ã®ç£æ»ã«ã¯é©ããŠããŸããã - éå®çãªåæå®è¡ã¢ããªã³ã°
Goã®äžŠè¡æ§ã¢ãã«ã¯ããŽã«ãŒãã³ããã£ãã«ããããŠselectã¹ããŒãã¡ã³ããStaticcheckã¯ããã§ã¯éå®çãªã«ãã¬ããžããæäŸããŸãããåæå®è¡ãã¹ã®ã·ãã¥ã¬ãŒã·ã§ã³ããã£ãã«ã®èª€çšæ€åºãæœåšçãªãããããã¯ãç«¶åãªã¹ã¯ã®æ€èšŒã¯è¡ããŸããã - èšå®å¯èœãªã«ãŒã«ãšã³ãžã³ãªã
ãã®ããŒã«ã¯æå³çã«ç¬èªã®ä»æ§ãæ¡çšããŠããããŠãŒã¶ãŒãç°¡åã«ã«ãŒã«ãäœæãããã«ã¹ã¿ãã€ãºãããã§ããªãããã«ãªã£ãŠããŸãããã®èšèšã«ããäžè²«æ§ã¯åäžããŸãããçµç¹åºæã®ããªã·ãŒãåœåèŠåãé©çšãããããŒã ã«ãšã£ãŠã¯æè»æ§ãå¶éãããŸãã - èšèšã«ããçãçŠç¹
Staticcheckã¯ãä»ã®ããŒã«ãæäŸããæ©èœã®éè€ãæå³çã«é¿ããŠããŸããgosec,gosimpleãŸãã¯unusedããã«ãããç¡é§ãåæžãããŸãããå®å šãªã¹ãã¯ãã«ã®éçåæãå®çŸããã«ã¯ãããŒã ãä»ã®ããŒã«ã§è£å®ããå¿ èŠãããããšãæå³ããŸãã
Staticcheckã¯ãããããGoãããžã§ã¯ãã«ãããŠãé«ä¿¡å·ã»äœãã€ãºã®å質ãã§ãã«ãŒãšããŠæé©ã§ããä¿å®æ§ãåäžããããããããã¹ãæ©æã«çºèŠã§ããŸãããã¢ãŒããã¯ãã£æ€èšŒã䞊è¡åŠçã®æ£ç¢ºæ§ããããã¯è©³çްãªè匱æ§ã¹ãã£ã³ãªã©ãããå°éçãªããŒã«ãšäœµçšããå¿ èŠããããŸãã
ç£å»ã«è¡ã
ç£å»ã«è¡ã GoããŒã«ãã§ãŒã³ã«ãã³ãã«ãããŠããå ¬åŒã®éçè§£æããŒã«ã§ããã³ã³ãã€ã©ã§ã¯æ€åºãããªããã®ã®ããã°ã®åå ãšãªãå¯èœæ§ã®ããGoããã°ã©ã ã®åŸ®åŠãªãã¹ãç¹å®ããããã«èšèšãããŠããŸããGo Vetã¯ãæ£ããã³ã³ãã€ã«ããããã®ã®ãå±éºãªãã¿ãŒã³ã誀ã£ããã¿ãŒã³ãå«ãå¯èœæ§ã®ããã³ãŒãããã§ãã¯ããããŒã«ãšããŠããç¥ãããŠããŸãã
äžæ£äœ¿çšãªã©ã®åé¡ããã§ãã¯ããŸã Printf ãã©ãŒãããåè©ãã·ã£ããŠå€æ°ãå°éäžèœã³ãŒãããããŠå®å
šã§ãªãåã¢ãµãŒã·ã§ã³ãšãã£ãåé¡ããããŸããGo Vetã¯Goã³ã¢ããŒã ã«ãã£ãŠéçºã»ä¿å®ãããŠãããããèšèªãšå
±ã«é²åããæ
£çšçãªæåŸ
ãåæ ããŠããŸããé«éã«åäœãããã€ãã£ãã«çµ±åãããŠããŸãã go ã³ãã³ããå®è¡ããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ ã¯ãŒã¯ãããŒãŸãã¯éçºè
ããŒã«ã§ä¿¡é Œæ§ã®é«ã第äžç·æ€èšŒãæäŸããŸãã
Go Vetã¯vetãã§ãã«ãŒãä»ããŠæ¡åŒµå¯èœã§ãç¹å®ã®ã¢ãã©ã€ã¶ãŒãæå¹åãŸãã¯ç¡å¹åããããšã§ãéå®çãªã«ã¹ã¿ãã€ãºãå¯èœã§ãããã©ãŒããã¿ããªã³ã¿ãŒãšäœµçšããæ§é åãããéçºããã»ã¹ã®äžéšãšããŠç¶ç¶çã«äœ¿çšãããšãæã广çã§ãã
Go Vetã®ã®ã£ãããšå¶çŽ
Go Vetã¯ä¿¡é Œæ§ã®é«ãéçãã§ãã«ãŒã§ãããå æ¬çãªåæãæäŸããããšãç®çãšãããã®ã§ã¯ãããŸãããéçºè ã¯ã以äžã®å¶éäºé ã«æ³šæããå¿ èŠããããŸãã
- æµ
ãéçã¹ã³ãŒã
Go Vet ã¯äž»ã«ããŒã«ã«ããã±ãŒãžäžã§åäœããäŸåé¢ä¿ããªãŒå šäœãã¢ããªã±ãŒã·ã§ã³å šäœã®ãããŒãèµ°æ»ããããšã¯ãããŸãããå€§èŠæš¡ãªã³ãŒãããŒã¹ã«ãããããã±ãŒãžéãšã©ãŒãã¢ãŒããã¯ãã£éåããµãŒãã¹éã®å¯äœçšãæ€åºããããšã¯ã§ããŸããã - ã»ãã³ãã£ãã¯ãããŒã®èªèãªã
ãã®ããŒã«ã¯ããŒã¿ãå¶åŸ¡ãããŒãã¢ãã«åããŸãããã€ãŸããæ¡ä»¶ãåžžã«åœã§ãããã©ããã倿°ã颿°éã§äœ¿çšãããŠããªããã©ããã颿°åŒã³åºããæå³ããç¶æ ããžãã¯ãç Žç¶»ãããŠãããã©ãããªã©ãæ€åºã§ããŸãããããè©³çŽ°ãªæ€èšŒã«ã¯ãStaticcheckã SMART TS XL ããé©ããŠããŸãã - åºæ¬çãªåæå®è¡åŠç
Go Vet ã«ã¯ã䞊è¡åŠçããªããã£ãã®æå°éã®è§£ææ©èœããå«ãŸããŠããŸãããgoroutine ã®åäœããã£ãã«èª¿æŽãã¡ã¢ãªç«¶åã®è§£æã¯è¡ãããªãããã䞊è¡åŠçãå€çšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã®æçšæ§ãéå®ãããŸãã - æå°éã®ã»ãã¥ãªãã£ã€ã³ãµã€ã
ãã®ããŒã«ã¯ãæªãã§ãã¯ã®å ¥åãå®å šã§ãªããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãèªèšŒæ å ±ã®æŒæŽ©ãšãã£ãã»ãã¥ãªãã£äžã®æ¬ é¥ãæ€åºããããã«ã¯èšèšãããŠããŸãããéçºè ã¯ã以äžã®ããŒã«ãšçµã¿åãããå¿ èŠããããŸããgosecåºæ¬çãªè匱æ§ã¹ãã£ã³ã«ã䜿çšã§ããŸãã - ã³ãŒãã®å質ãã¹ã¿ã€ã«ã®åŒ·å¶ãªã
Go Vetã¯ãªã³ã¿ãŒã§ã¯ãããŸãããã³ãŒãã¹ã¿ã€ã«ãåœåèŠåããã©ãŒãããã匷å¶ãããã®ã§ã¯ãããŸããããããã®ã¿ã¹ã¯ã«ã¯ã次ã®ãããªããŒã«ã圹ç«ã¡ãŸããgolangci-lint,reviveãŸãã¯golintå¿ èŠãšãããŸãã - å¶éãããæ§æãªãã·ã§ã³
åã ã® vet ãã§ãã¯ãæå¹ãŸãã¯ç¡å¹ã«ããããšã¯ã§ããŸãããGo Vet ã«ã¯é«åºŠãªã«ãŒã«ã®ã«ã¹ã¿ãã€ãºããŠãŒã¶ãŒå®çŸ©ã®ãã¿ãŒã³ã®ãµããŒããã«ã¹ã¿ã ãªã³ã¿ãŒãšã®çµ±åããããŸããã
ãŸãšãããšãGo Vetã¯Goéçºã¯ãŒã¯ãããŒã«èªç¶ã«ãã£ããããã軜éã§ä¿¡é Œæ§ã®é«ããµããã£ãã§ãã«ãŒã§ããæãããªãã¹ãæ€åºããããã®åºç€ããŒã«ãšããŠäœ¿çšããã®ãæé©ã§ãããã³ãŒãã®æ£ç¢ºæ§ãä¿å®æ§ãã»ãã¥ãªãã£ãå®å šã«ä¿èšŒããã«ã¯ã远å ã®ã¢ãã©ã€ã¶ãŒã远å ããå¿ èŠããããŸãã
埩掻ããã
埩掻ããã ã¯ãçŸåšã¡ã³ããã³ã¹ãããŠããªãGoã®é«éã§æ¡åŒµå¯èœã§èšå®å¯èœãªãªã³ã¿ãŒã§ãã golint æè»æ§ãããã©ãŒãã³ã¹ããããŠææ°ã®ã«ãŒã«ã»ãããæäŸããããšã§ãRevive ã¯ãããããã€ã³åã®ä»£æ¿ãšããŠæ§ç¯ãããéçºè
ã®ã³ââã³ãããŒã«ãã¹ããŒããç ç²ã«ããããšãªããææ°ã® Go ãããžã§ã¯ãã«ã¹ã¿ã€ã«ã®åŒ·å¶ãšã³ãŒãã®äžè²«æ§ããããããŸãã
Reviveã®æå€§ã®åŒ·ã¿ã®äžã€ã¯ ã«ã¹ã¿ãã€ãºæ§éçºè ã¯èšå®ãã¡ã€ã«ã䜿çšããŠãã«ãŒã«ãåå¥ã«æå¹åãç¡å¹åããŸãã¯åŸ®èª¿æŽã§ããŸããããŒã ã¯ãããžã§ã¯ãã®ããŒãºã«åºã¥ããŠç¬èªã®ã«ãŒã«ã»ãããå®çŸ©ããåœåèŠåãããã¥ã¡ã³ãèŠä»¶ãã¹ããŒã¹ã«ãŒã«ãªã©ã®æšæºãé©çšã§ããŸãããŸããGoãã©ã°ã€ã³ã«ããã«ã¹ã¿ã ã«ãŒã«ã®èšè¿°ããµããŒãããŠããããã瀟å ã¬ã€ãã©ã€ã³ã«åãããŠãªã³ãã£ã³ã°ãã«ã¹ã¿ãã€ãºãããçµç¹ã«ãšã£ãŠè²ŽéãªããŒã«ãšãªããŸãã
Reviveã¯é«éã§è»œéã§ãããCIãã€ãã©ã€ã³ãä»ã®éçè§£æãã©ãããã©ãŒã ãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãã golangci-lintãã®ã«ãŒã«ã®ç¯å²ã¯ãäžè¬çãªãã¹ããã©ã¯ãã£ã¹ãã¹ã¿ã€ã«ãã§ãã¯ãåºæ¬çãªæ£ç¢ºæ§ã®æ€èšŒã«ãŸã§åã³ããããã Go ããŒã ã«ãšã£ãŠä¿¡é Œã§ããã³ãŒãè¡çã¬ã€ã€ãŒãšãªããŸãã
Revive ãéçã«éããå Žæ
Revive ã¯åªããããã©ãŒãã³ã¹ãšæè»ãªèšå®æ©èœãåããŠããŸãããæ·±å±€éçè§£æã®ããã®å æ¬çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããäž»ãªå¶çŽã¯æ¬¡ã®ãšããã§ãã
- æ¬è³ªçã«ã¹ã¿ã€ã«äžå¿
Revive ã¯äž»ã«ã¹ã¿ã€ã«ã«ãŒã«ã«çŠç¹ãåœãŠãŠããŸããæå³çãªåäœãæ€æ»ãããã衚é¢çãªã³ãŒãã£ã³ã°ã®åé¡ãè¶ ããè«ççãªæ€èšŒããšã©ãŒãçºçãããããã¿ãŒã³ã®æ€åºãè¡ã£ããã¯ããŸããã - ãããŒãã³ã³ããã¹ãã®èªèããªã
ãã®ããŒã«ã¯ã倿°ãã³ãŒãå ãã©ã®ããã«ç§»åããããå¶åŸ¡æ§é ã颿°éã§ã©ã®ããã«çžäºäœçšããããã³ãŒããã¹ãå°éäžå¯èœãã©ãããªã©ãåæããŸããããŸããããŒã¿äŸåé¢ä¿ã®è¿œè·¡ãåæå®è¡ã®å®å šæ§ããµããŒããããŠããŸããã - ã¢ããªã±ãŒã·ã§ã³ã®åäœã«é¢ããæŽå¯ãéãããŠãã
Reviveã¯ã埮åŠãªãã°ããããããã¯ããªãœãŒã¹ã®äžæ£äœ¿çšãæ€åºã§ããŸããããããã®æžå¿µã«ã€ããŠã¯ãéçºè ã¯æ¬¡ã®ãããªã¢ãã©ã€ã¶ãŒã«é Œãå¿ èŠããããŸããstaticcheckãŸãã¯å¶åŸ¡ãããŒå¯Ÿå¿ãã©ãããã©ãŒã SMART TS XL. - ã»ãã¥ãªãã£ã¹ãã£ã³ãªã
ã»ãã¥ãªãã£ã«éç¹ã眮ããã«ãŒã«ãå®å šã§ãªãã³ãŒãã£ã³ã°ãã¿ãŒã³ã®èªèã¯æäŸãããŸãããgosecè åšã®æ€åºã«ã¯ãããé«åºŠãªã¢ãã©ã€ã¶ãŒãå¿ èŠã«ãªããŸãã - ã«ã¹ã¿ã ã«ãŒã«ã®äœæã«ã¯ã³ãŒãã£ã³ã°äœæ¥ãå¿
èŠ
ã«ã¹ã¿ã ã«ãŒã«ã®äœæã¯ãµããŒããããŠããŸãããGo ãã©ã°ã€ã³ã®éçºãå¿ èŠã§ãããå°èŠæš¡ãªããŒã ããè¿ éãªæ§æå€æŽãæ±ããŠããçµéšã®æµ ãéçºè ã«ãšã£ãŠã¯éå°ãªå ŽåããããŸãã - ã³ãŒãå質ã®ã¹ã³ã¢ãªã³ã°ãã¢ãŒããã¯ãã£ã®åŒ·å¶ãç®çãšãããã®ã§ã¯ãããŸãã
Revive ã¯ãã³ãŒãã¡ããªã¯ã¹çæãã¢ãŒããã¯ãã£å¢çæ€èšŒãäŸåé¢ä¿ã®å¯èŠåããµããŒãããŠããŸããããããã®æ©èœã¯éåžžãå€§èŠæš¡ã·ã¹ãã ã§å¿ èŠãšããããã髿©èœãªãã©ãããã©ãŒã ã§åŠçãããŸãã
Reviveã¯ãGoã³ãŒãã«ãããŠãããžã§ã¯ãåºæã®ã¹ã¿ã€ã«ãšå¯èªæ§ã®æšæºã匷å¶ããã®ã«æé©ã§ãããã®é«éæ§ãšæè»ãªèšå®æ©èœã«ãããããŒã å ã§ãã©ãŒããããèŠçŽã®æŽåæ§ãä¿ã€ã®ã«æé©ã§ãããã³ãŒãããŒã¹å šäœãç¶²çŸ ããã«ã¯ãã»ãã³ãã£ãã¯ãæ§é ããŸãã¯ã»ãã¥ãªãã£ã«ç¹åããã¢ãã©ã€ã¶ãŒãšçµã¿åãããå¿ èŠããããŸãã
ãšã©ãŒãã§ãã¯
ãšã©ãŒãã§ã㯠Goãšã³ã·ã¹ãã ã«ããã軜éãªãããæçšãªéçè§£æããŒã«ã§ããã颿°ããã®ãšã©ãŒæ»ãå€ãç¡èŠãããŠãããã©ãããæ€åºããããã«ç¹å¥ã«èšèšãããŠããŸããGoã§ã¯ããšã©ãŒåŠçã¯æç€ºçã§ãããå ç¢ãªããã°ã©ã ãæžãããã®åºæ¬çãªèŠçŽ ã§ããããããç¹ã«å€§èŠæš¡ãªã³ãŒãããŒã¹ãæ¥éã«å€æŽãããã³ãŒãããŒã¹ã§ã¯ãéçºè ã颿°åŒã³åºãããè¿ããããšã©ãŒã®ãã§ãã¯ããã£ããçç¥ããŠããŸãããšããããããŸããããã§errcheckã圹ç«ã¡ãŸãã
ãã®ããŒã«ã¯ã³ãŒãããŒã¹ãã¹ãã£ã³ãããšã©ãŒå€ãè¿ã颿°åŒã³åºããæ€åºãããšã©ãŒããµã€ã¬ã³ãã«ç¡èŠãããŠãã颿°åŒã³åºããå ±åããŸãããã®ã·ã³ãã«ãªã«ãŒã«ã«ãããããŒã ã¯äžè²«ãããšã©ãŒåŠçãã©ã¯ãã£ã¹ãå®è·µããæ¬çªç°å¢ã§ã®ã€ã³ã·ãã³ãã«ã€ãªããå¯èœæ§ã®ãããµã€ã¬ã³ããšã©ãŒãåé¿ããããšãã§ããŸãã
errcheckã¯ã¹ã¿ã³ãã¢ãã³ããŒã«ãšããŠå®è¡ããããšããä»ã®éçè§£æã¹ã€ãŒããšçµ±åããŠå®è¡ããããšãã§ããŸãã golangci-lintããã¯ããšã©ãŒ ãã§ãã¯ã®ååž°ãé²ããé²åŸ¡çãªããã°ã©ãã³ã°ç¿æ
£ãããŒã éã§ç¶æãããããã«ããããã«ãCI ãã€ãã©ã€ã³ã«çµã¿èŸŒãŸããããšããããããŸãã
errcheck ã®æ³šæäºé ãšå¢ç
errcheck ã¯éåžžã«çãçµã£ãç®çãæãããŸãããããåºç¯ãªåæã¯ãŒã¯ãããŒã«çµ±åããéã«ã¯çæãã¹ãç¹å®ã®å¶éããããŸãã
- çãç¯å²
errcheck ã¯ããšã©ãŒã®æ»ãå€ãç¡èŠããããã©ããã®ã¿ã«çŠç¹ãåœãŠãŠããŸãããšã©ãŒãã©ã®ããã«åŠçãããããã€ãŸãããšã©ãŒããã°ã«èšé²ãããŠããããé©åã«ã©ãããããŠããããå®å šã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªæ¹æ³ã§è¿ãããŠãããã¯è©äŸ¡ããŸããã - æèçè§£ãªã
ãã®ããŒã«ã¯æå³èªèèœåã«æ¬ ããŠãããå®å šãªçç¥ïŒæ¢ç¥ã®no-opããæå³çã«ãšã©ãŒãé€å€ãããªã©ïŒãšå±éºãªçç¥ãåºå¥ã§ããŸããããã®çµæãéçºè ãæå³çãã€æ£åœãªéžæãè¡ã£ãå Žåã§ãã誀æ€ç¥ãçºçããå¯èœæ§ããããŸãã - æ·±ããã°æ€åºã«ã¯é©ããŠããŸãã
errcheckã¯ããŒã¿ãããŒãå¶åŸ¡ãããŒã®è§£æã¯è¡ããŸããããšã©ãŒãç¡èŠããããšã§å®è¡ãã¹ã®åŸåã§äºæãã¬åäœãçºçãããã©ããã倿ã§ããŸãããstaticcheckãã®ãããªå¯äœçšãçè§£ããã«ã¯ãããã°ã©ãããã«ããã°ã©ã ã¢ãã©ã€ã¶ãŒãå¿ èŠã§ãã - ã«ã¹ã¿ã ãšã©ãŒåŠçããªã·ãŒã¯ãµããŒããããŠããŸãã
ã«ãŒã«é§ååãã©ãããã©ãŒã ãšã¯ç°ãªããerrcheck ã§ã¯ç¬èªã®ãšã©ãŒåŠçæŠç¥ãå®çŸ©ããããç¹å®ã®é¢æ°åŒã³åºããé€å€å¯Ÿè±¡ãšããŠããŒã¯ãããããããšã¯ã§ããŸãããèšå®ã¯ããã±ãŒãžå šäœãŸãã¯é¢æ°åãæå®ããŠé€å€ããããšã«éãããŠãããå€§èŠæš¡ã·ã¹ãã ã§ã¯ååãªæè»æ§ãåŸãããªãå¯èœæ§ããããŸãã - ãšã©ãŒä»¥å€ã®é害ã«ã€ããŠã¯ãµã€ã¬ã³ã
errcheck ã¯ããããã¯ãããŒã«å€ã®æ»ãå€ãã¹ããŒã¿ã¹ã³ãŒããªã©ãä»ã®ã¡ã«ããºã ã§å€±æãéç¥ãã颿°ã®èª€çšãæ€åºããŸããããšã©ãŒæ»ãå€ã®ååšãšäœ¿çšã®ã¿ããã§ãã¯ããŸãã
errcheck ã¯ãGo ã®æç€ºçãªãšã©ãŒã¢ãã«ã«é¢ãããã¹ããã©ã¯ãã£ã¹ãä¿é²ããããšã«éç¹ã眮ããããŒã«ã§ããåããŒã«ãç¹å®ã®ç®çãæã€éå±€åãããéçè§£æãã€ãã©ã€ã³ã®äžéšãšããŠæé©ã§ããå ç¢ã§äžè²«æ§ã®ãããšã©ãŒåŠçãéèŠããããŒã ã«ãšã£ãŠãerrcheck ã¯è»œéãã€å¹æçãªã»ãŒããã£ããããæäŸããŸãã
éå¹çãªå²ãåœãŠ
éå¹çãªå²ãåœãŠ Goã³ãŒãå ã§äžåºŠã䜿çšãããŠããªãä»£å ¥ãæ€åºããããã«èšèšããããå°åãªããã䟿å©ãªéçè§£æããŒã«ã§ãã倿°ã«å€ãä»£å ¥ãããŠãããã®ã®ããã®å€ãèªã¿èŸŒãŸããåã«äžæžããããŠããããå šãã¢ã¯ã»ã¹ãããŠããªãã±ãŒã¹ãæ€åºããŸããããããéå¹çæ§ã¯éåžžã¯æå³çãªãã®ã§ã¯ãªãããããããžãã¯ãéçºè ã®èŠèœãšãããããã¯ãªãã¡ã¯ã¿ãªã³ã°ã®å¿ãã瀺ããŠããå¯èœæ§ããããŸãã
ãã®ããŒã«ã¯é«éã«åäœãããšãã£ã¿ãŒãCI/CDãã€ãã©ã€ã³ãã¡ã¿ãªã³ã¿ãŒã¹ã€ãŒããªã©ãšç°¡åã«çµ±åã§ããŸãã golangci-lintç¡é§ãªæäœãç¹å®ããããèªã¿ãããç®çã«æ²¿ã£ã倿°ã®äœ¿çšãä¿ãããšã§ãã³ãŒãããŒã¹ãã¯ãªãŒã³ãªç¶æ
ã«ä¿ã€ã®ã«åœ¹ç«ã¡ãŸããããã©ãŒãã³ã¹ãéèŠãããã·ã¹ãã ããç£æ»ãå³ããã·ã¹ãã ã§ã¯ãããããéå¹çæ§ãæé€ããããšã§ãä¿å®æ§ã®åäžãè€éãã®è»œæžã«ãã€ãªãããŸãã
ineffassign ã¯ããã®ãããªãµã€ã¬ã³ã ã³ãŒãã®åé¡ãæåã§æ€åºããããšãäžå¯èœã«ãªãå€§èŠæš¡ãããžã§ã¯ãã§ç¹ã«å¹æçã§ãã
ineffassignã®å¶éãšéçšç¯å²
ineffassign ã¯ãã®æçšæ§ã«ãããããããéããã䜿çšã±ãŒã¹åãã«èšèšãããŠãããå æ¬çãªã³ãŒãåæã«ããã圹å²ãå¶éããããã€ãã®å¶éããããŸãã
- åäžåé¡ãžã®çŠç¹
ineffassign ã¯åé·ãªä»£å ¥ãæªäœ¿çšã®ä»£å ¥ã®ã¿ãæ€åºããŸããäžèŠãªèšç®ãæªäœ¿çšã®ã€ã³ããŒããäœåãªã«ãŒããšãã£ãä»ã®éå¹çæ§ã¯æ€åºããŸããããã®æçšæ§ã¯ãç¹å®ã®çš®é¡ã®éå¹çæ§ã«éå®ãããŸãã - æå³çãŸãã¯è¡åçèªèããªã
ãã®ããŒã«ã¯ããã°ã©ã ããžãã¯ãè§£æããã颿°åŒã³åºãéã®å€ã®æµããçè§£ããŸããããŸããä»£å ¥ããã°ãå¯äœçšããªãã¬ã¯ã·ã§ã³ã¢ã¯ã»ã¹ãªã©ãéããŠéæ¥çã«ã·ã¹ãã ã®åäœã«åœ±é¿ãäžãããã©ããã倿ããããšãã§ããŸããã - è€éãªã·ããªãªã«ããã誀æ€ç¥
æ¡ä»¶åå²ãã¯ããŒãžã£ãã«ãŒãæ§é å ã§ã®ä»£å ¥ãªã©ãããé«åºŠãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãineffassign ã誀ã£ãŠå€æ°ãæªäœ¿çšãšããŒã¯ããããšããããŸãããã®ãããéçºè ã¯ãã©ã°ãä»ããããåã€ã³ã¹ã¿ã³ã¹ãæåã§æ€èšŒããå¿ èŠããããŸãã - ã³ã³ããã¹ãæé©åã®ææ¡ãªã
ineffassign ã¯åé¡ãææããŸããããªãã¡ã¯ã¿ãªã³ã°ã®ææ¡ãèªåã³ãŒãä¿®æ£ã¯æäŸããŸãããéçºè ã¯ãéå¹ççãªå²ãåœãŠã解決ãŸãã¯åé€ããããã®æé©ãªæ¹æ³ãæåã§æ±ºå®ããå¿ èŠããããŸãã - ã«ã¹ã¿ãã€ãºããã£ã«ã¿ãªã³ã°ãå¶éãããŠãã
ãã®ããŒã«ã«ã¯é«åºŠãªèšå®ãªãã·ã§ã³ããããŸãããç¹å®ã®å€æ°ãåããŸãã¯é¢æ°ã³ã³ããã¹ãã«å¯ŸããèŠåãæå¶ããããšã¯ã§ããŸãããå€§èŠæš¡ãªã³ãŒãããŒã¹ãã¬ã¬ã·ãŒã³ãŒãããŒã¹ã§ã¯ãç£æ»æã«éå°ãªãã€ãºãçºçããå¯èœæ§ããããŸãã
ineffassignã¯ã軜éãªå質ä¿èšŒã¹ãããã®äžéšãšããŠäœ¿çšããã®ãæé©ã§ããå°èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ããã«ãªã¯ãšã¹ãã®ã¬ãã¥ãŒãCIã¯ãŒã¯ãããŒãªã©ãã³ãŒãããŒã¹ã®ç¡é§ãçããéäžçãªéçšãåªå ããå Žé¢ã§åšåãçºæ®ããŸããããã©ãŒãã³ã¹ãã¢ãŒããã¯ãã£ãè«ççãªæ£ç¢ºæ§ãªã©ãããåºç¯ãªæŽå¯ãåŸãã«ã¯ãããå æ¬çãªéçè§£æããŒã«ãšäœµçšããå¿ èŠããããŸãã
ãŽã»ãã¯
ãŽã»ã㯠(Golang Security Checker) ã¯ãGo ã³ãŒãã®ã»ãã¥ãªãã£è匱æ§ãç¹å®ããããšã«ç¹åããéçè§£æããŒã«ã§ãããœãŒã¹ãã¡ã€ã«ãã¹ãã£ã³ããã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãããŒãã³ãŒããããèªèšŒæ å ±ãäžé©å㪠TLS ã®äœ¿çšãèåŒ±ãªæå·åãæªãã§ãã¯ã®å ¥åæ€èšŒãªã©ãã¢ããªã±ãŒã·ã§ã³ãæ¢ç¥ã®è åšã«ãããå¯èœæ§ã®ãããã¿ãŒã³ãæ€åºããŸãã
éçºè ãéçºããã»ã¹ã«ãããŠã»ãã¥ãªãã£ãã·ããã¬ããã§ããããã«éçºãããgosecã¯ãCIãã€ãã©ã€ã³ãéçºè åãIDEããããŠããåºç¯ãªã»ãã¥ãªãã£ã¯ãŒã¯ãããŒã«å®¹æã«çµ±åã§ããŸããæšæºããã±ãŒãžãšãµãŒãããŒãã£ããã±ãŒãžã®äž¡æ¹ãåæããäºåå®çŸ©ãããã»ãã¥ãªãã£ã«ãŒã«ã«äžèŽããã³ãŒãããã©ã°ä»ãããŸããããŒã«ã¯ãçºèŠãããã³ãŒãããšã«è¡ããšã®ã³ã³ããã¹ããæäŸããä¿®æ£æ¡ãCWEïŒå ±éè匱æ§è©äŸ¡ïŒåé¡ãæäŸãããããããªã¢ãŒãžãšè¿œè·¡ã容æã«ãªããŸãã
gosec 㯠JSON åºåãã«ãŒã«èšå®ããããŠé倧床ã¬ãã«ããµããŒãããŠãããé«åºŠãªã³ã³ãã©ã€ã¢ã³ã¹ç®æšãšæ¥åžžçãªè匱æ§èªèã®äž¡æ¹ãæã€ããŒã ã«æé©ã§ããDevSecOps ãšç¶ç¶çãªã»ãã¥ãªãã£æ€èšŒãéèŠãã Go ããŒã ã§ã¯ãgosec ã®å°å ¥ãçå®ã«å¢å ããŠããŸãã
ãŽã»ãã¯ã®æé·äœå°
gosec ã¯ã»ãã¥ãªãã£éèŠã®éçºã«äžå¯æ¬ ãªããŒã«ã§ããã詳现ãªç£æ»ããšã³ã¿ãŒãã©ã€ãº ã¬ãã«ã®ç£æ»ã«äœ¿çšããéã«ãŠãŒã¶ãŒãèªèããŠããã¹ãå¶éããããŸãã
- ã«ãŒã«ããŒã¹ã®æ€åºã®ã¿
gosec ã¯ãäºåå®çŸ©ãããäžé£ã®ã«ãŒã«ã«å¯ŸããŠéçãã¿ãŒã³ãããã³ã°ã䜿çšããŸããæ¢ç¥ã®åé¡ã«ã¯æå¹ã§ãããåäœãã³ã³ããã¹ãã«å¿ããåæãå¿ èŠãšããè€éãŸãã¯æªç¥ã®è匱æ§ãã¿ãŒã³ãæ€åºããããšã¯ã§ããŸããã - ããŒã¿ãããŒãã¬ãŒã¹ãªã
ãã®ããŒã«ã¯ãè€æ°ã®é¢æ°åŒã³åºãã«ããããã€ã³ãåæã倿°è¿œè·¡ãå®è¡ããŸããããŠãŒã¶ãŒå ¥åãèšå®å€ã®ã·ã¹ãã å ã§ã®ã©ã€ããµã€ã¯ã«ã远跡ã§ããªãããã倿®µéã®ãšã¯ã¹ããã€ããã§ãŒã³ã®æ€åºèœåãå¶éãããŸãã - éå®çãªåæå®è¡æ§èªè
ç«¶åç¶æ ãå ±æããŒã¿ãžã®äžŠåã¢ã¯ã»ã¹ããŸãã¯äžé©åãªåæã®ãŽã«ãŒãã³ã«èµ·å ããã»ãã¥ãªãã£åé¡ã¯ãgosec ã§ã¯æ€åºãããŸããããããã®åé¡ãçºèŠããã«ã¯ããã詳现ãªéçãŸãã¯åçè§£æãå¿ èŠã§ãã - 誀æ€ç¥ãšã³ã³ããã¹ãããªãŒã¢ã©ãŒã
gosec ã¯ã»ãã³ãã£ãã¯ã³ã³ããã¹ããæ¬ ããŠãããããæè¡çã«ã¯å®å šã§ãã£ãŠããå®å šã§ãªããã¿ãŒã³ã®æ§é ã«äžèŽããã³ãŒãããã©ã°ä»ãããå¯èœæ§ããããŸããäŸãã°ãå®éã«ã¯æ©å¯æ å ±ã§ã¯ãªãç䌌çã«å®å šã§ãªãæååããå®å šã§ãã£ãŠãäžèŠéæ£çµ±çãªæå·åããžãã¯ããã€ã©ã€ã衚瀺ããå ŽåããããŸãã - ã¢ãŒããã¯ãã£ãæ§æã«é¢ããæŽå¯ããªã
ãã®ããŒã«ã¯ãã·ã¹ãã ã¬ãã«ã®èª€ã£ãæ§æãå®å šã§ãªããµãŒãããŒãã£ã®äŸåé¢ä¿ãã¯ã©ãŠããã€ãã£ãã®ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ãè©äŸ¡ããããšã¯ã§ããŸããããœãŒã¹ã³ãŒãã¬ãã«ã§ã®ã¿åäœãããã«ãææç©ãã©ã³ã¿ã€ã ããªã·ãŒãšã¯é£æºããŸããã
gosec ã¯ããããã Go ã»ãã¥ãªãã£ããŒã«ãããã«äžå¯æ¬ ãªèŠçŽ ã§ããéçºãµã€ã¯ã«ã®åææ®µéã®ã²ãŒãããŒããŒãšããŠæŽ»çšããããšã§ãã³ãŒããã¹ããŒãžã³ã°ç°å¢ãæ¬çªç°å¢ã«å°éããåã«æãããªæ¬ é¥ãæ€åºããããšãã§ããæå€§éã®å¹æãçºæ®ããŸããããå æ¬çãªã»ãã¥ãªãã£äœå¶ãæ§ç¯ããã«ã¯ãã©ã³ã¿ã€ã ã¹ãã£ã³ãæåã³ãŒãã¬ãã¥ãŒããããŠãã詳现ãªå¶åŸ¡ããã³ããŒã¿ãããŒã®æåããã¬ãŒã¹ã§ããããŒã«ãšçµã¿åãããå¿ èŠããããŸãã
æ¿åºãã§ãã¯
æ¿åºãã§ã㯠GoããŒã ã«ãã£ãŠéçºãããå
¬åŒã®Goè匱æ§åæããŒã«ã§ããGoè匱æ§ããŒã¿ããŒã¹ã掻çšããŠãã³ãŒãã®äŸåé¢ä¿ãæšæºã©ã€ãã©ãªã®äœ¿çšã«ãããæ¢ç¥ã®ã»ãã¥ãªãã£äžã®æ¬ é¥ãç¹å®ããŸãã gosecgovulncheck ã¯ãè匱æ§ãå
¬çã«å ±åãããŠããããã±ãŒãžããããžã§ã¯ããã€ã³ããŒãããŠãããã©ããã«éç¹ã眮ããŠããŸãã
ãã®ããŒã«ã¯ãéçè§£æãšã³ãŒã«ã°ã©ãããŒã¹ã®è§£æã®äž¡æ¹ãå®è¡ããŸããã€ãŸãã圱é¿ãåããã¢ãžã¥ãŒã«ãåã«ãªã¹ãã¢ããããã ãã§ãªããè匱ãªã³ãŒããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒã«ãã¹ããå®éã«å°éå¯èœãã©ãããæ€èšŒãããšãããããã«äžæ©é²ãã æ©èœãæäŸããŸããããã«ãããåŸæ¥ã®äŸåé¢ä¿ã¹ãã£ããŒããããã€ãºãäœæžãããã¢ã©ãŒãã®ç²ŸåºŠãåäžããŸãã
govulncheckã¯ã go ã³ãã³ãã¯ã¢ãžã¥ãŒã«ãšãã«ãã¿ã°ããµããŒãããéçºè
ãã·ã³ãšCIã·ã¹ãã ã®äž¡æ¹ã«å¯Ÿå¿ããããã«èšèšãããŠããŸããåºåã«ã¯ãCVEèå¥åãè匱æ§ã®èª¬æã圱é¿ãåããã·ã³ãã«ãç¹å®ã®ã¢ãžã¥ãŒã«ããŒãžã§ã³ã®ã¢ããã°ã¬ãŒããªã©ã®æšå¥šããã修埩æŠç¥ãå«ãŸããŸãã
govulncheckã®å¶éãšå¢ç
govulncheck ã¯äŸåé¢ä¿ã®èªåç£æ»ãšãã䟡å€ããã¬ã€ã€ãŒãæäŸããŸããããã®é©çšç¯å²ã¯æå³çã«çãèšå®ãããŠããŸããéçºããŒã ãããåºç¯ãªã»ãã¥ãªãã£æŠç¥ã®äžç°ãšã㊠govulncheck ãå°å ¥ããéã«ã¯ã以äžã®å¶éäºé ã«çæããå¿ èŠããããŸãã
- æ¢ç¥ã®è匱æ§ã®ã¿ãç¹å®
govulncheck ã¯ãGo è匱æ§ããŒã¿ããŒã¹ã«ãŸã å ±åãããŠããªããŒããã€è匱æ§ãåé¡ãæ€åºããããšã¯ã§ããŸããããã®æå¹æ§ã¯ãå ¬éããã CVE ãšã¢ããã€ã¶ãªã®é©ææ§ãšå®å šæ§ã«å®å šã«äŸåããŸãã - å®å
šã§ãªãã³ãŒããã¿ãŒã³ã®æ€åºãªã
ãã®ããŒã«ã¯ããœãŒã¹ã³ãŒãå ã®ã»ãã¥ãªãã£ã¢ã³ããã¿ãŒã³ãè«ççãªæ¬ é¥ããŸãã¯ãªã¹ã¯ã®é«ããã©ã¯ãã£ã¹ãæ€æ»ããŸãããããŒãã³ãŒããããã·ãŒã¯ã¬ãããæªãã§ãã¯ã®ãšã©ãŒãèåŒ±ãªæå·ãšãã£ãåé¡ã¯ãæ¢ç¥ã®è匱ãªããã±ãŒãžã«å«ãŸããŠããªãéããæ€åºãããŸããã - éçã¹ã³ãŒã㯠Go ã¢ãžã¥ãŒã«ã«éå®ããã
govulncheck 㯠Go ã¢ãžã¥ãŒã«ã®ã¿ãåæããŸããã·ã¹ãã ã©ã€ãã©ãªãcgo çµç±ã® C äŸåé¢ä¿ããŸãã¯ã©ã³ã¿ã€ã ç°å¢ã«è匱æ§ãããããå¯èœæ§ã®ããå€éšãã€ããªã¯æ€æ»ããŸããã - 鿥çãªã©ã³ã¿ã€ã ãšã¯ã¹ããã€ããèŠéãå¯èœæ§ããã
ãã®ããŒã«ã¯éçå°éå¯èœæ§åæã«äŸåããŠãããããåçèªã¿èŸŒã¿ããªãã¬ã¯ã·ã§ã³ããã©ã°ã€ã³ ã·ã¹ãã ããŸãã¯ã©ã³ã¿ã€ã æ§æã®å€æŽã«ãã£ãŠã®ã¿ããªã¬ãŒãããè匱æ§ãèŠéãå¯èœæ§ããããŸãã - ããŒã¿ããŒã¹ã®é
å»¶ãšã«ãã¬ããžã®ã£ãã
Go è匱æ§ããŒã¿ããŒã¹ã¯ç²Ÿæ»ãããæ¡å€§ãç¶ããŠããŸãããããåºç¯ãªã»ãã¥ãªãã£ãã©ãã«ãŒã«é ãããšãå¯èœæ§ããããŸããéæšæºã©ã€ãã©ãªãå éšã©ã€ãã©ãªã䜿çšããŠãããããžã§ã¯ãã¯ãç¶²çŸ æ§ãäžååã§ãã£ãããã¢ã©ãŒãããŸã£ããé ä¿¡ãããªãã£ããããå¯èœæ§ããããŸãã
govulncheckã¯ãäŸåé¢ä¿ç®¡çã¯ãŒã¯ãããŒã®å®åçãªäžéšãšããŠæé©ã§ããã³ãŒãããŒã¹ãæ¢ç¥ã®ã»ãã¥ãªãã£äžã®æ¬ é¥ã®åœ±é¿ãåããŠãããããŸããããã®æ¬ é¥ãå®éã«æªçšãããå¯èœæ§ããããã«ã€ããŠãè¿ éãã€ä¿¡é Œæ§ã®é«ãæ å ±ãæäŸããŸããå®å šãªä¿è·ã®ããã«ã¯ãã³ãŒãã¬ãã«ã®ã»ãã¥ãªãã£ã¹ãã£ã³ããŒã«ãéçšäžã®è匱æ§ç®¡çããŒã«ãšçµã¿åãããå¿ èŠããããŸãã
Semgrep (Goçš)
ã»ã ã°ã¬ãã Semgrepã¯ãGoãã¯ãããšããå€ãã®èšèªããµããŒããããéåžžã«æè»ã§å¹ççãªéçè§£æããŒã«ã§ããgrepãªã©ã®ããŒã«ã®ã·ã³ãã«ãªãã¿ãŒã³ãããã³ã°æ©èœãšãææ°ã®éçè§£æããŒã«ã®æ§é è§£ææ©èœãèåããŠããŸããæœè±¡æ§ææšïŒASTïŒè§£æãçšããããšã§ãéçºè ã¯çã®ããã¹ãã ãã§ãªãã³ãŒãæ§é ã«åºã¥ããŠãã¿ãŒã³ãæ€åºãããæ£ç¢ºãªã«ãŒã«ãäœæã»é©çšã§ããŸãã
Goãããžã§ã¯ãã§ã¯ãSemgrepã¯ã»ãã¥ã¢ã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã®åŸ¹åºãã¢ãŒããã¯ãã£ã¬ã€ãã©ã€ã³ã®æ€èšŒããããŠã¹ã¿ã€ã«ãæ©èœäžã®åé¡ã®ãã©ã°ä»ãã«ãã䜿çšãããŸããSemgrepã¯ãGoåºæã®ã«ãŒã«ã©ã€ãã©ãªãžã®ã¢ã¯ã»ã¹ãæäŸããããŒã ã¯ã¯ãªãŒã³ã§èªã¿ãããYAMLæ§æã䜿çšããŠã«ã¹ã¿ã ãã§ãã¯ãèšè¿°ã§ããŸããããã«ãããã³ãŒãå質ãã§ãã¯ã瀟å ã®éçºããªã·ãŒãšå®¹æã«æŽåãããããšãã§ããŸãã
Semgrepã¯æ¥ã ã®ã¯ãŒã¯ãããŒã«ã¹ã ãŒãºã«çµ±åã§ããŸããé«éã«å®è¡ãããã³ã³ãã€ã«ãäžèŠãªãããã³ãããåããã¯ããã«ãªã¯ãšã¹ãèªååãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã·ã¹ãã ã«ãããé«éãã£ãŒãããã¯ã«ãŒãã«æé©ã§ããCLIãšAPIã¯ã©ã¡ããéçºè ãã¬ã³ããªãŒã§ãçè§£ããããä¿®æ£ããããå®çšçãªèšºææ©èœãæäŸããŸãã
Go ã§ Semgrep ã䜿çšããéã®å¶éãšèæ ®ãã¹ãç¹
Semgrep ã¯åŒ·åã§é©å¿æ§ã«åªããŠããŸããããã®ã¢ãŒããã¯ãã£ã«ãããGo ãããžã§ã¯ãã®éçåæã« Semgrep ãå©çšããããŒã ã«ãšã£ãŠéèŠãªå¶çŽãããã€ãçããŸãã
Semgrepã¯ããã°ã©ã å šäœã®è§£æã¯è¡ããŸãããããŒã«ã«ã³ãŒãã¹ã³ãŒãå ã®ãã¿ãŒã³ãè©äŸ¡ããŸããããã¡ã€ã«ãããã±ãŒãžããŸããã颿°åŒã³åºãã远跡ããããšã¯ã§ããŸããããã®ããã忣ãã€ã¯ããµãŒãã¹ãéå±€åã¢ããªã±ãŒã·ã§ã³ã«ããã颿°ã®çžäºäœçšãªã©ãã³ãŒãããŒã¹å šäœãããåºç¯å²ã«ææ¡ããå¿ èŠãããè€éãªåé¡ã®æ€åºã«ã¯é©ããŠããŸããã
ãŸããå¶åŸ¡ãããŒãšããŒã¿ãããŒã®è§£æããµããŒããããŠããŸãããã€ãŸããSemgrepã¯é¢æ°éã§ã®ããŒã¿ã®ç§»åãããŠãŒã¶ãŒå ¥åãæ©å¯æ§ã®é«ãæäœã«ã©ã®ãããªåœ±é¿ãäžãããã远跡ã§ããŸãããæ±æè§£æãå®è¡ã°ã©ãã®æ§ç¯ãè¡ãããŒã«ã¯ãé ããè匱æ§ãçºèŠããããå®å šã§ãªãå ¥åãããŒã远跡ãããããã®ã«é©ããŠããŸãã
ã«ãŒã«ãããŸãã«ãæ±çšçã«èšè¿°ãããŠããå Žåã誀æ€ç¥ãæžå¿µãããå¯èœæ§ããããŸããSemgrepã®æå¹æ§ã¯ã«ãŒã«ã®å質ã«å€§ããäŸåããŸããéçºè ã¯ãéå°ãªãã€ãºãã»ãã¥ã¢ã³ãŒãã®èª€åé¡ãåé¿ããããã«ãã«ã¹ã¿ã ã«ãŒã«ã»ãããæ éã«ãã¹ãããç¶æããå¿ èŠããããŸãã
äžŠè¡æ§è§£æãSemgrepãäžååãªç¹ã®äžã€ã§ããSemgrepã¯ãgoroutineããã£ãã«éä¿¡ãç«¶åç¶æ ãã¢ãã«åã§ããŸããã䞊è¡å®è¡ãã¿ãŒã³ã«å€§ããäŸåããGoã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã®åŽé¢ãæ£ããè©äŸ¡ããããã«ãããé«åºŠãªéçããŒã«ãå¿ èŠã«ãªããŸãã
æåŸã«ãSemgrepã«ãŒã«ã®ã¡ã³ããã³ã¹ã¯é·æçãªãªãŒããŒãããããããããŸããã³ãŒããé²åããæ°ããã©ã€ãã©ãªãå°å ¥ããããšãæ¢åã®ã«ãŒã«ãæŽæ°ãŸãã¯æ¡åŒµããå¿ èŠãçããå¯èœæ§ããããŸãã宿çãªãã¥ã¬ãŒã·ã§ã³ãè¡ããªããšãå€ãã«ãŒã«ã«ãã£ãŠé倧ãªåé¡ãèŠéãããããç¡é¢ä¿ãªåé¡ããã©ã°ä»ãããããããå¯èœæ§ããããŸãã
Semgrepã¯ãç¹å®ã®ã³ãŒããã¿ãŒã³ãè¿ éãã€ç確ã«ãã§ãã¯ããæ¢ç¥ã®ãªã¹ã¯ãæ©æã«æ€ç¥ããããŒã ã®ã³ãŒãã£ã³ã°èŠçŽãæè»ã«é©çšãããããŒã ã«æé©ã§ããããé«åºŠãªéçè§£æãã©ãããã©ãŒã ãšäœµçšããããšã§ãæ¥ã ã®éçºå質ã«å¯ŸããéèŠãªå¯èŠæ§ãšå¶åŸ¡ã¬ã€ã€ãŒãæäŸã§ããŸãã
CodeQLïŒGoçšïŒ
ã³ãŒãQL GitHubãéçºãã匷åãªéçè§£æãšã³ãžã³ã§ãããŒã¿ããŒã¹ã¹ã¿ã€ã«ã®ã¢ãããŒããçšããŠè€éãªã³ãŒãã®è匱æ§ãç¹å®ããããã«èšèšãããŠããŸãããœãŒã¹ã³ãŒããSQLã«äŒŒãèšèªã§ã¯ãšãªå¯èœãªãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã«å€æããããšã§åäœããŸããGoãããžã§ã¯ãã§ã¯ãCodeQLã¯å¶åŸ¡ãããŒãããŒã¿ãããŒããããŠããã·ãŒãžã£éå®è¡ãã¹å šäœã«ããã詳现ãªã»ãã³ãã£ãã¯ã¯ãšãªãå¯èœã«ããŸãã
軜éãªã³ã¿ãŒãã«ãŒã«ããŒã¹ã®ã¹ãã£ããŒãšã¯ç°ãªããCodeQLã䜿çšãããšãã»ãã¥ãªãã£ç ç©¶è ãéçºè ã¯ãéåžžã«å ·äœçãªè匱æ§ãã¿ãŒã³ã衚çŸããã«ã¹ã¿ã ã¯ãšãªãäœæã§ããŸãããªãŒãã³ãœãŒã¹ããã³ãšã³ã¿ãŒãã©ã€ãºã³ãŒãããŒã¹ã«ãããç¶ç¶çãªã»ãã¥ãªãã£ã¹ãã£ã³ãšããã¢ã¯ãã£ããªè匱æ§èª¿æ»ã®äž¡æ¹ã«äœ¿çšãããŸãã
Goã¢ããªã±ãŒã·ã§ã³ã§ã¯ãCodeQLã䜿çšããŠãã€ã³ãžã§ã¯ã·ã§ã³ã®è匱æ§ãå®å šã§ãªãAPIã®äœ¿çšãå ¥åæ€èšŒã®äžè¶³ãæ©å¯ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæ€åºã§ããŸããåæã¯ããã±ãŒãžã颿°ãã¢ãžã¥ãŒã«ã«ãŸããããã³ãŒãããŒã¹å šäœã§å€æ°ãã©ã®ããã«æž¡ãããæ€èšŒããã䜿çšãããŠããããè©³çŽ°ã«ææ¡ã§ããŸããGitHub Advanced Securityãšç·å¯ã«çµ±åãããŠãããCodeQL CLIãéããŠããŒã«ã«éçºã¯ãŒã¯ãããŒããµããŒãããŸãã
CodeQL for Go ã䜿çšããéã®å¶éãšèæ ®äºé
CodeQL ã¯éçåæã®ããã®æãé«åºŠãªããŒã«ã® 1 ã€ã§ãããGo ãããžã§ã¯ãã«é©çšããéã«éçºè ãçæãã¹ãéèŠãªå¶éããããŸãã
CodeQLã¯ãCãC++ãJavaãJavaScriptã®ãµããŒããšæ¯èŒããŠãGoèšèªã®èšèªã«ãã¬ããžãéãããŠããŸããç¹å®ã®äžŠè¡æ§ãã¿ãŒã³ããªãã¬ã¯ã·ã§ã³ããŒã¹ã®æäœãªã©ãGoã®äžéšã®æ©èœã¯ãå®å šã«ã¢ãã«åãŸãã¯ãµããŒããããŠããªãå¯èœæ§ããããŸãããã®çµæãGoã¢ããªã±ãŒã·ã§ã³ã«ããèŠãããç¹å®ã®åçåäœãå®å šã«æ£ç¢ºã«åæã§ããªãå¯èœæ§ããããŸãã
CodeQLã®ã»ããã¢ãããšåŠç¿æ²ç·ã¯ãããªãè€éã«ãªãå¯èœæ§ããããŸããã«ã¹ã¿ã ã¯ãšãªãäœæããã«ã¯ãCodeQLã¯ãšãªèšèªã«ç²Ÿéããæœè±¡çãªããŒã¿ããŒã¹ã¢ãã«ããœãŒã¹ã³ãŒããã©ã®ããã«è¡šçŸããããçè§£ããå¿ èŠããããŸãããããããçšæãããã¯ãšãªãå©çšå¯èœã§ãããããã©ã«ãã®ãã§ãã¯ãè¶ ããæ©èœãå©çšãããããŒã ã¯ãæ§æãç¿åŸããå®å šã§ããã©ãŒãã³ã¹ã®é«ãã¯ãšãªãäœæããããã«æéãè²»ããå¿ èŠããããŸãã
ããã©ãŒãã³ã¹ãèæ ®ãã¹ãç¹ã§ããCodeQLã¯ãœãŒã¹ã³ãŒãããå®å šãªããŒã¿ããŒã¹ãçæããããããœãŒã¹ãã¡ã€ã«ãçŽæ¥æäœããããŒã«ãããå€ãã®ãªãœãŒã¹ãæ¶è²»ããŸããå€§èŠæš¡ãªGoã³ãŒãããŒã¹ã§ã¯ããã®ããŒã¿ããŒã¹ã®æ§ç¯ãšåæã«ããªãã®æéãšã¡ã¢ãªãå¿ èŠã«ãªãå ŽåããããŸãã
CodeQLã®éçè§£æã«ã¯å®è¡æã®åäœã¯å«ãŸããŸãããåçããŒãããŠãŒã¶ãŒå®çŸ©ãã©ã°ã€ã³ãå®è¡æã«æ³šå ¥ãããããŒã¿ã«ãã£ãŠããããããæ§æåºæã®åé¡ãè匱æ§ãæ€åºããããšã¯ã§ããŸããããããã®ãªã¹ã¯ã¯ãåçè§£æããŒã«ãå®è¡æèŠ³æž¬ããŒã«ãçšããŠè©äŸ¡ããå¿ èŠããããŸãã
æåŸã«ãCodeQLãšGitHub Advanced Securityã®é£æºã¯ãšã³ã¿ãŒãã©ã€ãºãã©ã³ã§ã®ã¿å©çšå¯èœã§ãããGitHubã䜿çšããŠããªãããŒã ããªãŒãã³ãœãŒã¹ã©ã€ã»ã³ã¹ã«åºã¥ããŠäœæ¥ããŠããããŒã ã«ãšã£ãŠã¯ã¢ã¯ã»ã¹ãå¶éãããå¯èœæ§ããããŸããããŒã«ã¯ããŒã«ã«ã§ã®äœ¿çšãå¯èœã§ãããCI/CDãã€ãã©ã€ã³ã®å®å šãªé£æºã«ã¯è¿œå ã®èšå®äœæ¥ãå¿ èŠã«ãªãå ŽåããããŸãã
CodeQLã¯ãã»ãã¥ãªãã£éèŠã®ããŒã ãç ç©¶å¿åã®éçºã°ã«ãŒãããããŠåŸ¹åºçãªèåŒ±æ§æ€åºãåªå ãããå€§èŠæš¡ãªGoã¢ããªã±ãŒã·ã§ã³ã«æé©ã§ããåŸæ¥ã®ãªã³ã¿ãŒãè£å®ããè€éãªããžãã¯ãšã©ãŒãã»ãã¥ãªãã£äžã®æ¬ é¥ãã¢ãã«åãæ€åºããããŠæªç¶ã«é²ãææ®µãæäŸããŸãã
SonarQubeïŒGoãã©ã°ã€ã³ä»ãïŒ
ãœããŒãã¥ãŒã SonarQubeã¯ãéäžç®¡çãããããã·ã¥ããŒããæè¡çè² åµã®è¿œè·¡ãç¶ç¶çãªæ€æ»æ©èœã§ç¥ããããåºãæ¡çšãããŠããéçè§£æããã³ã³ãŒãå質ãã©ãããã©ãŒã ã§ããGoãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ãããšãSonarQubeã¯Goèšèªãããžã§ã¯ãã«ã察å¿ããããŒã ã¯çµ±äžãããç°å¢ã§ãä»ã®ãµããŒãèšèªãšåæ§ã«ä¿å®æ§ãã»ãã¥ãªãã£ãã³ãŒãã¹ã¡ã«ãç£èŠã§ããŸãã
Goã³ãŒãããŒã¹ã«ãããŠãSonarQubeã¯ã³ãŒãã®è€éãããã°ãªã¹ã¯ãã¹ã¿ã€ã«éåãåºæ¬çãªã»ãã¥ãªãã£ãã¿ãŒã³ã«é¢é£ããåé¡ãèªåã¹ãã£ã³ããŸããWebããŒã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãã³ãŒãå質ã®åŸåããããã¹ãããæ€åºãéè€ã¡ããªã¯ã¹ãå±¥æŽè¿œè·¡ãèŠèŠåã§ãããããããŒã ã¯æž¬å®å¯èœãªæ¹åç®æšãèšå®ããããšãã§ããŸãã
SonarQubeã¯ãJenkinsãGitHub ActionsãGitLab CIãªã©ãå€ãã®äžè¬çãªCI/CDã·ã¹ãã ãšçµ±åãããŠããŸããããã«ãããGoããŒã ã¯åé¡ã®é倧床ãå質ã®ãããå€ã«åºã¥ããŠã²ãŒãã£ã³ã°ã宿œããã³ãŒãã¬ãã¥ãŒäžã«ãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãåŸãããšãã§ããŸãããã©ã³ãã¬ãã«ã®åæããã«ãªã¯ãšã¹ãã®çµ±åãå質ã²ãŒãã®èªååããµããŒãããŠãããããå€§èŠæš¡ãªããŒã ããã«ããªããžããªç°å¢ã«é©ããŠããŸãã
SonarQube for Go ã®å¶éãšå¶çŽ
SonarQube 㯠Go ã³ãŒãã®å質ã«é¢ãã貎éãªæŽå¯ãæäŸããŸãããGo åææ©èœãä»ã®èšèªã®ãµããŒãã«æ¯ã¹ãŠå æ¬çã§ãªãé åãããã€ããããŸãã
Goãã©ã°ã€ã³ã¯çŸåšãJavaãC#ã§å©çšå¯èœãªãã®ãšæ¯èŒãããšãåºæ¬çãªéçè§£ææ©èœããæäŸããŠããŸãããé«åºŠãªããŒã¿ãããŒè§£æãããã·ãŒãžã£éå¶åŸ¡ãããŒã®è¿œè·¡ãäžŠè¡æ§ãèæ ®ããããžãã¯ã¢ããªã³ã°ãšãã£ãããã詳现ãªã»ãã³ãã£ãã¯ãã§ãã¯æ©èœãæ¬ ããŠããŸãããã®ãããããè€éãªGoã·ã¹ãã ã«ãããè€éãªãã°ãã¢ãŒããã¯ãã£éåã®æ€åºã«ã¯ãGoãã©ã°ã€ã³ã®æçšæ§ãéãããŠããŸãã
ã»ãã¥ãªãã£ã«ãã¬ããžã¯äºåå®çŸ©ãããã«ãŒã«ã«éå®ãããŠããããã€ã³ãåæãè匱æ§ãã§ã€ã³ã¯å«ãŸããŸãããSonarQubeã¯æãããªã»ãã¥ãªãã£ã¢ã³ããã¿ãŒã³ãæ€ç¥ã§ããŸãããä¿¡é Œã§ããªãå ¥åã颿°å ãã©ã®ããã«æµãããããããã¯è€æ°ã®å®å šã«èŠããåŒã³åºããã©ã®ããã«çµã¿åããã£ãŠå±éºãªå®è¡ãã¹ã圢æããããŸã§ã¯ã¢ãã«åã§ããŸããã
Goã«ãŒãã³ããã£ãã«ãã€ã³ã¿ãŒãã§ãŒã¹ã®æ £çšçãªäœ¿çšæ³ãšãã£ãGoç¹æã®æ§é ã®ãµããŒãã¯æ¯èŒçæµ ãããã©ãããã©ãŒã ã¯äžŠè¡åäœãã·ãã¥ã¬ãŒãããããç«¶åç¶æ ããããããã¯ããã®ä»ã®ãã«ãã¹ã¬ããã®å±éºæ§ãç¹å®ãããããŸããããããã®æžå¿µã¯Goã¢ããªã±ãŒã·ã§ã³ã§ã¯äžè¬çã§ãããããå°éçãªããŒã«ãçšããŠå¯ŸåŠããå¿ èŠããããŸãã
ã«ã¹ã¿ã ã«ãŒã«ã®éçºã¯å¯èœã§ãããSemgrepãCodeQLã®ãããªããŒã«ã»ã©æè»ã§äœ¿ããããã¯ãããŸãããé«åºŠã«ã«ã¹ã¿ãã€ãºãããåè³ªåºæºã«äŸåããŠããããŒã ã«ãšã£ãŠãç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«åãããã«ã¹ã¿ã æ€åºã®å®è£ ã¯å°é£ã«ãªãå¯èœæ§ããããŸãã
å€§èŠæš¡ãªGoãããžã§ã¯ãã§ã¯ãããã©ãŒãã³ã¹ãæžå¿µäºé ãšãªãå ŽåããããŸããSonarQubeã®åæãšã³ãžã³ã¯ãç¹ã«è€æ°ã®ãã©ã³ãããªããžããªã䞊è¡ããŠã¹ãã£ã³ããå Žåãããªãã®ãªãœãŒã¹ãæ¶è²»ããŸããæé©ãªçµæãåŸãã«ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®èšç»ãšèª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã
SonarQubeã¯ãGoã³ãŒãã®å質ãé«ã¬ãã«ã§ç£èŠãããããŒã ãç¹ã«ä»èšèªã§æ¢ã«SonarQubeã䜿çšããŠããç°å¢ã«æé©ã§ããæè¡çè² åµãåé¡ã®åŸåãã³ãŒãããŒã¹ã®å¥å šæ§ãäžå çã«ææ¡ã§ããã¯ãªãŒã³ãªãã¥ãŒãæäŸããŸãããGoã¢ããªã±ãŒã·ã§ã³ã«ãããã»ãã³ãã£ã¯ã¹ãšã»ãã¥ãªãã£ã®å®å šãªã«ãã¬ããžãå®çŸããã«ã¯ãããç¹åããã¢ãã©ã€ã¶ãŒãè£å®ããå¿ èŠããããŸãã
ãŽãŒã»ã¯ãªãã£ãã¯
ãŽãŒã»ã¯ãªãã£ã㯠Go-Criticã¯ãä»ã®Goãªã³ã¿ãŒãè£å®ããããã«éçºãããéçè§£æããŒã«ã§ããããã·ã³ãã«ãªæ§æãã§ãã«ãŒã§ã¯èŠéãããã¡ãªé«åºŠãªåé¡ãæ€åºããŸããã³ãŒãã¹ã¿ã€ã«ãæ£ç¢ºæ§ãããã©ãŒãã³ã¹ãå¯èªæ§ãªã©ãå¹ åºããã§ãã¯æ©èœãæäŸããŸããæµ ããã©ãŒãããã«ãŒã«ã«éç¹ã眮ãããŒã«ãšã¯ç°ãªããGo-Criticã¯åæ å ±ãšæ§é è§£æãçšããŠãããæ·±ãéå¹çæ§ããšããžã±ãŒã¹ã®ããžãã¯æ¬ é¥ãçºèŠããŸãã
ãã®ããŒã«ã«ã¯ãåé·ãªæ¡ä»¶ãç¡å¹ãªä»£å ¥ãå倿ã®åé¡ãã€ã³ã¿ãŒãã§ãŒã¹ã®èª€çšãªã©ã«é¢ããã«ãŒã«ãå«ããå¢ãç¶ãããã§ãã«ãŒãä»å±ããŠããŸããç¹ã«ããã€ã³ã¿ã¬ã·ãŒããŒãæ³å®ãããå Žæã§å€ã¬ã·ãŒããŒã䜿çšããããã¹ã©ã€ã¹ãªãã©ã«ãéå¹ççã«æ§ç¯ããããããªã©ãäºæããªãåäœã«ã€ãªããå¯èœæ§ã®ãããèªæã§ã¯ãªããã¹ãç¹å®ããã®ã«åªããŠããŸãã
Go-Criticã¯ç¬ç«ããŠå®è¡ããããšããæ¬¡ã®ãããªå€§èŠæš¡ãªéçè§£æãã¬ãŒã ã¯ãŒã¯ã«çµ±åããããšãã§ããŸãã golangci-lintèšå®å¯èœã§ãç¹å®ã®ãã§ãã¯ã®æå¹åãŸãã¯ç¡å¹åããµããŒãããåé¡é åãšæšå¥šãããä¿®æ£ãžã®æç¢ºãªåç
§ãå«ã詳现ãªã¡ãã»ãŒãžãæäŸããŸãã
Go-Critic ã䜿çšããéã®å¶éãšèæ ®äºé
Go-Critic ã¯éçã³ãŒãã¬ãã¥ãŒã«è²Žéãªæ·±ã¿ã远å ããŸããããã®èšèšã«ãããéçºè ãäž»èŠãªåæããŒã«ãšããŠæ¡çšããåã«èæ ®ãã¹ãããã€ãã®å¶éãå°å ¥ãããŠããŸãã
ãã®ããŒã«ã¯ãå®å šãªããŒã¿ãããŒè§£æãå¶åŸ¡ãããŒè§£æãå®è¡ããŸãããããã°ã©ã å ã®ããŒã¿ã®æµããææ¡ã§ããã®ã¯ãããŒã«ã«ã¬ãã«ãŸãã¯é¢æ°ã¬ãã«ã®æ€æ»ã«éãããŸãããã®ãããè€æ°ã®é¢æ°ãã¢ãžã¥ãŒã«ã«ãŸããã倿°ã®ç¶æ ã远跡ããããããã°ã©ã å šäœã®å®è¡ãã¹ã«é¢ããç¥èãå¿ èŠãšããåé¡ãæ€åºãããããããšã¯ã§ããŸããã
äžŠè¡æ§é¢é£ã®ãã°ãGo-Criticã®å¯Ÿè±¡å€ã§ããGo-Criticã¯ãgoroutineããã£ãã«ãåæã¡ã«ããºã ãã¢ãã«åããŸããã䞊åãŸãã¯é«åºŠãªäžŠè¡æ§ãæã€Goã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããŒã ã¯ããããã®é åã®æ£ç¢ºæ§ã確ä¿ããããã«è¿œå ã®åæããŒã«ãå¿ èŠã«ãªããŸãã
Go-Criticã¯å¹ åºããã§ãã¯æ©èœããµããŒãããŠããŸããããã©ã°ã€ã³ã«ããã«ã¹ã¿ã ã«ãŒã«ã®äœæãæ¡åŒµæ§ã¯æäŸããŠããŸãããã€ãŸããéçºè ã¯ããŒã«ã®ãœãŒã¹ã³ãŒããçŽæ¥å€æŽããããšãªããçµç¹åºæã®ã«ãŒã«ãäœæããããšãã§ããŸãããããã¯ãããŒã¹ã®éãããŒã ãå€§èŠæš¡ãªããŒã ã§ã¯å®çŸã§ããªãå¯èœæ§ããããŸãã
ç¹ã«ãå³å¯ãªæå³çä¿èšŒã§ã¯ãªããã¥ãŒãªã¹ãã£ãã¯ã«åºã¥ããã§ãã¯ãè¡ãå Žåã誀æ€ç¥ãçºçããå¯èœæ§ããããŸããå Žåã«ãã£ãŠã¯ãGo-Critic ã¯ãæå¹ãã€æå³çã§ããã«ãããããããã«ãŒã«ã»ããã§ã¯éå¹ççãŸãã¯äžæ£ç¢ºãšå€æããããã¿ãŒã³ããã©ã°ä»ãããããšããããŸãããã®ãããå€ãã®å Žåãæåã«ããæ€åºçµæã®ã¬ãã¥ãŒãå¿ èŠã«ãªããŸãã
æåŸã«ãGo-Criticã¯ã»ãã¥ãªãã£åæãç®çãšãããã®ã§ã¯ãããŸãããã€ã³ãžã§ã¯ã·ã§ã³ãªã¹ã¯ãäžæ£ãªæå·ãæªæ€èšŒã®å
¥åãç¹å®ããããšã¯ã§ããŸãããã»ãã¥ãªãã£ãéèŠããããŒã ã¯ãGo-Criticãªã©ã®å°çšããŒã«ãšçµã¿åãããå¿
èŠããããŸãã gosec or govulncheck èåŒ±æ§æ€åºã®ããã
Go-Criticã¯ãåºæ¬çãªãªã³ãã£ã³ã°ãè¶ ããŠãéçºãµã€ã¯ã«ã®æ©ã段éã§åŸ®åŠãªæ£ç¢ºæ§ãããã©ãŒãã³ã¹ã®åé¡ãæ€åºãããããŒã ã«æé©ã§ããã·ã³ãã«ãªãªã³ã¿ãŒãšé£æºããŠåäœããããé«åºŠãªæ§é ãã§ãã¯ãéããŠã³ãŒãå質ãåäžãããããšãã§ããŸãããã ãããã®æ€åºçµæãæ éã«è§£éããããé«åºŠãªéçã¢ãã©ã€ã¶ãŒãšçµã¿åãããŠäœ¿çšââããå¿ èŠããããŸãã
Go ã®äŸåæ§ãã§ã㯠(OWASP)
OWASP äŸåé¢ä¿ãã§ã㯠OWASP Foundationãéçºããããããžã§ã¯ãã®äŸåé¢ä¿ã«ãããæ¢ç¥ã®è匱æ§ãç¹å®ãããªãŒãã³ãœãŒã¹ããŒã«ãšããŠåºãç¥ãããŠããŸããäž»ã«ããããžã§ã¯ãã®ãµãŒãããŒãã£è£œã©ã€ãã©ãªãããã±ãŒãžãã¹ãã£ã³ããNational Vulnerability DatabaseïŒNVDïŒãªã©ã®ããŒã¿ããŒã¹ããã®ä»ã®ã¢ããã€ã¶ãªãœãŒã¹ã«åºã¥ããŠãå ¬éãããŠããã»ãã¥ãªãã£åé¡ã®ããããŒãžã§ã³ãæ€åºããããã«äœ¿çšãããŸãã
Dependency-Checkã¯Javaãšã³ã·ã¹ãã ããçãŸããŸããããGolangãéå®çã«ãµããŒããããªã©ãè€æ°ã®ããã°ã©ãã³ã°èšèªããµããŒãããããã«é²åããŸãããGoãããžã§ã¯ãã§ã¯ããã®ããŒã«ã䜿ã£ãŠä»¥äžã®ã³ãŒããã¹ãã£ã³ã§ããŸãã go.mod ã®äžèãš go.sum ãã¡ã€ã«ã䜿çšããŠè匱ãªã¢ãžã¥ãŒã« ããŒãžã§ã³ãæ€åºããé¢é£ãã CVEãé倧床ã¹ã³ã¢ãããã³ä¿®åŸ©ã¢ããã€ã¹ãå«ãã»ãã¥ãªã㣠ã¬ããŒããçæããŸãã
æ¢ã«ã¹ã¿ãã¯å šäœã§Dependency-Checkã䜿çšããŠããããŒã ã¯ãGoãã€ãã©ã€ã³ã«çµ±åããããšã§ãèšèªéã§çµ±äžãããè匱æ§ç®¡çã¢ãããŒããç¶æã§ããŸããã¬ããŒãã¯HTMLãJSONãXMLãªã©ãæ§ã ãªåœ¢åŒã§å©çšã§ãããããå¹ åºãCI/CDããã³ã»ãã¥ãªãã£ããã·ã¥ããŒããšäºææ§ããããŸãã
Goãããžã§ã¯ãã«ãããäŸåæ§ãã§ãã¯ã®éç
Dependency-Check ã¯ãšã³ã·ã¹ãã ã¬ãã«ã®è匱æ§ç£æ»ã«ã¯åŒ·åã§ãããGo åºæã®ç°å¢ã§ã®æ©èœã¯ãJVM ããŒã¹ã®ãããžã§ã¯ãã§ã®äœ¿çšã«æ¯ã¹ãŠå¶éãããŠããŸãã
Goèšèªã®ãµããŒãã¯äž»ã«ã¡ã¿ããŒã¿ããŒã¹ã§ãããã»ãã³ãã£ã¯ã¹èªèãã³ãŒã«ã°ã©ãåæã¯å«ãŸããŠããŸãããã€ãŸããè匱ãªããã±ãŒãžãã³ãŒãå ã§å®éã«äœ¿çšãããŠãããã©ããããããã¯èåŒ±ãªæ©èœãå®éã«åŒã³åºãããŠãããã©ããã倿ã§ããŸããããã®çµæãããŒã«ã¯ãæè¡çã«ã¯ååšãããã®ã®å®éã«ã¯å®è¡ãããŠããªãäŸåé¢ä¿ã«å¯ŸããŠã¢ã©ãŒããçæããå¯èœæ§ããããŸãã
NVDã®ãããªå ¬éããŒã¿ããŒã¹ã«å€§ããäŸåããŠããããããªã¢ã«ã¿ã€ã ã®æ å ±é瀺ã®ã¿ã€ã ã©ã€ã³ããé ããçããå¯èœæ§ããããŸããããã¯ããŸã åŠçã»ã«ã¿ãã°åãããŠããªããæ°ãã«å ±åãããè匱æ§ãã»ãã¥ãªãã£ã¢ããã€ã¶ãªãæ€åºããèœåã«åœ±é¿ãäžããŸãã
Dependency-Checkã¯ããœãŒã¹ã³ãŒãå
ã®å®å
šã§ãªãããžãã¯ãèšå®ã®åé¡ãå®å
šã§ãªããã¿ãŒã³ãæ€æ»ããŸãããå
¥åã®æ€èšŒæ¹æ³ãèªèšŒã®åŠçæ¹æ³ãæå·åAPIãæ£ãã䜿çšãããŠãããã©ãããè©äŸ¡ããŸããããããã®é åã¯ãäŸãã°ä»¥äžã®ãããªä»ã®ããŒã«ã§ã«ããŒããå¿
èŠããããŸãã gosec or Semgrep.
Go ã®ã¢ãžã¥ãŒã«è§£æ±ºã眮æãã£ã¬ã¯ãã£ããçè§£ããæ©èœã¯çµã¿èŸŒãŸããŠããŸããã鿥çãªäŸåé¢ä¿ãã«ã¹ã¿ã ã¢ãžã¥ãŒã«ãã¹ã«ãã£ãŠäŸåé¢ä¿ããªãŒã倿Žãããå ŽåãããŒã«ãã¢ãžã¥ãŒã«ããŒãžã§ã³ã誀ã£ãŠè§£éããããã¢ããã€ã¶ãªãæ£ããäžèŽãããªãã£ããããå ŽåããããŸãã
æåŸã«ããã€ãã£ã ããŒã«ã®ãµããŒã㯠Java ã .NET ãªã©ã®ä»ã®èšèªã»ã©æçããŠããªããããDependency-Check ã Go ã¯ãŒã¯ãããŒã«çµ±åããã«ã¯ã远å ã®ã¹ã¯ãªãããŸãã¯ã©ãããŒæ§æãå¿ èŠã«ãªãå ŽåããããŸãã
OWASP Dependency-Checkã¯ãGoãããžã§ã¯ãã«ãããæ¢ç¥ã®è匱ãªäŸåé¢ä¿ãæ€åºããäžã§äŸç¶ãšããŠè²ŽéãªããŒã«ã§ããããããå®éã®äœ¿çšç¶æ³åæãã»ãã³ãã£ãã¯ã¹ãã£ã³ãããŒã¿ãããŒæ€æ»ãªã©ã®æ©èœãåããããŒã«ãšçµã¿åãããããšã§ãæå€§éã®å¹æãçºæ®ããŸããè匱æ§ç®¡çã¯ãŒã¯ãããŒã«ãããŠã¯ãéèŠãªããŒã¹ã©ã€ã³ã¹ãã£ããšããŠæ©èœããŸãããé²åŸ¡ã®å¯äžã®ã¬ã€ã€ãŒãšããŠæ©èœãã¹ãã§ã¯ãããŸããã
ãŽãŒã·ã¯ã
ãŽãŒã·ã¯ã ã¯ã 埪ç°çè€é床 Goã³ãŒãã«ããã颿°ãšã¡ãœããã®è€é床ã埪ç°çè€é床ã¯ã颿°å ã®ç¬ç«ããå®è¡ãã¹ã®æ°ã枬å®ãããœãããŠã§ã¢ææšã§ããè€é床ã¹ã³ã¢ãé«ãå Žåã颿°ã®çè§£ãä¿å®ããŸãã¯å¹æçãªãã¹ããå°é£ã§ããããšã瀺ãããšããããããŸãã
GoCycloã¯ãå颿°ã®å¶åŸ¡ãããŒãåæããããšã§ãè€éãããå¯èœæ§ã®ããã³ãŒããç¹å®ããå¯èªæ§ãšä¿å®æ§ãåäžãããããã«ãªãã¡ã¯ã¿ãªã³ã°ããŸããå颿°ã«æ°å€ã¹ã³ã¢ãæäŸãããŠãŒã¶ãŒãå®çŸ©ããè€éãã®ãããå€ãè¶ ãã颿°ã«ãã©ã°ãèšå®ããããšãã§ããŸãã
GoCycloã¯äœ¿ãããããCIã·ã¹ãã ãã³ãããåããã¯ãã¬ãã¥ãŒèªååãšã¹ã ãŒãºã«é£æºããŸããå€§èŠæš¡ãªå質ä¿èšŒãã€ãã©ã€ã³ã«çµã¿èŸŒãŸããããšãå€ããæéã®çµéãšãšãã«ã³ãŒããè€éã«ãªãããããããªã¹ã¯ãé«ãŸã£ããããã®ãé²ããŸããã¯ãªãŒã³ã³ãŒããšæç¶å¯èœãªã¢ãŒããã¯ãã£ãå®è·µããããŒã ã«ãšã£ãŠãGoCycloã¯è«ççãªè€éãã客芳çã«ææ¡ããã¬ã³ãºãšããŠåœ¹ç«ã¡ãŸãã
GoCycloã®å¶éãšèæ ®äºé
GoCyclo ã¯äŸ¿å©ã§ãããçŠç¹ãçããããã€ãã®å¶éããããããããåºç¯ãªããŒã«ãã§ãŒã³ã®äžéšãšããŠäœ¿çšããã®ãæé©ã§ãã
GoCycloã¯ãã°ãè匱æ§ãã»ãã¥ãªãã£ãªã¹ã¯ãæ€åºããŸããã颿°å
ã®å¶åŸ¡ãããŒã®æ§é çè€éãã®æž¬å®ã®ã¿ã察象ãšããŠããŸãããã®ãããã»ãã³ãã£ãã¯ãšã©ãŒãããããã©ã¯ãã£ã¹ãå®å
šã§ãªãã³ãŒãã£ã³ã°ãã¿ãŒã³ãçºèŠããããšã¯ã§ããŸãããããããåé¡ã«ã¯ãGoCycloã®ãããªä»ã®ããŒã«ã圹ç«ã¡ãŸãã staticcheck or gosec ããé©åã§ãã
ãã®ããŒã«ã¯é¢æ°ãåå¥ã«åæããŸãã颿°ãä»ã®é¢æ°ãšã©ã®ããã«çžäºäœçšãããã¯èæ ®ãããäŸåé¢ä¿ã鿥çãªè«çé£éã«ãã£ãŠçããè€éããè©äŸ¡ããŸããã2ã€ã®é¢æ°ã®åã ã®ã¹ã³ã¢ãäœããŠããçµã¿åããããšæšè«ãå°é£ã«ãªãå ŽåããããGoCycloã¯ãããæ€åºã§ããŸããã
GoCyclo ã«ã¯ãé«ãè€éæ§ãæ£åœåããããã©ããã®ã³ã³ããã¹ããæ¬ ããŠããŸãããããã³ã«è§£æãããžãã¹ã«ãŒã«è©äŸ¡ãšãã£ãç¹å®ã®é¢æ°ã¯ãæ¬è³ªçã«è€éã«ãªãå ŽåããããŸããGoCyclo ã¯ãã¹ãŠã®ã±ãŒã¹ãäžåŸã«æ±ããããç¹æ®ãªã³ã³ããã¹ãã§ã¯èª€æ€ç¥ãçºçããå¯èœæ§ããããŸãã
å¯èŠåãã¢ãŒããã¯ãã£ã«é¢ããæŽå¯ã¯æäŸãããŠããŸãããGoCyclo ã¯è€éæ§ã¹ã³ã¢ã®ãªã¹ããåºåããŸãããã·ã¹ãã å šäœã®ã¡ããªã¯ã¹ãæè¡çè² åµææšãšé¢é£ä»ããããšã¯ã§ããŸãããéçºè ã¯çµæãæåã§è§£éããããããã·ã¥ããŒããå質ã²ãŒããšçµ±åããŠå®çšçãªãã£ãŒãããã¯ãåŸãå¿ èŠããããŸãã
ãŸããèªåãªãã¡ã¯ã¿ãªã³ã°ã®ææ¡ãæäŸãããŸãããè€éãã¯èŠåãããŸãããããã軜æžããæ¹æ³ã«ã€ããŠã®ã¬ã€ãã³ã¹ã¯æäŸãããŸãããéçºè ã¯ç¬èªã®å€æã§ã³ãŒããåæ§ç¯ããæçæ§ãåäžãããå¿ èŠããããŸãã
GoCycloã¯ã颿°ã¬ãã«ã®ã·ã³ãã«ãã培åºãããã¹ãå¯èœã§ã¯ãªãŒã³ãªGoã³ãŒããç¶æããããšãç®æãããŒã ã«æé©ã§ããä»ã®ã¢ãã©ã€ã¶ãŒãšäœµçšããããšã§ãæè¡çãªåé¡ãšãªãåã«ãªãã¡ã¯ã¿ãªã³ã°ã®ã¡ãªãããèŠèŸŒããé åããã€ã©ã€ãããä¿å®æ§ã®é«ãã³ãŒãããŒã¹ã®æ§ç¯ã«è²¢ç®ããŸãã
GoMetaLinter
GoMetaLinter è€æ°ã®Goãªã³ã¿ãŒãåäžã®ã€ã³ã¿ãŒãã§ãŒã¹ã«çµ±åããããã«éçºãããåæã®ããŒã«ã®äžã€ã§ãããã®äž»ãªç®çã¯ãéçºè
ããªã³ã¿ãŒãåå¥ã«å®è¡ããã®ã§ã¯ãªããè€æ°ã®ãªã³ã¿ãŒã䞊åã«å®è¡ã§ããããã«ããããšã§ãéçã³ãŒãè§£æãå¹çåããããšã§ãããGoMetaLinterã¯ã以äžãå«ãæ°åã®ã³ãã¥ããã£ããŒã«ãšã³ã¢ããŒã«ããµããŒãããŠããŸããã golint, vet, staticcheck, ineffassign, errcheckãªã©ãããã
äžææãGoMetaLinterã¯ãé«éã§èšå®å¯èœãªãªã³ãã£ã³ã°ã«ãã¬ããžãåäžã®ã³ãã³ãã§å®çŸãããããŒã ã«ãšã£ãŠæšæºçãªéžæè¢ã§ãããç¹å®ã®ãªã³ã¿ãŒã®æå¹å/ç¡å¹åãé倧床ã«ããåºåã®ãã£ã«ã¿ãªã³ã°ãã¿ã€ã ã¢ãŠãã®ã«ã¹ã¿ãã€ãºãæ©æ¢°å¯èªãªåºåã®çæãšãã£ã䟿å©ãªãªãã·ã§ã³ãæäŸããŠããŸãããGoMetaLinterã¯ãç¹ã«Goã®æé·åæã«ãããŠãGoãããžã§ã¯ããCIãã€ãã©ã€ã³ã«éçè§£æãçµ±åããæ¹æ³ã圢äœãäžã§éèŠãªåœ¹å²ãæãããŸããã
GoMetaLinterã¯ãã¯ãç©æ¥µçã«ã¡ã³ããã³ã¹ãããŠããŸãããããã®ã¢ãŒããã¯ãã£ããåŠã³ããã®éçãæ¹åããããŒã«ãšããŠããã®éºç£ã¯åãç¶ãããŠããŸãã golangci-lint.
GoMetaLinterã®å¶éãšé³è å
GoMetaLinter ã¯åœ±é¿åããããŸããããéçºè ããããæ¡çšããã䜿çšãç¶ãããããåã«èæ ®ãã¹ãéèŠãªå¶éãããã€ããããŸãã
ãã®ããŒã«ã¯å ¬åŒã«éæšå¥šãšãªã£ãŠãããæ°å¹Žéã«ããã£ãŠç©æ¥µçãªã¡ã³ããã³ã¹ãã¢ããããŒããè¡ãããŠããŸããããã®ãããGo ã®æ°ããããŒãžã§ã³ãæ°ãããªã³ã¿ãŒããŸãã¯æŽæ°ãããèšèªæ©èœããµããŒãããŠããªãå¯èœæ§ããããŸããææ°ã®éçºç°å¢ã§ã¯äºææ§ã®åé¡ãçºçãããšã©ãŒãäžæ£ç¢ºãªèšºæããŸãã¯çµ±åã®äžå ·åã«ã€ãªããå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã¯æ¢ç¥ã®æ¬ ç¹ã§ããGoMetaLinterã¯åãªã³ã¿ãŒãåå¥ã®ãµãããã»ã¹ãšããŠå®è¡ããŸãããå€ãã®å Žåãå¹ççãªèª¿æŽãã³ã³ããã¹ãã®å
±æãè¡ãããŸããããã®ãããç¹ã«å€§èŠæš¡ãªãããžã§ã¯ãã§ã¯åææéãé·ããªããŸããæ°ããããŒã«ã§ã¯ã golangci-lint ãªã³ã¿ãŒãçŽæ¥åã蟌ã¿ããªãŒããŒããããæå°éã«æããããšã§ããã®ããã»ã¹ãæé©åããŸããã
Goã¢ãžã¥ãŒã«ã®ãã€ãã£ããµããŒãã¯ãããŸãããGoãšã³ã·ã¹ãã ã GOPATH ã¢ãžã¥ãŒã«ãžã®å¯Ÿå¿ã®ãããGoMetaLinterã¯æ°ããã¯ãŒã¯ãããŒã«å¯Ÿå¿ããŠããŸããã§ãããã¢ãžã¥ãŒã«ããŒã¹ã®ãããžã§ã¯ãã§äœæ¥ããéçºè
ã¯ããã¹ãæåã§èª¿æŽããããäºæããªãåäœã«ééããå¿
èŠããããŸããã
GoMetaLinterã«ã¯ããã詳现ãªã»ãã³ãã£ãã¯è§£æãæ§é è§£ææ©èœãæ¬ ããŠããŸããäž»ã«ã©ãããŒãšããŠæ©èœããåºåã®éçŽä»¥å€ã®ã€ã³ããªãžã§ã³ã¹ã¯æäŸããŠããŸãããå¶åŸ¡ãããŒè§£æãããŒã¿ãããŒè¿œè·¡ãã¢ãŒããã¯ãã£æ€èšŒãªã©ãå¿ èŠãªããŒã ã«ã¯ãããé«åºŠãªããŒã«ãå¿ èŠã§ãã
ã«ã¹ã¿ãã€ãºã¯ããµããŒããããåã ã®ãªã³ã¿ãŒã«ãã£ãŠå¶éãããŸããå®è¡ããããŒã«ã®èšå®ã¯å¯èœã§ãããæ¡åŒµå¯èœãªãã©ã°ã€ã³ã·ã¹ãã ããéçŽãããåºåå šäœã«ãããã«ã¹ã¿ã ãã§ãã¯ã®äœæã¯ãµããŒããããŠããŸããã
ãããã®çç±ãããGoMetaLinterã¯æŽå²çãªããŒã«ãšããŠæãããç¥ãããŠããŸããçŸä»£ã®GoããŒã ã®å€ãã¯ã次ã®ãããªä»£æ¿ããŒã«ã«ç§»è¡ããŠããŸãã golangci-lintãããé«éãªããã©ãŒãã³ã¹ãããåºãäºææ§ãããã¢ã¯ãã£ããªéçºã³ãã¥ããã£ãæäŸããŸãã
ãŽãŒã»ãã¯
ãŽãŒã»ã㯠Goãããžã§ã¯ãã®ã»ãã¥ãªãã£ã¹ãã£ã³ã«ç¹åãããæãèªç¥åºŠã®é«ãéçè§£æããŒã«ã®äžã€ã§ããäž»ãªç®çã¯ãã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãããŒãã³ãŒããããã·ãŒã¯ã¬ãããå®å šã§ãªãTLSã®äœ¿çšãäžé©åãªãšã©ãŒåŠçãªã©ãè匱æ§ãåŒãèµ·ããå¯èœæ§ã®ããäžè¬çãªã³ãŒãã£ã³ã°ãã¿ãŒã³ãæ€åºããããšã§ãããœãŒã¹ã³ãŒããã¡ã€ã«ãè§£æããã»ãã¥ãªãã£ã«ç¹åããçµã¿èŸŒã¿ã«ãŒã«ã»ããã«åºã¥ããŠæ€åºçµæãå ±åããŸãã
GoSecã¯ããã¬ãŒã³ããã¹ããJSONãSARIFãªã©è€æ°ã®åºå圢åŒããµããŒãããŠãããããCI/CDã¯ãŒã¯ãããŒãã»ãã¥ãªãã£ããã·ã¥ããŒããžã®çµ±åã容æã§ãããŸããã«ãŒã«ã®éèŠåºŠã«ãããã£ã«ã¿ãªã³ã°ãç¹å®ã®ãã£ã¬ã¯ããªãããã±ãŒãžã®é€å€ãã«ãŒã«ã®é©çšç¯å²ã®èšå®ãå¯èœã§ãããããã®æ©èœã«ãããããŒã ã¯ãªã¹ã¯ããã€ãºã®èš±å®¹åºŠã«åãããŠçµæã調æŽã§ããŸãã
ãã®ããŒã«ã¯ãæ¢ç¥ã®å®å šã§ãªãã³ãŒãã£ã³ã°åäœãæ€åºããããã®é«éã§è»œéãªãšã³ããªãã€ã³ããæäŸãããããGoã®ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã®åææ®µéã§ããæ¡çšãããŠããŸããç¹ã«èªååããããã€ãã©ã€ã³ã®äžéšãšããŠå®æçã«å®è¡ãããšãå°èŠæš¡ã¢ããªã±ãŒã·ã§ã³ãšå€§èŠæš¡ãªãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®äž¡æ¹ã§å¹æçã«æ©èœããŸãã
GoSecã®å¶éãšå¶çŽ
GoSec ã¯è¡šé¢ã¬ãã«ã®è匱æ§ãç¹å®ããããã®è²ŽéãªããŒã«ã§ãããç¹å®ã®å¶éã®äžã§åäœãããããããè€éãªã³ãŒãããŒã¹ã«å¯Ÿããå®å šãªã»ãã¥ãªã㣠ãœãªã¥ãŒã·ã§ã³ãšããŠã¯é©ããŠããŸããã
GoSecã¯ãéçãªã«ãŒã«ããŒã¹ã®ãããã³ã°ãçšããŠåé¡ãæ€åºããŸãã詳现ãªããŒã¿ãããŒããã€ã³ãåæã¯è¡ããŸãããã€ãŸããä¿¡é Œã§ããªãå ¥åãã¢ããªã±ãŒã·ã§ã³å ãã©ã®ããã«ç§»åããããæçµçã«æ©å¯æ§ã®é«ãæäœã«å°éãããã©ããã远跡ããããšã¯ã§ããŸããããã®çµæãããã°ã©ã å šäœã®ã³ã³ããã¹ããçè§£ããå¿ èŠããããè€æ°æ®µéã«ãããè匱æ§ãèŠéããŠããŸãå¯èœæ§ããããŸãã
ãã®ããŒã«ã¯å¶åŸ¡ãããŒã°ã©ããæ§ç¯ããããå®è¡ãã·ãã¥ã¬ãŒããããããããšã¯ã§ããŸãããæ¡ä»¶åå²ãå°éäžèœãã¹ãåæå®è¡ãªã¹ã¯ã«ã€ããŠæšè«ããããšã¯ã§ããŸããããŸããå®è¡ã³ã³ããã¹ããèæ ®ããªããããã¿ã€ãã³ã°ã«åºã¥ãè匱æ§ãç°å¢åºæã®åäœã«é¢é£ããè«ççãªæ¬ é¥ãç¹å®ããèœåãå¶éãããŸãã
GoSecã¯åæå®è¡æ§ãèæ ®ããŠããŸãããç«¶åç¶æ ãäžé©åãªgoroutineã®äœ¿çšãå ±æãªãœãŒã¹ã®ç«¶åãªã©ãæ¬çªç°å¢ã§äºæãã¬åäœãã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ã€ãªããå¯èœæ§ã®ããäºè±¡ãæ€åºã§ããŸããã
ã«ã¹ã¿ã ã«ãŒã«ã®äœæã«ã¯å¶éããããŸããããçšåºŠã®èª¿æŽã¯å¯èœã§ãããGoSecã¯SemgrepãCodeQLã®ãããªæè»ãªã¯ãšãªãã«ãŒã«å®çŸ©èšèªãæäŸããŠããŸããã瀟å ã»ãã¥ãªãã£ããªã·ãŒã®é©çšãã¢ããªã±ãŒã·ã§ã³åºæã®è åšã®æ€åºãç®æãããŒã ã«ãšã£ãŠãããŒã«ã广çã«æ¡åŒµããããšã¯é£ãããããããŸããã
ã³ãŒããæ¢ç¥ã®ãã¿ãŒã³ã«äžèŽããŠããã«ãããããããã³ã³ããã¹ããæ€èšŒããžãã¯ã«ãã£ãŠä¿è·ãããŠããå Žåã誀æ€ç¥ãçºçããå¯èœæ§ããããŸããç¹ã«è€éãªã€ãã£ãªã ãå€çšãããã¬ã¬ã·ãŒã³ãŒãããŒã¹ã§ã¯ãéçºè ã¯å®éã«ã¯å¯ŸåŠã§ããªãã¢ã©ãŒãã®ç¢ºèªã«æéãè²»ãããŠããŸãå¯èœæ§ããããŸãã
GoSecã¯ãGoãããžã§ã¯ãã®åææ®µéã«ãããæçšãªã¹ãã£ãã§ããç¶ããŠããŸããäžè¬çãªãªã¹ã¯ã«é¢ããè¿ éãªãã£ãŒãããã¯ãæäŸããã»ãã¥ã¢ã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã®åŒ·åã«åœ¹ç«ã¡ãŸãããã ããèŠå¶ã®å³ããç°å¢ã§äœæ¥ããããŒã ããéèŠãªã»ãã¥ãªãã£èŠä»¶ãæã€ããŒã ã¯ãå®å šãªã«ãã¬ããžãå®çŸããããã«ããã詳现ãªéçã¢ãã©ã€ã¶ãã©ã³ã¿ã€ã ã»ãã¥ãªãã£ããŒã«ãšäœµçšããå¿ èŠããããŸãã
ãããã³ãŒã
ãããã³ãŒã Goã®ãœãŒã¹ãã¡ã€ã«ãã¹ãã£ã³ããåç §ãããŠããªã颿°ã倿°ã宿°ãåãªã©ã®æªäœ¿çšã³ãŒããç¹å®ããéçè§£æããŒã«ã§ããäž»ãªç®çã¯ãåŒã³åºããããã¢ã¯ã»ã¹ããããããªãå®çŸ©ãåé€ããããšã§ãéçºè ãã³ãŒãããŒã¹ãã¯ãªãŒã³ã¢ããã§ããããã«ããããšã§ããããã«ãããå¯èªæ§ãåäžããã ãã§ãªããæ©èœäžã®ç®çãæãããªãã³ãŒããåé€ããããšã§ã¡ã³ããã³ã¹ã³ã¹ããåæžãããŸãã
ãã®ããŒã«ã¯é«éã«åäœãããã«ããã€ãã©ã€ã³ãéçºè ããŒã«ãã§ãŒã³ãšã®çµ±åæ§ã«åªããŠããŸãããã¬ãŒã³ããã¹ãåºåãæäŸããã³ãã³ãã©ã€ã³ã§ã®äœ¿çšããµããŒãããŠãããããã¹ã¯ãªãããã³ãããåã®ãã§ãã¯ã«ç°¡åã«çµã¿èŸŒãããšãã§ããŸãããããã³ãŒãã¯ãéå»ã®ãªãã¡ã¯ã¿ãªã³ã°ã®çè·¡ãããã¯ã°ã©ãŠã³ãã§éãã«æ®ã£ãŠããå¯èœæ§ã®ãããå€§èŠæš¡ãŸãã¯å€ãGoãããžã§ã¯ãã§ç¹ã«åœ¹ç«ã¡ãŸãã
ãããã³ãŒãã¯ã广ãäœ¿çšæ³ã®ãªãã³ãŒãã«å³å¯ã«çŠç¹ãåœãŠãããšã§ãããŒã ãèŠéããããã¡ãªæè¡çè² åµãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããããã«ãããã€ã³ã¿ãŒãã§ãŒã¹ã®æç¢ºåãAPIã®åŒ·åããããŠããæå³çãªã³ãŒãæ§æãä¿é²ãããŸãã
ãããã³ãŒãã®å¶éãšå¶çŽ
ãããã³ãŒãã¯åé·ãªå®çŸ©ãèå¥ããã®ã«åœ¹ç«ã¡ãŸãããéãããç¯å²å ã§åäœãããããç¹å®ã®ç°å¢ã§ã¯ãã®æçšæ§ã«åœ±é¿ããŸãã
ãã®ããŒã«ã¯ã³ãŒããéçã«è§£æããŸãããå®è¡æã®æåã¯èæ ®ããŸããããªãã¬ã¯ã·ã§ã³ããã©ã°ã€ã³ã·ã¹ãã ãã€ã³ã¿ãŒãã§ãŒã¹ããŒã¹ã®ãã£ã¹ãããã«ããèå¥åã®åçãªäœ¿çšãæ€åºããããšã¯ã§ããŸããããã®ãããã³ãŒããæªäœ¿çšã®ããã«èŠããŠããå®éã«ã¯éçåç §ã§ã¯ç¢ºèªã§ããªãæ¹æ³ã§åŒã³åºãããŠãããšãã誀æ€ç¥ãçºçããå¯èœæ§ããããŸãã
ãããã³ãŒãã¯ãæç€ºçã«å«ãŸããŠããªãéãããã¹ããã¡ã€ã«ããã¹ããã¬ãŒã ã¯ãŒã¯ãéããŠåŒã³åºãããã³ãŒããçè§£ããŸããããã®ããããããžã§ã¯ãã®æ£ç¢ºæ§ãšãã¹ãã«ãã¬ããžã«ãšã£ãŠéèŠãªãã¹ããã«ããŒé¢æ°ãã»ããã¢ããããžãã¯ã§ãã£ãŠãããããã³ãŒããæªäœ¿çšãšããŠãã©ã°ä»ãããŠããŸãå¯èœæ§ããããŸãã
ããã±ãŒãžéã®å¶åŸ¡ãããŒåæãäŸåé¢ä¿ã®è¿œè·¡ã¯è¡ãããŸããããã®ããŒã«ã¯ãããŒã«ã«ãã¡ã€ã«ãŸãã¯æç€ºçã«ãªã¹ããããããã±ãŒãžã®ã¿ã察象ãšããŸããã³ãŒããã¢ãžã¥ãŒã«å¢çãåçã€ã³ããŒããè¶ããŠéæ¥çã«äœ¿çšãããŠãããã©ããã¯è©äŸ¡ããŸããã
ãã©ã°ãä»ããããã³ãŒããå®å šã«åé€ããæ¹æ³ããæªäœ¿çšã®ã³ãŒããå€éšAPIã«åœ±é¿ãäžãããã©ãããè©äŸ¡ããæ¹æ³ã«ã€ããŠã¯ãææ¡ãããŠããŸãããéçºè ã¯ãç¹ã«ã©ã€ãã©ãªããšã¯ã¹ããŒããããããã±ãŒãžã§äœæ¥ããå Žåããã©ã°ãä»ããããå®çŸ©ãå®å šã«åé€ã§ãããã©ããã確èªã»æ€èšŒããå¿ èŠããããŸãã
ã«ã¹ã¿ãã€ãºãªãã·ã§ã³ã¯æå°éã§ããèå¥åã®çš®é¡ã«ãããã£ã«ã¿ãªã³ã°ãç¹å®ã®èŠåãã€ã³ã©ã€ã³ã§æå¶ããæ¹æ³ãçæãããã³ãŒããã¹ãã¬ã¬ã·ãŒã³ãŒããã¹ãç¡èŠããã¡ã«ããºã ã¯ãããŸããã远å ã®ã©ãããŒããžãã¯ãå®è£ ããªãéããäžéšã®ãããžã§ã¯ãã§ã¯éå°ãªãã€ãºãçºçããå¯èœæ§ããããŸãã
ãããã³ãŒãã¯ãéäžçãªã³ãŒãè¡ç管çãã¹ãæè¡çè² åµåæžæŽ»åã®äžç°ãšããŠæã广çã§ããåç §ãããŠããªãã³ãŒããæç¢ºã«ææ¡ããæå°è¡šé¢ç©ã®ååã培åºããã®ã«åœ¹ç«ã¡ãŸããGoãããžã§ã¯ãã®æ¹è¯ãç°¡çŽ åãç®æãããŒã ã«ãšã£ãŠããããã³ãŒãã¯è»œéãã€çãçµã£ãã¢ãããŒããæäŸããã³ãŒããã¹ãªã ã§ä¿å®æ§ã®é«ãç¶æ ã«ä¿ã¡ãŸãã
ãŽãªã³ã
ãŽãªã³ã ã¯ãGoèšèªåãã«éçºããããªãªãžãã«ã®LintããŒã«ã®äžã€ã§ããäž»ãªç®çã¯ãGoã®å ¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããã¬ã€ãã©ã€ã³ã«åºã¥ããŠãæ £çšçãªã¹ã¿ã€ã«ãšåœåèŠåã匷å¶ããããšã§ããGoã®ãœãŒã¹ãã¡ã€ã«ãã¹ãã£ã³ããæ§æãšã©ãŒãæ©èœãšã©ãŒã§ã¯ãªããã®ã®ãã³ãŒãã®æçæ§ãäžè²«æ§ãå¯èªæ§ã«åœ±é¿ãäžããå¯èœæ§ã®ããã¹ã¿ã€ã«äžã®åé¡ãå ±åããŸãã
ãã®ããŒã«ã¯ã€ã³ã¹ããŒã«ãšå®è¡ãç°¡åã§ãããã¥ã¡ã³ãã³ã¡ã³ãã®äžè¶³ãäžé©åãªåœå圢åŒãããã±ãŒãžãšã¯ã¹ããŒãã®éåããäžèŠãªæ¬åŒ§ãªã©ã«ã€ããŠè¿ éãªãã£ãŒãããã¯ãæäŸããŸããGoLintã¯ãçµ±äžãããã³ãŒãã¹ã¿ã€ã«ãä¿é²ããã³ãŒãããŒã¹ã®ããã²ãŒã·ã§ã³ãšã¡ã³ããã³ã¹ã容æã«ããããã«ããªãŒãã³ãœãŒã¹ããã³ãšã³ã¿ãŒãã©ã€ãºã®Goãããžã§ã¯ãã§åºã䜿çšãããŠããŸããã
åææ®µéã®ãããžã§ã¯ãããžã¥ãã¢éçºè ã®ãªã³ããŒãã£ã³ã°ãããŒã éã®ã³ãŒãäžè²«æ§ã®åŒ·åã«æé©ã§ããé«éãªããã©ãŒãã³ã¹ãšåãããããåºåã«ãããéçºç°å¢ããã«ãªã¯ãšã¹ãã®ãã§ãã¯ããšãã£ã¿çµ±åãªã©ãæ¥åžžçãªäœ¿çšã«æé©ã§ãã
GoLintã®å¶éãšæ¬ ç¹
GoLint ã¯äŸç¶ãšããŠåºãèªç¥ãããŠããŸãããç©æ¥µçã«ã¡ã³ããã³ã¹ãããªããªããçŸä»£ã® Go éçºã¯ãŒã¯ãããŒã§ã®æçšæ§ãå¶éããããã€ãã®å¶éããããŸãã
GoLintã¯å³å¯ã«ã¹ã¿ã€ã«ã«çŠç¹ãåœãŠãŠããŸããè«çãšã©ãŒãããã©ãŒãã³ã¹ã®ããã«ããã¯ãã»ãã¥ãªãã£äžã®è匱æ§ã¯æ€åºããŸããããŸããã³ãŒãã®æ£ç¢ºæ§ãå¹çæ§ãå®å šæ§ãè©äŸ¡ããŸããããã®ãããã³ãŒãã®å®å šæ§ãåäœæ€èšŒããã广çã«è¡ãã«ã¯ãããé«åºŠãªéçè§£æããŒã«ãšçµã¿åãããå¿ èŠããããŸãã
ãã®ããŒã«ã®èšå®æ©èœã¯éãããŠããŸããéçºè ã¯ã«ãŒã«ãç°¡åã«å€æŽãããæå¶ãããããããšãã§ãããã«ã¹ã¿ã ã¹ã¿ã€ã«ã¬ã€ãã©ã€ã³ããããžã§ã¯ãåºæã®æšæºèŠæ ŒããµããŒãããŠããŸããããã®æè»æ§ã®ãªãã¯ãããŒã åºæã®èšå®ãææ°ã®æžåŒèšå®èŠåãšççŸããå¯èœæ§ããããŸãã
GoLint ã®ã«ãŒã«ã»ããã¯éçã§äžå€ã§ããGoLint ã¯çŸåšã¯æŽ»çºã«éçºãããŠããªããããèšèªã®é²åã«åãããŠé²åããããšã¯ãããŸãããGo ã®æ°ããããŒãžã§ã³ã§å°å ¥ãããã¹ã¿ã€ã«ã®åé¡ãèŠéããããçŸåšã§ã¯èš±å®¹ç¯å²ãŸãã¯æ £çšçãšèŠãªãããŠããå®è£ ããã©ã°ä»ããããããå¯èœæ§ããããŸãã
GoLint ã¯ã䞻芳çã§å¿ ãããåé¡ãšãªãããã§ã¯ãªãèŠåãé »ç¹ã«çæããŸããç¹ã«å€§èŠæš¡ãªã³ãŒãããŒã¹ã§ã¯ã軜埮ãªã¹ã¿ã€ã«éåã倿°çºçããŠãæ©èœãæçæ§ã«åœ±é¿ãåã°ãªãå¯èœæ§ããããããäžéšã®ããŒã ã§ã¯ããããã®èŠåã圹ã«ç«ã€ãšãããããããéªéã«ãªããšæããåŸåããããŸãã
Goã¢ãžã¥ãŒã«ãšã®å ç¢ãªçµ±åãå®çŸãããŠããŸãããã¢ãžã¥ãŒã«ããŒã¹ã®ãããžã§ã¯ãã§ã¯åäœããŸãããããæ·±ãäŸåé¢ä¿ã®è§£æ±ºãã¢ãžã¥ãŒã«å¢çã®çè§£ããµããŒãããŠããŸããããã®ãããã¢ãã¬ãããã«ãã¢ãžã¥ãŒã«ãããžã§ã¯ãã§ã¯å¹æãéå®ãããŸãã
å€ãã®æè¿ã®Goãããžã§ã¯ãã§ã¯ãGoLintã¯æ¬¡ã®ãããªããç©æ¥µçã«éçºãããããŒã«ã«çœ®ãæããããŠããŸãã reviveã¯ãåæ§ã®ã¹ã¿ã€ã«ã®é©çšãæäŸããªãããæ§æå¯èœæ§ãããã©ãŒãã³ã¹ãã«ãŒã«ã®æç¢ºããåäžããŸãã
GoLintã¯ãåºæ¬çãªã¹ã¿ã€ã«ã®åé¡ã«å¯Ÿãã軜éãã€è¿ éãªãã£ãŒãããã¯ã«æé©ã§ããæ¢åã®æšæºã«æºæ ããã«ãŒã«ãæã€å°èŠæš¡ãããžã§ã¯ããã¬ã¬ã·ãŒã³ãŒãããŒã¹ã§ããGoLintã¯é«ã䟡å€ãæäŸããŸããé·æçãŸãã¯ããŒã å šäœã§ã®äœ¿çšã«ã¯ãããæè»ã§ä¿å®æ§ã®é«ãæ°ããããŒã«ãé©ããŠããŸãã
ãŽãŒã³ãŒã«ã°ã©ã
ãŽãŒã³ãŒã«ã°ã©ã Goã®ãœãŒã¹ã³ãŒãããã³ãŒã«ã°ã©ããçæããããã«èšèšããããç¹æ®ãªéçè§£æããŒã«ã§ãã颿°éã®é¢ä¿ããããã³ã°ããããšã§ãéçºè ã¯ããã°ã©ã å ã®å®è¡ãããŒãèŠèŠåã§ããŸãããã®æŽå¯ã¯ãã³ãŒãã¢ãŒããã¯ãã£ã®çè§£ãäŸåé¢ä¿ã®è¿œè·¡ãå¯çµåã¢ãžã¥ãŒã«ã®ç¹å®ããªãã¡ã¯ã¿ãªã³ã°ã®æºåã«ç¹ã«åœ¹ç«ã¡ãŸãã
ãã®ããŒã«ã¯é¢æ°ãšã¡ãœããéã®åŒã³åºãé¢ä¿ãåæããçµæãDOTãªã©ã®ã°ã©ã圢åŒã§åºåããŸãããã®ã°ã©ãã¯Graphvizãªã©ã®å¯èŠåããŒã«ã§ã¬ã³ããªã³ã°ã§ããŸããå€§èŠæš¡ãªã³ãŒãããŒã¹ã§ã¯ãGoCallGraphã¯ãç¹å®ã®ã¢ãžã¥ãŒã«ããã©ã®é¢æ°ãåŒã³åºãããŠããããéèŠãªé¢æ°ã«ã€ãªãããã¹ã¯äœããååž°çãªäŸåé¢ä¿ãã©ã®ããã«åœ¢æãããããšãã£ãçåã«éçºè ãçããã®ã«åœ¹ç«ã¡ãŸãã
GoCallGraphã¯ãç£æ»ããªã³ããŒãã£ã³ã°ã»ãã·ã§ã³ããªãã¡ã¯ã¿ãªã³ã°èšç»ã«æŽ»çšã§ããŸãããœãŒã¹ã³ãŒããèªãã ãã§ã¯å®è¡æã®åäœãçè§£ããã®ãå°é£ã§ãã£ãããæéã®ãããã³ãŒãããŒã¹ã«æ§é ããããããŸãã
GoCallGraph ã®å¶éãšèæ ®äºé
GoCallGraph ã¯è²Žéãªã¢ãŒããã¯ãã£ã®æŽå¯ãæäŸããŸãããè€éãªã¯ãŒã¯ãããŒãææ°ã®ã¯ãŒã¯ãããŒãžã®é©çšæ§ã«åœ±é¿ããéèŠãªå¶éãããã€ããããŸãã
ãã®ããŒã«ã¯ãå®éã®ããã°ã©ã ã®åäœãã·ãã¥ã¬ãŒãããããšãªããéçãªåŒã³åºãã°ã©ããçæããŸããæ¡ä»¶ä»ãåŒã³åºããã€ã³ã¿ãŒãã§ãŒã¹ãä»ãã鿥çãªé¢æ°å®è¡ããªãã¬ã¯ã·ã§ã³ããŒã¹ã®åŒã³åºããåºå¥ããŸããããã®ãããç¹ã«ã€ã³ã¿ãŒãã§ãŒã¹ãäŸåæ§æ³šå ¥ãå€çšããGoèšèªã§ã¯ãåŒã³åºããšããžãæ¬ èœããããäžæ£ç¢ºã«è¡šçŸããããããå¯èœæ§ããããŸãã
䞊è¡åŠçã®ãµããŒãã¯éå®çã§ããGoã«ãŒãã³ãšãã£ãã«ããŒã¹ã®å®è¡ãã¹ã¯ã³ãŒã«ã°ã©ãã«èšé²ãããªãããããã®ããŒã«ã¯äžŠè¡ãŸãã¯éåæã®å®è¡ãããŒã衚çŸã§ããŸãããé«åºŠãªäžŠåã¢ããªã±ãŒã·ã§ã³ã®å Žåãã·ã¹ãã ã®å®éã®åäœãäžå®å šãªåœ¢ã§ç€ºãããå¯èœæ§ããããŸãã
GoCallGraph ã¯ãéåžžã«å€§èŠæš¡ãªã³ãŒãããŒã¹ã§ã¯ããŸãæ¡åŒµã§ããŸãããç¹ã«æ°åãã®é¢æ°ãšå€ãã®çžäºäŸåé¢ä¿ãããå Žåãåºåãä¹±éã«ãªã£ãããæäœãè€éã«ãªãããããããå¯èœæ§ããããŸãããã£ã«ã¿ãªã³ã°ãã°ã«ãŒãåããµããŒããããŠããªãå Žåãæåã§åŸåŠçãè¡ããªããšãã°ã©ãã®è§£éãå°é£ã«ãªãå¯èœæ§ããããŸãã
ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ãŒã¹ã¯æäŸãããŠããŸãããããŒã«ã¯çã®ã°ã©ããã¡ã€ã«ãåºåããŸãããå€éšã§ã®ã¬ã³ããªã³ã°ãšè§£éãå¿ èŠã«ãªããŸããããŒã ã¯å®çšçãªã€ã³ãµã€ããæœåºããããã«ãµãŒãããŒãã£ã®å¯èŠåããŒã«ã䜿çšããå¿ èŠããããéæè¡çãªç°å¢ã§ã®å°å ¥ã«æ¯éãããããŸãã
ã»ãã³ãã£ãã¯ã¢ãããŒã·ã§ã³ã¯ãµããŒããããŠããŸãããã°ã©ãã«ã¯é¢æ°åãšåŒã³åºããšããžã®ã¿ã衚瀺ãããŸããããã±ãŒãžã³ã³ããã¹ãããœãŒã¹ãã¡ã€ã«ã®å Žæãå®è¡é »åºŠãã³ãŒãã®è€éããšãã£ãã¡ã¿ããŒã¿ã¯å«ãŸããŸããããã®ãããã³ãŒã«ã°ã©ãæ§é ãšä¿å®æ§ãããã©ãŒãã³ã¹äžã®æžå¿µäºé ãšã®çžé¢é¢ä¿ãææ¡ããããšãå°é£ã§ãã
GoCallGraphã¯ãå°èŠæš¡ããäžèŠæš¡ã®Goã¢ããªã±ãŒã·ã§ã³ã«ãããã¢ãŒããã¯ãã£åæãšé¢æ°ã¬ãã«ã®äŸåé¢ä¿ã®çè§£ã«æé©ã§ããããæ·±ãã»ãã³ãã£ãã¯ã€ã³ãµã€ããã©ã³ã¿ã€ã ãããã¡ã€ãªã³ã°ãããŒã¿ãããŒã®å¯èŠåãè¡ãã«ã¯ãããé«åºŠãªããŒã«ãšçµã¿åãããå¿ èŠããããŸãã
ãŽãŒãã¡ãº
ãŽãŒãã¡ãº Go-Fuzzã¯ãGoå°çšã«éçºããã匷åãªãã¡ãºãã¹ãããŒã«ã§ããéçºè ã¯ãGo颿°ã«å¯ŸããŠã©ã³ãã ãªå ¥åãèªåçã«çæã»å®è¡ããããšã§ãäºæãã¬ã¯ã©ãã·ã¥ããããã¯ãè«ççãªæ¬ é¥ãçºèŠã§ããŸããå®è¡ããã«ã³ãŒããæ€æ»ããåŸæ¥ã®éçè§£æããŒã«ãšã¯ç°ãªããGo-Fuzz㯠åçåæ å€§éã®åæå ¥åããŒã¿ã䜿çšããŠãã¹ã颿°ãå®è¡ããŸãã
ãã®ããŒã«ã¯ãã³ãŒããã€ã³ã¹ãã«ã¡ã³ãåãããã¥ãŒããŒã·ã§ã³ããŒã¹ã®ãšã³ãžã³ãçšããŠå ¥åãé²åãããæ°ããã³ãŒããã¹ã«å°éãããŸããæéã®çµéãšãšãã«ãå ¥åæ€èšŒã®å€±æãåã¢ãµãŒã·ã§ã³ãããã¯ãç¡éã«ãŒããããžãã¹ããžãã¯å ã®é ãããšããžã±ãŒã¹ãªã©ã®è匱æ§ãæããã«ããããšãã§ããŸããGo-Fuzzã¯ãããŒãµãŒããã³ãŒããŒããããã³ã«ãã³ãã©ãŒããããŠæ§é åãããå ¥åãåãå ¥ãããããã颿°ã®ãã¹ãã«ç¹ã«å¹æçã§ãã
Goã®ãã¹ãã³ãŒãã«çµ±åãããŠãããã·ã³ãã«ãªã©ãããŒé¢æ°ã远å ããã ãã§ãã¡ãžã³ã°ãéå§ã§ããŸããäžåºŠèšå®ããã°ãç¶ç¶çã«å®è¡ããããšãã§ããéçããŒã«ã§ã¯æ€åºã§ããªããããªæ·±å»ãªæ©èœäžã®ãã°ãæ€ç¥ã§ããŸãã
Go-Fuzzã®éçãšèª²é¡
Go-Fuzz ã¯äŸ¡å€ãããã¹ã ããŒã«ã§ããããã®æå¹æ§ã¯ããã€ãã®èŠå ã«ãã£ãŠæ±ºãŸãããããžã§ã¯ãå šäœã«ã©ã®çšåºŠåºãé©çšã§ããããå¶éãããŸãã
æ©èœããã«ã¯å®è¡å¯èœã³ãŒããå¿ èŠã§ããGo-Fuzzã¯éçãªãœãŒã¹ã³ãŒããæ§æãçŽæ¥è§£æããŸãããå¯Ÿè±¡é¢æ°ãç¹°ãè¿ãå®è¡ããå¿ èŠãããããããã¡ãžã³ã°äžã«ããªã¬ãŒãããªãå°éäžå¯èœãªã³ãŒããéã¢ã¯ãã£ããªãã©ã³ãã®åé¡ãæ€åºã§ããŸããã
åå¿è ã«ãšã£ãŠãã»ããã¢ããããã»ã¹ã¯è€éã«ãªãå¯èœæ§ããããŸããåºæ¬çãªãã¡ãžã³ã°ã¯ç°¡åã§ãããæå³ã®ããçµæãåŸãã«ã¯ãã«ã¹ã¿ã ããŒãã¹é¢æ°ã®äœæãå ¥åã®ã·ãŒãããããŠçªç¶å€ç°æŠç¥ã®èª¿æŽãå¿ èŠã«ãªãããšããããããŸããç¶¿å¯ãªèšå®ãè¡ããªããšãããŒã«ãç¡é¢ä¿ãªå ¥åãã¹ã®æ¢çŽ¢ã«æéãè²»ãããŠããŸãå¯èœæ§ããããŸãã
ã«ãã¬ããžã¯æ¬è³ªçã«äžå®å šã§ãããã¡ãžã³ã°ã¯å ¥å空éã確ççã«æ¢çŽ¢ãããããå®å šãªã³ãŒãã«ãã¬ããžãä¿èšŒããããšã¯ã§ããŸãããç¹ã«ãå³å¯ãªæ¡ä»¶ãè€æ°æ®µéã®ããžãã¯ã«ãã£ãŠã²ãŒããããŠãããã¹ã¯ãå°éã§ããªãå¯èœæ§ããããŸããéçºè ã¯ãå æ¬çãªä¿èšŒãåŸãããã«ããã¡ãžã³ã°ãã¹ãã«å ããŠåäœãã¹ããšéçè§£æã宿œããå¿ èŠããããŸãã
Go-Fuzzã¯äžŠè¡æ§ãèæ ®ããŠããŸããããã«ãã¹ã¬ããã³ãŒãã«ãããç«¶åç¶æ ãåæã®åé¡ãæ€åºããŸãããGoã«ãŒãã³ããã£ãã«ãå ±æã¡ã¢ãªãå«ã颿°ã¯ãGoå°çšã®ç«¶åæ€åºããŒã«ãŸãã¯äžŠè¡æ§è§£æããŒã«ã䜿çšããŠãã¹ãããå¿ èŠããããŸãã
ãªãœãŒã¹æ¶è²»éã¯èšå€§ã«ãªãå¯èœæ§ããããŸããé·æéå®è¡ããããã¡ãºãã¹ãã¯ãç¹ã«å ¥åå€ã倧ããå Žåãååž°çãªã³ãŒããå€ãå ŽåãCPUãšã¡ã¢ãªã倧éã«æ¶è²»ããå¯èœæ§ããããŸããå®è¡æéãå¶éããããç¬ç«ãããã¹ãã¹ã€ãŒãã䜿çšãããããã«ãGo-FuzzãCIç°å¢ã«çµã¿èŸŒãããšã¯ãå€ãã®å ŽåçŸå®çã§ã¯ãããŸããã
ãããã®å¶éã«ãããããããGo-Fuzzã¯éèŠãªGoã³ã³ããŒãã³ãã«ãããæœåšçã«åããã«ããå®è¡æãã°ãçºèŠããããã®æã广çãªããŒã«ã®äžã€ã§ããã©ã³ãã å®è¡ã«ããå®ç°å¢æ€èšŒãæäŸããããšã§éçè§£æãè£å®ããäºæããªãå ¥åãäžæ£ãªå ¥åã«å¯ŸããŠããœãããŠã§ã¢ãå®å šã«åäœããããšãä¿èšŒããŸãã
éçããã³åçã€ã³ãµã€ãã«ãã Go ã³ãŒãå質ã®ç¿åŸ
éçè§£æã¯ãçŸä»£ã®Goéçºã«ãããŠåºç€çãªåœ¹å²ãæãããŠããŸããã¹ã¿ã€ã«ã®åé¡ãæªäœ¿çšå€æ°ã®æ€åºããã䞊è¡åŠçã®æ¬ é¥ãæ¢ç¥ã®è匱æ§ã®æ€åºãŸã§ãGoãšã³ã·ã¹ãã ã®åããŒã«ã¯ããããç¹å®ã®ç®çãæãããŸããã³ãŒãããŒã¹ã®èŠæš¡ãæ¡å€§ããéçºãã€ãã©ã€ã³ãé«åºŠåããã«ã€ããŠãåäžã®ããŒã«ã ãã§ã¯äžååã«ãªããŸããæã广çãªæŠç¥ã¯ã軜éãªã³ã¿ãŒãã»ãã¥ãªãã£ã¹ãã£ããŒãã¢ãŒããã¯ãã£ã¢ãã©ã€ã¶ãŒãããã«ã¯ã©ã³ã¿ã€ã ãã¡ãžã³ã°ããŒã«ãçµã¿åãããããšã§ããœãããŠã§ã¢ã©ã€ããµã€ã¯ã«å šäœã«ãããéå±€çãªã€ã³ãµã€ããæäŸããããšã§ãã
ã®ãããªããŒã« golangci-lint, staticcheck, revive ã¯ãæ¥åžžçãªã³ãŒãè¡ç管çã«åªããŠãããè¿
éãªãã£ãŒãããã¯ãšäžè²«æ§ã®ç¢ºä¿ãå¯èœã«ããŸããäžæ¹ãã»ãã¥ãªãã£ã«éç¹ã眮ããããŒã«ãšããŠã¯ã gosec, govulncheck, OWASP Dependency-Check æ¢ç¥ã®è
åšãå®å
šã§ãªããã¿ãŒã³ã«å¯ŸããéèŠãªä¿è·ãæäŸããŸããè€éãªç¶æ³ãé話é¢ä¿ãèŠèŠåããå¿
èŠãããããŒã ã«ãšã£ãŠã GoCyclo ã®äžèãš GoCallGraph 䟡å€ããã¢ãŒããã¯ãã£ã®å¯èŠæ§ãæäŸããŸãããŸããé«åºŠãªæ€èšŒã«ã¯ã次ã®ãããªãã¡ãžã³ã°ããŒã«ã圹ç«ã¡ãŸãã Go-Fuzz ãããŠã¢ãã©ã€ã¶ãŒã®ãã㪠CodeQL å®è¡ãã·ãã¥ã¬ãŒãããããå€§èŠæš¡ãªããŒã¿åäœãã¢ãã«åãããããããšã§ãããæ·±ãä¿èšŒãæäŸããŸãã
é©åãªçµã¿åããã®éžæã¯ãç®æšã«ãã£ãŠç°ãªããŸããã¹ã¿ãŒãã¢ããäŒæ¥ã¯ãã¹ããŒããšã·ã³ãã«ããéèŠããå³éžããããªã³ã¿ãŒã¹ã€ãŒããæŽ»çšãããããããŸããã峿 Œãªã³ã³ãã©ã€ã¢ã³ã¹ãã»ãã¥ãªãã£ããŒãºãæã€äŒæ¥ã¯ãæ±æè¿œè·¡ãå¶åŸ¡ãããŒåæãè匱æ§ç£æ»ããµããŒãããããŒã«ã®æ©æµãåããã§ããããã¬ã¬ã·ãŒã³ãŒãããŒã¹ã§ã¯ã次ã®ãããªå°çšã®ã¯ãªãŒã³ã¢ããããŒã«ãå¿
èŠã«ãªãããšããããããŸãã deadcodeäžæ¹ãã¢ãŒããã¯ãã£ãææ°åããããŒã ã¯ãèŠèŠçãŸãã¯ææšããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã«ç®ãåãããããããŸããã
Goãšã³ã·ã¹ãã ã¯é²åãç¶ããŠãããããããµããŒãããããŒã«ãåæ§ã§ããåéçè§£æãœãªã¥ãŒã·ã§ã³ã®çŠç¹ãå¶éããããŠçµ±åã®åŒ·ã¿ãçè§£ããããšã§ãéçºããŒã ã¯ã³ãŒãå質ã匷åãããªãã¡ã¯ã¿ãªã³ã°ã®ä¿¡é Œæ§ãé«ããå®å šã§ä¿å®æ§ã®é«ããœãããŠã§ã¢ããªããªãŒãå®çŸããã«ã¹ã¿ãã€ãºãããããŒã«ãã§ãŒã³ãæ§ç¯ã§ããŸãã