GitLabã奜ãã§ããã°ãå«ãã§ããïŒãœãŒã¹ã³ãŒãã®å質ãåäžããããã§ããïŒãã®åŸãããªãã¯æ£ããå Žæã«æ¥ãŸãããä»æ¥ã¯ãããŒãžèŠæ±ããã§ãã¯ããããã«PVS-Studio CïŒã¢ãã©ã€ã¶ãŒãã»ããã¢ããããæ¹æ³ã説æããŸãããã¹ãŠã®ãŠãã³ãŒã³ã ãŒããšæ¥œããèªæžã
PVS-Studioã¯ãCãC ++ãCïŒãããã³Javaã§èšè¿°ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ãšã©ãŒãšæœåšçãªè匱æ§ãæ€åºããããã®ããŒã«ã§ããWindowsãLinuxãmacOSã®64ãããã·ã¹ãã ã§åäœããŸãã32ãããã64ããããããã³çµã¿èŸŒã¿ARMãã©ãããã©ãŒã ã®ã³ãŒããåæã§ããŸãã
ã¡ãªã¿ã«ãPVS-Studio 7.08ããªãªãŒã¹ããŸããããé¢çœãããšããããããããŸããäŸãã°ïŒ
- Linuxããã³macOSçšã®CïŒã¢ãã©ã€ã¶ãŒã
- ã©ã€ããŒçšãã©ã°ã€ã³;
- ãã¡ã€ã«ã®ãªã¹ãããã§ãã¯ããããã®æ°ããã¢ãŒãã
ãã¡ã€ã«ãªã¹ããã§ãã¯ã¢ãŒã
以åã¯ãç¹å®ã®ãã¡ã€ã«ããã§ãã¯ããããã«ããã¡ã€ã«ã®ãªã¹ããå«ã.xmlãããŒãµãŒã«æž¡ãå¿ èŠããããŸãããããããããŸã䟿å©ã§ã¯ãªãããã.txtã転éããæ©èœãè¿œå ããŸãããããã«ãããäœæ¥ãå€§å¹ ã«ç°¡çŽ åãããŸãã
ç¹å®ã®ãã¡ã€ã«ããã§ãã¯ããã«ã¯ã-sourceFilesïŒ-fïŒãã©ã°ãæå®ãããã¡ã€ã«ã®ãªã¹ããšãšãã«.txtãæž¡ãå¿ èŠããããŸãã次ã®ããã«ãªããŸãã
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
ã³ããããŸãã¯ãã«ãªã¯ãšã¹ãã®ãã§ãã¯ãæ§æããããšã«é¢å¿ãããå Žåã¯ããã®ã¢ãŒãã䜿çšããŠæ§æããããšãã§ããŸããéãã¯ãåæçšã®ãã¡ã€ã«ã®ãªã¹ããååŸããããšã§ããã䜿çšããŠããã·ã¹ãã ã«ãã£ãŠç°ãªããŸãã
ããŒãžãªã¯ãšã¹ãæ€èšŒã®åå
ãã§ãã¯ã®èŠç¹ã¯ãã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºãããåé¡ããããŒãžäžã«ãã¹ã¿ãŒãã©ã³ãã«å°éããªãããšã§ãããŸãããããžã§ã¯ãå šäœãæ¯ååæããå¿ èŠã¯ãããŸãããããã«ããã©ã³ããããŒãžãããšãå€æŽããããã¡ã€ã«ã®ãªã¹ãããããŸãããããã£ãŠãããŒãžèŠæ±ã®ãã§ãã¯ãè¿œå ããããšããå§ãããŸãã
éçã¢ãã©ã€ã¶ãŒãå®è£ ããåã®ããŒãžèŠæ±ã¯æ¬¡ã®ããã«ãªããŸãã
ã€ãŸããå€æŽãã©ã³ãã«ãã£ããã¹ãŠã®ãšã©ãŒã¯ãã¹ã¿ãŒãã©ã³ãã«éãããŸããããã¯æãŸãããªãã®ã§ãåæãè¿œå ãããšãå³ã¯æ¬¡ã®ããã«ãªããŸãã
ç§ãã¡ã¯åæãchanges2ããšã©ãŒããªãå Žåãæã ã¯ããã§ãªãå Žåãæã ã¯ãããæåŠããããŒãžèŠæ±ãåãå ¥ãããããŠã
ã¡ãªã¿ã«ãC / C ++ã®ã³ããããšãã«ãªã¯ãšã¹ãã®åæã«èå³ãããå Žåã¯ãããã§ããã«ã€ããŠèªãããšãã§ããŸãã
Gitlab
GitLabã¯ããªãŒãã³ãœãŒã¹ã®WebããŒã¹ã®DevOpsã©ã€ããµã€ã¯ã«ããŒã«ã§ãããç¬èªã®wikiããã°ãã©ãã«ãŒãCI / CDãã€ãã©ã€ã³ãªã©ãåããGitã®ã³ãŒããªããžããªç®¡çã·ã¹ãã ãæäŸããŸãã
ããŒãžãªã¯ãšã¹ãã®åæã®å®è£ ãéå§ããåã«ããããžã§ã¯ããç»é²ããŠã¢ããããŒãããå¿ èŠããããŸãããããè¡ãæ¹æ³ãããããªãå Žåã¯ãååã«ããèšäºããå§ãããŸãã
泚æ..ã以äžã«èª¬æããç°å¢èšå®æ¹æ³ã¯ããã®1ã€ã§ããç®æšã¯ãåæã«å¿ èŠãªç°å¢ãã»ããã¢ããããã¢ãã©ã€ã¶ãŒãå®è¡ããããã®æé ã瀺ãããšã§ãããããããããªãã®å Žåãç°å¢ã®æºåïŒãªããžããªã®è¿œå ãã¢ãã©ã€ã¶ã®ã€ã³ã¹ââããŒã«ïŒãšåæã®æ®µéãåé¢ããæ¹ãæé©ã§ããããšãã°ãå¿ èŠãªç°å¢ã§Dockerã€ã¡ãŒãžãæºåããŠäœ¿çšããããŸãã¯ãã®ä»ã®æ¹æ³ã§ãã
ããããäœãèµ·ããããããããç解ããããã«ã次ã®å³ãåç §ããããšããå§ãããŸãã
ã¢ãã©ã€ã¶ãŒãæ©èœããã«ã¯.NETCore SDK 3ãå¿ èŠã§ãããããã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããåã«ãã¢ãã©ã€ã¶ãŒã«å¿ èŠãªäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããMicrosoftãªããžããªãŒãè¿œå ããå¿ èŠããããŸããããŸããŸãªLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³çšã®Microsoftãªããžããªã®è¿œå ã«ã€ããŠã¯ã察å¿ããããã¥ã¡ã³ãã§èª¬æãããŠããŸãã
ããã±ãŒãžãããŒãžã£ãä»ããŠPVS-Studioãã€ã³ã¹ããŒã«ããã«ã¯ãPVS-Studioãªããžããªãè¿œå ããå¿ èŠããããŸããããŸããŸãªãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ãªããžããªã®è¿œå ã«ã€ããŠã¯ãããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ã§è©³ãã説æããŠããŸãã
ã¢ãã©ã€ã¶ãŒãæäœããã«ã¯ãã©ã€ã»ã³ã¹ããŒãå¿ èŠã§ããã¢ãã©ã€ã¶ãŒã®ããŠã³ããŒãããŒãžã§ãã©ã€ã¢ã«ã©ã€ã»ã³ã¹ãååŸã§ããŸãã
泚æ..ã説æãããŠããåäœã¢ãŒãïŒããŒãžèŠæ±ã®åæïŒã«ã¯ããšã³ã¿ãŒãã©ã€ãºã©ã€ã»ã³ã¹ãå¿ èŠã§ããããšã«æ³šæããŠãã ããããããã£ãŠããã®æäœã¢ãŒããè©Šãå Žåã¯ã[ã¡ãã»ãŒãž]ãã£ãŒã«ãã«ãšã³ã¿ãŒãã©ã€ãºã©ã€ã»ã³ã¹ãå¿ èŠã§ããããšãå¿ããã«æå®ããŠãã ããã
ããŒãžèŠæ±ãçºçããå Žåã¯ãå€æŽããããã¡ã€ã«ã®ãªã¹ãã®ã¿ãåæããå¿ èŠããããŸãããã以å€ã®å Žåã¯ããã¹ãŠã®ãã¡ã€ã«ãåæããŸããåæåŸããã°ãå¿ èŠãªåœ¢åŒã«å€æããå¿ èŠããããŸãã
ããã§ãäœæ¥ã®ã¢ã«ãŽãªãºã ãç®ã®åã«ããã®ã§ãã¹ã¯ãªããã®äœæã«é²ãããšãã§ããŸãããããè¡ãã«ã¯ã.gitlab-ci.ymlãã¡ã€ã«ãå€æŽããããããã§ãªãå Žåã¯äœæããå¿ èŠããããŸãããããäœæããã«ã¯ããããžã§ã¯ãã®ååãã¯ãªãã¯ããå¿ èŠããããŸã-> CI / CDãèšå®ããŸãã
ããã§ãã¹ã¯ãªãããäœæããæºåãæŽããŸããããŸããã¢ãã©ã€ã¶ãŒãã€ã³ã¹ããŒã«ããŠã©ã€ã»ã³ã¹ãå ¥åããã³ãŒããèšè¿°ããŸãããã
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
ã€ã³ã¹ããŒã«ãšã¢ã¯ãã£ãåã¯ä»ã®ãã¹ãŠã®ã¹ã¯ãªããã®åã«è¡ãå¿ èŠããããããç¹å¥ãªbefore_scriptã©ãã«ã䜿çšããŸãããã®æçã«ã€ããŠå°ã説æããŸãã
ã¢ãã©ã€ã¶ãŒã®ã€ã³ã¹ããŒã«ã®æºåïŒ
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
PVS-Studioãªããžããªãšã¢ãã©ã€ã¶ãŒã®è¿œå ïŒ
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
ã©ã€ã»ã³ã¹ã®ã¢ã¯ãã£ãåïŒ
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$ PVS_NAME-ãŠãŒã¶ãŒåã
$ PVS_KEY-補åããŒã
ãããžã§ã¯ãã®äŸåé¢ä¿ã埩å ããŸãã$ CI_PROJECT_DIRã¯ãããžã§ã¯ããã£ã¬ã¯ããªãžã®ãã«ãã¹ã§ãã
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
æ£ããåæããã«ã¯ããããžã§ã¯ããæ£åžžã«ãã«ããããã®äŸåé¢ä¿ã埩å ããå¿ èŠããããŸãïŒããšãã°ãå¿ èŠãªNuGetããã±ãŒãžãããŒãããå¿ èŠããããŸãïŒã
ããªãã¯ãã¯ãªãã¯ããŠãã©ã€ã»ã³ã¹æ å ±ãå«ãç°å¢å€æ°ãèšå®ããããšãã§ããŸãèšå®ãããã®åŸã®CI / CDã
ç§ãã¡ãèŠã€ããéãããŠã£ã³ããŠã§å€æ°é ç®ããå³åŽã«ããã¯ãªãã¯ããŠå±éãããã¿ã³ãå€æ°ãè¿œå ããŸããçµæã¯æ¬¡ã®ããã«ãªããŸãã
ããã§ãåæã«é²ãããšãã§ããŸãããŸããå®å šãªåæã®ããã®ã¹ã¯ãªãããè¿œå ããŸãããããã©ã°-tã¯ãœãªã¥ãŒã·ã§ã³ãžã®ãã¹ã転éãããã©ã°-oã¯åæçµæãèšé²ãããŠãããã¡ã€ã«ã®æžã蟌ã¿å Žæã§ãããªã¿ãŒã³ã³ãŒãã«ãé¢å¿ããããŸãããã®å Žåãåæäžã«èŠåãçºè¡ããããšããæ å ±ããªã¿ãŒã³ã³ãŒãã«å«ãŸããŠãããšãã«æäœãçµäºããããšã«é¢å¿ããããŸãããã®ã¹ããããã¯æ¬¡ã®ããã«ãªããŸãã
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
ãªã¿ãŒã³ã³ãŒãã¯ããããã¹ã¯ã®ããã«æ©èœããŸããããšãã°ãåæã®çµæãšããŠèŠåãçºè¡ãããå Žåããªã¿ãŒã³ã³ãŒãã¯8ã«ãªããŸããã©ã€ã»ã³ã¹ã®æå¹æéã1ãæ以å ã®å Žåããªã¿ãŒã³ã³ãŒãã¯4ã«ãªããŸããåæäžã«ãšã©ãŒãèŠã€ãããã©ã€ã»ã³ã¹ã®æå¹æéã1ãæ以å ã®å Žåãã³ãŒãã¯4ã«ãªããŸããæ»ãå€ãäž¡æ¹ã®å€ãæžã蟌ãŸããŸãïŒæ°å€ãåèšããŠãæçµçãªæ»ãã³ãŒã-8 + 4 = 12ãååŸããŸãããããã£ãŠã察å¿ãããããããã§ãã¯ããããšã«ãããåæäžã«ããŸããŸãªç¶æ ã«é¢ããæ å ±ãååŸã§ããŸãããªã¿ãŒã³ã³ãŒãã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ããPVS-Studioã䜿çšããã³ãã³ãã©ã€ã³ããã®Visual Studio / MSBuild / .NETCoreãããžã§ã¯ãã®ç¢ºèªãã®ãpvs-studio-dotnetïŒLinux / macOSïŒãªã¿ãŒã³ã³ãŒããã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ãã®å Žåããã¹ãŠã®ãªã¿ãŒã³ã³ãŒãã«é¢å¿ããããŸããããã§8ã衚瀺ãããŸãã
- exit_code=$((($exit_code & 8)/8))
æ»ãã³ãŒãã«é¢å¿ã®ããæ°å€ã®ããããå«ãŸããŠããå Žåã¯1ãååŸãããã以å€ã®å Žåã¯0ãååŸã
ãŸããããŒãžèŠæ±ã®è§£æãè¿œå ãããšããæ¥ãŸããããããè¡ãåã«ãã¹ã¯ãªããã®å ŽæãæºåããŸããããããŒãžèŠæ±ãçºçãããšãã«ã®ã¿å®è¡ããå¿ èŠããããŸãã次ã®ããã«ãªããŸãã
merge:
script:
only:
- merge_requests
ã¹ã¯ãªããèªäœã«ç§»ããŸããããä»®æ³ãã·ã³ããªãªãžã³/ãã¹ã¿ãŒã«ã€ããŠäœãç¥ããªããšããäºå®ã«ééããŸããããããã£ãŠãç§ãã¡ã¯åœŒå¥³ãå°ãå©ããŸãïŒ
- git fetch origin
次ã«ããã©ã³ãéã®éããååŸããŠãçµæãtxtãã¡ã€ã«ã«ä¿åããŸãããã
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
ããã§ã$ CI_COMMIT_SHAã¯æåŸã®ã³ãããã®ããã·ã¥ã§ãã
次ã«ã-fãã©ã°ã䜿çšããŠãã¡ã€ã«ã®ãªã¹ãã®åæãå®è¡ããŸããåä¿¡ãã以åã®.txtãã¡ã€ã«ã転éããŸããããŠãå®å šãªåæãšã®é¡æšã«ãã£ãŠããªã¿ãŒã³ã³ãŒããèŠãŠãã ããïŒ
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
ããŒãžèŠæ±ããã§ãã¯ããããã®å®å šãªã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
ãã¹ãŠã®ã¹ã¯ãªãããå®è¡ãããåŸããã°ã®å€æãè¿œå ããã ãã§ããafter_scriptã©ãã«ãšplog-converterãŠãŒãã£ãªãã£ã䜿çšããŸãã
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
plog-converter ãŠãŒãã£ãªãã£ã¯ãã¢ãã©ã€ã¶ã®ãšã©ãŒã¬ããŒããHTMLãªã©ã®ããŸããŸãªåœ¢åŒã«å€æããããã«äœ¿çšããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãããŠãŒãã£ãªãã£ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ã®ãµãã»ã¯ã·ã§ã³ãPlogConverterãŠãŒãã£ãªãã£ããåç §ããŠãã ããã
ã¡ãªã¿ã«ãIDEããããŒã«ã«ã§.jsonã¬ããŒãã䟿å©ã«æäœãããå Žåã¯ãIDERiderçšã®ãã©ã°ã€ã³ããå§ãããŸãããã®äœ¿çšæ³ã«ã€ããŠã¯ã察å¿ããããã¥ã¡ã³ãã§è©³ãã説æãããŠããŸãã
䟿å®äžãããã«.gitlab-ci.ymlå šäœã瀺ããŸãã
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
ãã¹ãŠããã¡ã€ã«ã«è¿œå ããããã[å€æŽã®ã³ããã]ãã¯ãªãã¯ããŸãããã¹ãŠãæ£ããããšã確èªããã«ã¯ãCI / CD- > Pipelines- > Runningã«ç§»åããŸããä»®æ³ãã·ã³ãŠã£ã³ããŠãéããæåŸã«æ¬¡ã®ããã«ãªããŸãã
Jobãæåããã® ãèŠãŸãã-æåããã¹ãŠãé 調ã§ããããã§ãè¡ã£ãããšããã¹ãã§ããŸãã
ä»äºã®äŸ
äœæ¥ã®äŸãšããŠãè€æ°ã®ãã¡ã€ã«ãååšããåçŽãªãããžã§ã¯ãïŒmasterå ïŒãäœæããŠã¿ãŸãããããã®åŸãå¥ã®ãã©ã³ãã§ã1ã€ã®ãã¡ã€ã«ã®ã¿ãå€æŽããããŒãžèŠæ±ãäœæããããšããŸãã
å€æŽããããã¡ã€ã«ã«ãšã©ãŒãå«ãŸããŠããå Žåãšå«ãŸããŠããªãå Žåã®2ã€ã®ã±ãŒã¹ãèããŠã¿ãŸãããŸãããšã©ãŒã®ããäŸã
ãã¹ã¿ãŒãã©ã³ãã«ãšã©ãŒãå«ãŸãªãProgram.csãã¡ã€ã«ããããå¥ã®ãã©ã³ãã§ãéçºè ããšã©ãŒã®ããã³ãŒããè¿œå ããããŒãžèŠæ±ãäœæããããšããŸãã圌ãã©ã®ãããªééããç¯ãããã¯ããã»ã©éèŠã§ã¯ãããŸãããäž»ãªããšã¯ãããååšãããšããããšã§ããããšãã°ãç§ã¯ã¹ããŒæŒç®åãå¿ããŸããïŒã¯ãã圌ãã¯ãšãŠãééã£ãŠããŸãïŒïŒ
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
ãšã©ãŒã®ããäŸãåæããçµæãèŠãŠã¿ãŸãããããŸãã1ã€ã®ãã¡ã€ã«ã®ã¿ã解æãããããã«ããããã«ãpvs-studio-dotnetèµ·åè¡ã«-rãã©ã°ãè¿œå ããŸããã
ã¢ãã©ã€ã¶ãŒããšã©ãŒãæ€åºãããã©ã³ãã®ããŒãžãèš±å¯ããªãã£ãããšãããããŸãã
ãšã©ãŒãªãã§äŸã確èªããŸããã³ãŒãã®ä¿®æ£ïŒ
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
ããŒãžèŠæ±åæã®çµæïŒ
ã芧ã®ãšããããšã©ãŒã¯æ€åºããããã¿ã¹ã¯ã®å®è¡ã¯æåããŸãããããã確èªããããšæããŸãã
çµè«
ãã©ã³ããããŒãžããåã«äžè¯ã³ãŒããé€å€ããããšã¯éåžžã«äŸ¿å©ã§æ¥œããã§ãããããã£ãŠãCI / CDã䜿çšããŠããå Žåã¯ããã¹ãçšã«éçã¢ãã©ã€ã¶ãŒãçµã¿èŸŒãã§ã¿ãŠãã ãããããã«ãããã¯éåžžã«ç°¡åã«è¡ãããŸãã
æž èŽããããšãããããŸããã
ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯NikolayMironovã䜿çšããŠãã ãããPVS-Studio for CïŒã䜿çšããGitLabã§ã®ããŒãžèŠæ±ã®åæã