PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
GitLabแŠ• แ‹ญแ‹ˆแ‹ณแˆ‰ แŠฅแŠ“ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝแŠ• แ‹ญแŒ แˆ‹แˆ‰? แ‹จแˆแŠ•แŒญ แŠฎแ‹ตแ‹ŽแŠ• แŒฅแˆซแ‰ต แˆ›แˆปแˆปแˆ แ‹ญแˆแˆแŒ‹แˆ‰? แŠจแ‹šแ‹ซ แ‹ˆแ‹ฐ แ‰ตแŠญแŠญแˆˆแŠ›แ‹ แ‰ฆแ‰ณ แˆ˜แŒฅแ‰ฐแ‹‹แˆ. แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝแŠ• แˆˆแˆ˜แˆแ‰ฐแˆฝ แ‹›แˆฌ แ‹จPVS-Studio C# analyzerแŠ• แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแ‹ซแ‹‹แ‰…แˆฉ แŠฅแŠ•แАแŒแˆญแ‹Žแ‰ณแˆˆแŠ•แข แˆˆแˆแˆ‰แˆ แŠฅแŠ•แŠณแŠ• แ‹ฐแˆต แŠ แˆˆแ‹Žแ‰ต แŠฅแŠ“ แ‹ฐแˆตแ‰ฐแŠ› แŠ•แ‰ฃแ‰ฅแข

PVS- แˆตแ‰ฑแ‹ฒแ‹ฎ โ€” แ‰ Cแฃ C++แฃ C# แŠฅแŠ“ Java แ‹จแ‰ฐแŒปแ‰ แ‹จแ•แˆฎแŒแˆซแˆžแ‰ฝ แˆแŠ•แŒญ แŠฎแ‹ต แ‹แˆตแŒฅ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝแŠ• แŠฅแŠ“ แˆŠแˆ†แŠ‘ แ‹จแˆšแ‰ฝแˆ‰ แ‰ฐแŒ‹แˆ‹แŒญแАแ‰ถแ‰ฝแŠ• แˆˆแˆ˜แˆˆแ‹จแ‰ต แ‹จแˆšแ‹ซแˆตแ‰ฝแˆ แˆ˜แˆณแˆชแ‹ซ แАแ‹แข แ‰ 64-แ‰ขแ‰ต แˆตแˆญแ‹“แ‰ถแ‰ฝ แˆ‹แ‹ญ แ‹ญแˆฐแˆซแˆแข Windows, Linux ะธ macOS32-แ‰ขแ‰ตแฃ 64-แ‰ขแ‰ต แŠฅแŠ“ แ‹จแ‰ฐแŠซแ‰ฐแ‰ฑ แ‹จARM แˆ˜แ‹ตแˆจแŠฎแ‰ฝแŠ• แ‹’แˆ‹แˆ› แ‹ซแ‹ฐแˆจแŒˆ แŠฎแ‹ต แˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แ‹ญแ‰ฝแˆ‹แˆแข

แ‰ แАแŒˆแˆซแ‰ฝแŠ• แˆ‹แ‹ญ แ‰ฅแ‹™ แАแŒˆแˆญ แ‹จแˆฐแˆซแŠ•แ‰ แ‰ตแŠ• PVS-Studio 7.08 แŠ แ‹แŒฅแ‰ฐแŠ“แˆแข แ‹จแˆšแˆตแ‰ฅ. แˆˆแˆแˆณแˆŒ:

  • แ‹จC# แ‰ฐแŠ•แ‰ณแŠ แˆตแˆญ Linux ะธ macOS;
  • แ‰ฐแˆฐแŠช แˆˆ Rider;
  • แŠ แ‹ฒแˆต แ‹จแ‹แ‹ญแˆ แ‹แˆญแ‹แˆญ แ‰ผแŠญ แˆแАแ‰ณ.

แ‹จแ‹แ‹ญแˆ แ‹แˆญแ‹แˆญ แŠ แˆจแŒ‹แŒแŒฅ แˆแАแ‰ณ

แŠจแ‹šแˆ… แ‰ แŠแ‰ต แ‹จแ‰ฐแ‹ˆแˆฐแŠ‘ แ‹แ‹ญแˆŽแ‰ฝแŠ• แˆˆแˆ˜แˆแ‰ฐแˆฝ แ‹จ .xml แ‹แ‹ญแˆ แŠจแ‹แ‹ญแˆŽแ‰ฝ แ‹แˆญแ‹แˆญ แŒ‹แˆญ แ‹ˆแ‹ฐ แ‰ฐแŠ•แ‰ณแŠ™ แˆ›แˆตแ‰ฐแˆ‹แˆˆแ แŠ แˆตแˆแˆ‹แŒŠ แАแ‰ แˆญแข แАแŒˆแˆญ แŒแŠ• แ‹ญแˆ… แ‰ แŒฃแˆ แˆแ‰น แˆตแˆ‹แˆแˆ†แА, แˆ…แ‹ญแ‹ˆแ‰ตแŠ• แ‰ แŠฅแŒ…แŒ‰ แ‹จแˆšแ‹ซแ‰ƒแˆแˆ txt แŠ• แ‹จแˆ›แˆตแ‰ฐแˆ‹แˆˆแ แ‰ฝแˆŽแ‰ณแŠ• แŒจแˆแˆจแŠ“แˆ.

แ‹จแ‰ฐแ‹ˆแˆฐแŠ‘ แ‹แ‹ญแˆŽแ‰ฝแŠ• แˆˆแˆ˜แˆแ‰ฐแˆฝ แ‰ฃแŠ•แ‹ฒแˆซแ‹แŠ• แˆ˜แŒฅแ‰€แˆต แŠ แˆˆแ‰ฅแ‹Žแ‰ต --แˆแŠ•แŒญ แ‹แ‹ญแˆŽแ‰ฝ (-f) แŠฅแŠ“ txt แ‰ แ‹แ‹ญแˆŽแ‰ฝ แ‹แˆญแ‹แˆญ แ‹ญแˆˆแ‰แข แ‹ญแˆ…แŠ• แ‹ญแˆ˜แˆตแˆ‹แˆแข

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

แ‰ผแŠฎแ‰ฝแŠ• แˆˆแˆ›แ‹‹แ‰€แˆญ แ‹ˆแ‹ญแˆ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝแŠ• แˆˆแˆ˜แˆณแ‰ฅ แแˆ‹แŒŽแ‰ต แŠซแˆˆแˆ… แ‹ญแˆ…แŠ• แˆแАแ‰ณ แ‰ แˆ˜แŒ แ‰€แˆแˆ แˆ›แ‹ตแˆจแŒ แ‰ตแ‰ฝแˆ‹แˆˆแˆ…แข แˆแ‹ฉแАแ‰ฑ แˆˆแˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แ‹จแ‹แ‹ญแˆŽแ‰ฝแŠ• แ‹แˆญแ‹แˆญ แ‰ แˆ›แŒแŠ˜แ‰ต แˆ‹แ‹ญ แ‹ญแˆ†แŠ“แˆ แŠฅแŠ“ แ‰ แ‹จแ‰ตแŠ›แ‹ แˆตแˆญแ‹“แ‰ถแ‰ฝ แˆ‹แ‹ญ แŠฅแŠ•แ‹ฐแˆšแŒ แ‰€แˆ™ แ‹ญแ‹ˆแˆฐแŠ“แˆ.

แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แˆ›แˆจแŒ‹แŒˆแŒซ แˆ˜แˆญแˆ…

แ‹จแ‰ผแŠฉ แ‹‹แŠ“ แ‹ญแ‹˜แ‰ต แ‰ แ‰ฐแŠ•แ‰ณแŠ™ แ‹จแ‰ฐแŒˆแŠ™แ‰ต แ‰ฝแŒแˆฎแ‰ฝ แ‹ˆแ‹ฐ แ‹แˆ…แ‹ฐแ‰ต แ‹แˆตแŒฅ แŠฅแŠ•แ‹ณแ‹ญแŒˆแ‰ก แˆ›แˆจแŒ‹แŒˆแŒฅ แАแ‹ แ‰ฃแˆˆแ‰คแ‰ต แ‰…แˆญแŠ•แŒซแ. แŠฅแŠ•แ‹ฒแˆแˆแฃ แŠ แŒ แ‰ƒแˆ‹แ‹ญ แ•แˆฎแŒ€แŠญแ‰ฑแŠ• แ‰ แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แŒŠแ‹œ แˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แŠ แŠ•แˆแˆแŒแˆแข แŠจแ‹šแˆ…แˆ แ‰ แˆ‹แ‹ญ แ‰…แˆญแŠ•แŒซแŽแ‰ฝแŠ• แ‰ แˆ›แ‹‹แˆƒแ‹ต, แ‹จแ‰ฐแ‰€แ‹จแˆฉ แ‹แ‹ญแˆŽแ‰ฝ แ‹แˆญแ‹แˆญ แŠ แˆˆแŠ•. แˆตแˆˆแ‹šแˆ… แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แ‰ผแŠญ แˆˆแˆ˜แŒจแˆ˜แˆญ แˆ€แˆณแ‰ฅ แŠ แ‰€แˆญแ‰ฃแˆˆแˆแข

แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆต แ‰ฐแŠ•แ‰ณแŠ แŠจแˆ˜แ‰…แˆจแ‰ก แ‰ แŠแ‰ต แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹ แ‹ญแˆ…แŠ• แ‹ญแˆ˜แˆตแˆ‹แˆแข

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แ‰ แ‰…แˆญแŠ•แŒซแ แ‹แˆตแŒฅ แ‹จแАแ‰ แˆฉแ‰ต แˆแˆ‰แˆ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แˆ›แˆˆแ‰ต แАแ‹ แˆˆแ‹แŒฆแ‰ฝ, แ‹ˆแ‹ฐ แ‹‹แŠ“แ‹ แ‰…แˆญแŠ•แŒซแ แ‹ญแˆธแŒ‹แŒˆแˆซแˆ. แ‹ญแˆ…แŠ•แŠ• แˆตแˆˆแˆ›แŠ•แˆแˆแŒ, แ‰ตแŠ•แ‰ณแŠ”แ‹แŠ• แŠฅแŠ•แŒจแˆแˆซแˆˆแŠ•, แŠฅแŠ“ แŠ แˆแŠ• แ‹ˆแˆจแ‹ณแ‹ แ‹ญแˆ…แŠ• แ‹ญแˆ˜แˆตแˆ‹แˆ.

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แŠฅแŠ•แˆ˜แˆจแˆแˆซแˆˆแŠ•แข แˆˆแ‹แŒฆแ‰ฝ2 แŠฅแŠ“, แˆแŠ•แˆ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แŠจแˆŒแˆ‰, แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แŠ• แŠฅแŠ•แ‰€แ‰ แˆ‹แˆˆแŠ•, แŠ แˆˆแ‰ แˆˆแ‹šแ‹ซ แŒแŠ• แ‹แ‹ตแ‰… แŠฅแŠ“แ‹ฐแˆญแŒ‹แˆˆแŠ•.

แ‰ แАแŒˆแˆซแ‰ฝแŠ• แˆ‹แ‹ญ แ‰แˆญแŒ แŠแАแ‰ตแŠ• แˆˆแˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แŠฅแŠ“ แ‹จC/C++ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝแŠ• แˆˆแˆ˜แˆณแ‰ฅ แแˆ‹แŒŽแ‰ต แŠซแˆŽแ‰ต แˆตแˆˆแˆฑ แˆ›แŠ•แ‰ แ‰ฅ แ‹ญแ‰ฝแˆ‹แˆ‰แข แŠฅแ‹šแˆ….

GitLab

GitLab แŠญแแ‰ต แˆแŠ•แŒญ แ‹จแ‹ดแ‰ญแŠฆแ•แˆต แ‹จแˆ…แ‹ญแ‹ˆแ‰ต แŠกแ‹ฐแ‰ต แ‹ตแˆญ แˆ˜แˆณแˆชแ‹ซ แˆˆแŒŠแ‰ต แ‹จแˆซแˆฑ แ‹ŠแŠช แฃ แ‹จแˆณแŠ•แŠซ แˆ˜แŠจแ‰ณแ‰ฐแ‹ซ แˆฒแˆตแ‰ฐแˆ แฃ CI/CD แ‰งแŠ•แ‰ง แˆ˜แˆตแˆ˜แˆญ แŠฅแŠ“ แˆŒแˆŽแ‰ฝ แ‰ฃแˆ…แˆชแ‹ซแ‰ต แ‹ซแˆˆแ‹ แ‹จแŠฎแ‹ต แˆ›แŠจแˆ›แ‰ป แŠ แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แˆตแˆญแ‹“แ‰ตแŠ• แ‹จแˆšแ‹ซแ‰€แˆญแ‰ฅ แАแ‹แข

แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝแŠ• แ‰ตแŠ•แ‰ฐแŠ“ แ‰ตแŒแ‰ แˆซ แŠจแˆ˜แ‰€แŒ แˆแ‹Ž แ‰ แŠแ‰ต แ•แˆฎแŒ€แŠญแ‰ตแ‹ŽแŠ• แˆ˜แˆ˜แ‹แŒˆแ‰ฅ แŠฅแŠ“ แˆ˜แˆตแ‰€แˆ แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆแข แ‹ญแˆ…แŠ• แŠฅแŠ•แ‹ดแ‰ต แˆ›แ‹ตแˆจแŒ แŠฅแŠ•แ‹ณแˆˆแ‰ฅแ‹Ž แŠซแˆ‹แ‹ˆแ‰, แŠฅแŠ” แŠฅแŒ แ‰แˆ›แˆˆแˆ แŒฝแˆ‘แ แ‹จแˆฅแˆซ แ‰ฃแˆแ‹ฐแˆจแ‰ฃแ‹ฌ แข

แŠ แˆ˜แˆˆแŠจแ‰ฐ. แŠจแ‹šแˆ… แ‰ แ‰ณแ‰ฝ แ‹จแ‰ฐแŒˆแˆˆแŒธแ‹แŠ• แŠ แŠซแ‰ฃแ‰ข แ‹จแˆ›แ‹˜แŒ‹แŒ€แ‰ต แˆ˜แŠ•แŒˆแ‹ต แŠจแˆšแ‰ปแˆ‰แ‰ต แ‹แˆตแŒฅ แŠ แŠ•แ‹ฑ แАแ‹. แŒแ‰ก แˆˆแˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แŠ แˆตแˆแˆ‹แŒŠ แ‹จแˆ†แАแ‹แŠ• แŠ แŠซแ‰ฃแ‰ข แˆˆแˆ›แ‹˜แŒ‹แŒ€แ‰ต แŠฅแŠ“ แ‰ฐแŠ•แ‰ณแŠ™แŠ• แˆˆแˆ˜แŒ€แˆ˜แˆญ แ‹ฐแˆจแŒƒแ‹Žแ‰ฝแŠ• แˆ›แˆณแ‹จแ‰ต แАแ‹. แˆแŠ“แˆแ‰ฃแ‰ต แ‰ แŠฅแˆญแˆตแ‹Ž แŒ‰แ‹ณแ‹ญ แˆ‹แ‹ญ แ‹จแŠ แŠซแ‰ฃแ‰ข แ‹แŒแŒ…แ‰ต แ‹ฐแˆจแŒƒแ‹Žแ‰ฝแŠ• แˆ˜แˆˆแ‹จแ‰ต (แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ˜แŒจแˆ˜แˆญ แฃ แ‰ฐแŠ•แ‰ณแŠ™แŠ• แˆ˜แŒซแŠ•) แŠฅแŠ“ แ‰ตแŠ•แ‰ฐแŠ“-แˆˆแˆแˆณแˆŒ แฃ แ‹จแ‹ถแŠจแˆญ แˆแˆตแˆŽแ‰ฝแŠ• แŠจแŠ แˆตแˆแˆ‹แŒŠแ‹ แŠ แŠจแ‰ฃแ‰ข แŒ‹แˆญ แ‰ แˆ›แ‹˜แŒ‹แŒ€แ‰ต แŠฅแŠ“ แŠฅแАแˆฑแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แฃ แ‹ˆแ‹ญแˆ แ‰ แˆŒแˆ‹ แˆ˜แŠ•แŒˆแ‹ต แˆ˜แˆˆแ‹จแ‰ต แ‹จแ‰ แˆˆแŒ  แŒฅแˆฉ แ‹ญแˆ†แŠ“แˆ แข

แŠ แˆแŠ• แˆแŠ• แŠฅแŠ•แ‹ฐแˆšแˆ†แŠ• แ‹จแ‰ แˆˆแŒ  แˆˆแˆ˜แˆจแ‹ณแ‰ตแฃ แ‹จแˆšแŠจแ‰ฐแˆˆแ‹แŠ• แˆตแŠฅแˆ แŠฅแŠ•แ‹ฒแˆ˜แˆˆแŠจแ‰ฑ แˆ€แˆณแ‰ฅ แŠ แ‰€แˆญแ‰ฃแˆˆแˆแข

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แ‰ฐแŠ•แ‰ณแŠ™ .NET Core SDK 3 แ‹ซแˆตแˆแˆแŒˆแ‹‹แˆแฃ แˆตแˆˆแ‹šแˆ… แ‰ฐแŠ•แ‰ณแŠ™แŠ• แŠจแˆ˜แŒซแŠ•แ‹Ž แ‰ แŠแ‰ต แ‹จแ‰ตแŠ•แ‰ณแŠ”แ‹ แŒฅแŒˆแŠแАแ‰ต แ‹จแˆšแŒซแŠ•แ‰ฃแ‰ธแ‹แŠ• แ‹จแˆ›แ‹ญแŠญแˆฎแˆถแแ‰ต แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ›แŠจแˆ แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆแข แˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แˆตแˆญแŒญแ‰ถแ‰ฝ แ‹จแˆ›แ‹ญแŠญแˆฎแˆถแแ‰ต แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ›แŠจแˆ Linux แ‰ แˆšแˆ˜แˆˆแŠจแ‰ฐแ‹ แˆฐแАแ‹ต แ‹แˆตแŒฅ แ‰ฐแŒˆแˆแŒฟแˆ.

PVS-StudioแŠ• แ‰ แŒฅแ‰…แˆ แŠ แ‰€แŠ“แ‰ฃแˆช แ‰ แŠฉแˆ แˆˆแˆ˜แŒซแŠ• แ‹จPVS-Studio แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ›แŠจแˆ แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆแข แˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แˆตแˆญแŒญแ‰ถแ‰ฝ แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ˜แŒจแˆ˜แˆญ แ‰  แ‹แˆตแŒฅ แ‰ แ‰ แˆˆแŒ  แ‹แˆญแ‹แˆญ แ‰ฐแŒˆแˆแŒฟแˆ แ‹จแˆฐแАแ‹ถแ‰น แ‰ฐแŒ“แ‹ณแŠ แŠญแแˆ.

แ‰ฐแŠ•แ‰ณแŠ™ แˆˆแˆ˜แˆตแˆซแ‰ต แ‹จแแ‰ƒแ‹ต แ‰แˆแ แ‹ซแˆตแˆแˆแŒˆแ‹‹แˆแข แ‰  แˆ‹แ‹ญ แ‹จแˆ™แŠจแˆซ แˆแ‰ƒแ‹ต แˆ›แŒแŠ˜แ‰ต แ‹ญแ‰ฝแˆ‹แˆ‰แข analyzer แˆ›แ‹แˆจแ‹ต แŒˆแŒฝ.

แŠ แˆ˜แˆˆแŠจแ‰ฐ. แŠฅแ‰ฃแŠญแ‹Ž แ‹จแ‰ฐแŒˆแˆˆแŒธแ‹ แ‹จแŠ แˆ แˆซแˆญ แ‹˜แ‹ด (แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“) แ‹จแŠขแŠ•แ‰ฐแˆญแ•แˆซแ‹ญแ‹ แˆแ‰ƒแ‹ต แŠฅแŠ•แ‹ฐแˆšแ‹ซแˆตแˆแˆแŒˆแ‹ แˆแ‰ฅ แ‹ญแ‰ แˆ‰แข แˆตแˆˆแ‹šแˆ…, แ‹ญแˆ…แŠ•แŠ• แ‹จแŠ แˆฐแˆซแˆญ แ‹˜แ‹ด แˆˆแˆ˜แˆžแŠจแˆญ แŠจแˆแˆˆแŒ‰, แ‰  "แˆ˜แˆแŠฅแŠญแ‰ต" แˆ˜แˆตแŠญ แ‹แˆตแŒฅ, แ‹จแ‹ตแˆญแŒ…แ‰ต แแ‰ƒแ‹ต แŠฅแŠ•แ‹ฐแˆšแ‹ซแˆตแˆแˆแŒแ‹Ž แˆ›แˆ˜แˆ‹แŠจแ‰ตแ‹ŽแŠ• แŠ แ‹ญแˆญแˆฑ.

แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แŠจแ‰ฐแАแˆณ, แ‹จแ‰ฐแ‰€แ‹จแˆฉแ‰ตแŠ• แ‹แ‹ญแˆŽแ‰ฝ แ‹แˆญแ‹แˆญ แ‰ฅแ‰ป แˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แŠ แˆˆแ‰ฅแŠ•, แŠ แˆˆแ‰ แˆˆแ‹šแ‹ซ แˆแˆ‰แŠ•แˆ แ‹แ‹ญแˆŽแ‰ฝ แŠฅแŠ•แˆ˜แˆจแˆแˆซแˆˆแŠ•. แŠจแˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แ‰ แŠ‹แˆ‹, แˆแ‹แŒแ‰ฆแ‰นแŠ• แ‹ˆแ‹ฐแˆแŠ•แˆแˆแŒˆแ‹ แ‰…แˆญแŒธแ‰ต แˆ˜แˆˆแ‹ˆแŒฅ แ‹ซแˆตแˆแˆแŒˆแŠ“แˆ.

แŠ แˆแŠ•, แ‰ แ‹“แ‹ญแŠ–แ‰ปแ‰ฝแŠ• แŠแ‰ต แ‹จแˆตแˆซ แˆตแˆแ‰ฐ-แ‰€แˆ˜แˆญ แˆตแˆ‹แˆˆแŠ•, แˆตแŠญแˆชแ•แ‰ฑแŠ• แ‹ˆแ‹ฐ แˆ˜แƒแ แˆ˜แ‰€แŒ แˆ แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•. แ‹ญแˆ…แŠ•แŠ• แˆˆแˆ›แ‹ตแˆจแŒ แ‹แ‹ญแˆ‰แŠ• แˆ˜แ‰€แ‹จแˆญ แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆ .gitlab-ci.yml แ‹ˆแ‹ญแˆ แŠจแˆŒแˆˆ, แ‹ญแแŒ แˆฉ. แŠฅแˆฑแŠ• แˆˆแˆ˜แแŒ แˆญ แ‹จแ•แˆฎแŒ€แŠญแ‰ตแ‹ŽแŠ• แˆตแˆ -> แˆ‹แ‹ญ แŒ แ‰… แˆ›แ‹ตแˆจแŒ แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆ CI/แˆฒแ‹ฒ แ‹ซแ‹‹แ‰…แˆฉ.

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แŠ แˆแŠ• แˆตแŠญแˆชแ•แ‰ฑแŠ• แˆˆแˆ˜แŒปแ แ‹แŒแŒ แАแŠ•. แˆ˜แŒ€แˆ˜แˆชแ‹ซ แ‰ฐแŠ•แ‰ณแŠ™แŠ• แ‹จแˆšแŒญแŠ• แŠฎแ‹ต แŠฅแŠ•แŒฝแ แŠฅแŠ“ แˆแ‰ƒแ‹ฑแŠ• แŠฅแŠ“แˆตแŒˆแ‰ฃแก-

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

แˆ˜แŒซแŠ• แŠฅแŠ“ แˆ›แŒแ‰ แˆญ แŠจแˆแˆ‰แˆ แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‰ แŠแ‰ต แˆ˜แŠจแˆฐแ‰ต แˆตแˆ‹แˆˆแ‰ แ‰ต แˆแ‹ฉ แˆ˜แˆˆแ‹ซ แŠฅแŠ•แŒ แ‰€แˆ›แˆˆแŠ•แข แ‰ แŠแ‰ต_แˆตแŠญแˆชแ•แ‰ต. แ‹ญแˆ…แŠ• แŠญแแˆ แ‰ แŒฅแ‰‚แ‰ฑ แˆ‹แ‰ฅแˆซแˆซแข

แ‰ฐแŠ•แ‰ณแŠ™แŠ• แˆˆแˆ˜แŒซแŠ• แ‰ แˆ˜แ‹˜แŒ‹แŒ€แ‰ต แˆ‹แ‹ญแก-

  - 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-แˆตแ‰ฑแ‹ฒแ‹ฎ แŠฅแŠ“ แ‰ฐแŠ•แ‰ณแŠ แˆ›แŠจแˆ›แ‰ปแ‹Žแ‰ฝแŠ• แˆ›แŠจแˆแก

  - 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/แˆฒแ‹ฒ.

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แ‰ แˆšแŠจแˆแ‰ฐแ‹ แˆ˜แˆตแŠฎแ‰ต แ‹แˆตแŒฅ แŠ•แŒฅแˆ‰แŠ• แ‹ซแŒแŠ™ แ‰ฐแˆˆแ‹‹แ‹‹แŒฎแ‰ฝแฃ แ‰ แŠ แ‹แˆซแˆฉ แˆ‹แ‹ญ แ‰ แ‰€แŠ แŒ แ‰… แ‹ซแ‹ตแˆญแŒ‰ แ‹˜แˆญแŒ‹ แŠฅแŠ“ แ‰ฐแˆˆแ‹‹แ‹‹แŒฎแ‰ฝแŠ• แ‹ซแŠญแˆ‰แข แ‹แŒคแ‰ฑ แ‹จแˆšแŠจแ‰ฐแˆˆแ‹ แˆ˜แˆ†แŠ• แŠ แˆˆแ‰ แ‰ต.

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แŠ แˆแŠ• แ‹ˆแ‹ฐ แ‰ตแŠ•แ‰ฐแŠ“แ‹ แˆ˜แˆ„แ‹ต แŠฅแŠ•แ‰ฝแˆ‹แˆˆแŠ•. แ‰ แˆ˜แŒ€แˆ˜แˆชแ‹ซ แฃ แˆˆแ‰ฐแˆŸแˆ‹ แ‰ตแŠ•แ‰ฐแŠ“ แˆตแŠญแˆชแ•แ‰ต แŠฅแŠ•แŒจแˆแˆญแข แ‹ˆแ‹ฐ แ‰ฃแŠ•แ‹ฒแˆซ -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 แ‹ญแˆ†แŠ“แˆแข แˆแ‰ƒแ‹ฑ แ‰ แŠ แŠ•แ‹ต แ‹ˆแˆญ แŒŠแ‹œ แ‹แˆตแŒฅ แŠซแ‰ แ‰ƒ แ‹จแˆ˜แˆ˜แˆˆแˆป แŠฎแ‹ฑ 4 แ‹ญแˆ†แŠ“แˆแข แ‰ตแŠ•แ‰ณแŠ”แ‹ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝแŠ• แŠซแŒˆแŠ˜ แŠฅแŠ“ แˆแ‰ƒแ‹ฑ แ‰ แŠ แŠ•แ‹ต แ‹ˆแˆญ แŒŠแ‹œ แ‹แˆตแŒฅ แŠซแ‰ แ‰ƒ แ‹จแˆ˜แˆ˜แˆˆแˆป แŠฎแ‹ฑ แˆแˆˆแ‰ฑแŠ•แˆ แŠฅแˆดแ‰ถแ‰ฝ แ‹ญแ‹ญแ‹›แˆแก แ‹จแˆ˜แŒจแˆจแˆปแ‹แŠ• แ‹จแˆ˜แˆ˜แˆˆแˆป แŠฎแ‹ต แˆˆแˆ›แŒแŠ˜แ‰ต แ‰แŒฅแˆฎแ‰นแŠ• แŠ แŠ•แ‹ต แˆ‹แ‹ญ แ‹ญแŒจแˆแˆฉ - 8 + 4 = 12แข แˆตแˆˆแ‹šแˆ…แฃ แ‰ฐแŒ“แ‹ณแŠ แ‰ขแ‰ตแˆตแŠ• แ‰ แˆ˜แˆแ‰ฐแˆฝแฃ แ‰ แˆ˜แ‰ฐแŠ•แ‰ฐแŠ• แ‹ˆแ‰…แ‰ต แˆตแˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แˆแŠ”แ‰ณแ‹Žแ‰ฝ แˆ˜แˆจแŒƒ แˆ›แŒแŠ˜แ‰ต แ‹ญแ‰ฝแˆ‹แˆ‰แข แ‹จแˆ˜แˆ˜แˆˆแˆป แŠฎแ‹ถแ‰ฝ แ‰ "pvs-studio-dotnet แ‹จแˆ˜แˆ˜แˆˆแˆป แŠฎแ‹ถแ‰ฝ" แŠญแแˆ แ‹แˆตแŒฅ แ‰ แ‹แˆญแ‹แˆญ แ‰ฐแŒˆแˆแŒธแ‹‹แˆแขLinux / macOS)" แˆฐแАแ‹ต "แ‰ชแ‹ฅแ‹‹แˆ แˆตแ‰ฑแ‹ฒแ‹ฎ / MSBuild / .NET Core แ•แˆฎแŒ€แŠญแ‰ถแ‰ฝแŠ• แŠจแ‰ตแŠฅแ‹›แ‹ แˆ˜แˆตแˆ˜แˆญ PVS-StudioแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แˆ›แˆจแŒ‹แŒˆแŒฅ".

แ‰ แ‹šแˆ… แŠ แŒ‹แŒฃแˆš 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 -t html -o eLog ./PVS-Studio.json

แˆ˜แŒˆแˆแŒˆแ‹ซ แ•แˆ‹แŒ-แˆ˜แ‰€แ‹จแˆชแ‹ซ แ‹จแ‰ตแŠ•แ‰ณแŠ” แˆตแˆ…แ‰ฐแ‰ต แ‹˜แŒˆแ‰ฃแŠ• แ‹ˆแ‹ฐ แ‰ฐแˆˆแ‹ซแ‹ฉ แ‰…แŒพแ‰ฝ แŠฅแŠ•แ‹ฐ HTML แˆˆแˆ˜แ‰€แ‹จแˆญ แ‹จแˆšแ‹ซแŒˆแˆˆแŒแˆ แŠญแแ‰ต แˆแŠ•แŒญ แ•แˆฎแŒ€แŠญแ‰ต แАแ‹แข แ‹จแˆ˜แŒˆแˆแŒˆแ‹ซแ‹แŠ• แ‹จแ‰ แˆˆแŒ  แ‹แˆญแ‹แˆญ แˆ˜แŒแˆˆแŒซ แˆˆแˆ›แŒแŠ˜แ‰ต "Plog Converter Utility" แ‹จแˆšแˆˆแ‹แŠ• แŠ•แ‹‘แˆต แŠญแแˆ แ‹ญแˆ˜แˆแŠจแ‰ฑแข แ‹จแˆฐแАแ‹ถแ‰น แ‰ฐแŒ“แ‹ณแŠ แŠญแแˆ.

แ‰ แАแŒˆแˆซแ‰ฝแŠ• แˆ‹แ‹ญ แŠจ IDE แŠจ .json แ‹˜แŒˆแ‰ฃ แŒ‹แˆญ แ‰ แŠ แŒˆแˆญ แ‹แˆตแŒฅ แˆˆแˆ˜แˆตแˆซแ‰ต แŠจแˆแˆˆแŒ‹แ‰ฝแˆ แ‹จแŠฅแŠ›แŠ• แˆ€แˆณแ‰ฅ แŠ แ‰€แˆญแ‰ฃแˆˆแˆ แˆฐแŠซแ‹ แˆˆ IDE Rider. แŠ แŒ แ‰ƒแ‰€แˆ™ แ‰ แ‰ แˆˆแŒ  แ‹แˆญแ‹แˆญ แ‹แˆตแŒฅ แ‰ฐแŒˆแˆแŒฟแˆ แ‰ฐแ‹›แˆ›แŒ… แˆฐแАแ‹ต.

แŠฅแ‹šแˆ… แˆแ‰พแ‰ต แˆˆแˆ›แŒแŠ˜แ‰ต .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

แŠ แŠ•แ‹ด แˆแˆ‰แˆ แАแŒˆแˆญ แ‹ˆแ‹ฐ แ‹แ‹ญแˆ‰ แŠจแ‰ณแŠจแˆˆ แ‰ แŠ‹แˆ‹ แŒ แ‰… แ‹ซแ‹ตแˆญแŒ‰ แˆˆแ‹แŒฆแ‰ฝแŠ• แˆ›แ‹ตแˆจแŒ. แˆแˆ‰แˆ แАแŒˆแˆญ แ‰ตแŠญแŠญแˆ แˆ˜แˆ†แŠ‘แŠ• แˆˆแˆ›แ‹จแ‰ต แ‹ˆแ‹ฐ แ‹ญแˆ‚แ‹ฑ แˆฒแŠ แ‹ญ / แˆฒแ‹ฒ -> แ‰งแŠ•แ‰งแ‹Žแ‰ฝ -> แ‰ แˆ›แˆ„แ‹ต แˆ‹แ‹ญ. แ‹จแ‰จแˆญแ‰นแ‹‹แˆ แˆ›แˆฝแŠ‘ แˆ˜แˆตแŠฎแ‰ต แ‹ญแŠจแˆแ‰ณแˆแฃแ‰ แ‹šแˆ…แˆ แˆ˜แŒจแˆจแˆป แ‹จแˆšแŠจแ‰ฐแˆˆแ‹ แˆ˜แˆ†แŠ• แŠ แˆˆแ‰ แ‰ตแข

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แŠ แ‹จแˆ แŠขแ‹ฎแ‰ฅ แ‰ฐแˆณแŠญแ‰ถแˆˆแ‰ณแˆ - แˆตแŠฌแ‰ต, แˆแˆ‰แˆ แАแŒˆแˆญ แ‹ฐแˆ…แŠ“ แАแ‹. แŠ แˆแŠ• แ‹ซแ‹ฐแˆจแŒ‰แ‰ตแŠ• แˆ˜แˆžแŠจแˆญ แ‹ญแ‰ฝแˆ‹แˆ‰แข

แ‹จแˆฅแˆซ แˆแˆณแˆŒแ‹Žแ‰ฝ

แˆˆแˆตแˆซ แˆแˆณแˆŒแฃ แ‰€แˆ‹แˆ แ•แˆฎแŒ€แŠญแ‰ต แŠฅแŠ•แแŒ แˆญ (แ‰  แ‰ฃแˆˆแ‰คแ‰ต) แ‰ แˆญแŠซแ‰ณ แ‹แ‹ญแˆŽแ‰ฝแŠ• แ‹ญแ‹ญแ‹›แˆแข แŠจแ‹šแ‹ซ แ‰ แŠ‹แˆ‹, แ‰ แˆŒแˆ‹ แ‰…แˆญแŠ•แŒซแ แ‹แˆตแŒฅ, แŠ แŠ•แ‹ต แ‹แ‹ญแˆ แ‰ฅแ‰ป แŠฅแŠ•แˆˆแ‹แŒฃแˆˆแŠ• แŠฅแŠ“ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แˆˆแˆ›แ‰…แˆจแ‰ฅ แŠฅแŠ•แˆžแŠญแˆซแˆˆแŠ•.

แˆแˆˆแ‰ต แŒ‰แ‹ณแ‹ฎแ‰ฝแŠ• แŠฅแŠ•แˆ˜แˆแŠจแ‰ตแก แ‹จแ‰ฐแˆปแˆปแˆˆแ‹ แ‹แ‹ญแˆ แˆตแˆ…แ‰ฐแ‰ต แˆฒแ‹ญแ‹ แŠฅแŠ“ แ‰ แˆ›แ‹ญแŠ–แˆญแ‰ แ‰ต แŒŠแ‹œแข แ‰ แˆ˜แŒ€แˆ˜แˆชแ‹ซ, แˆตแˆ…แ‰ฐแ‰ต แ‹ซแˆˆแ‰ แ‰ต แˆแˆณแˆŒ.

แ‰ แ‹‹แŠ“แ‹ แ‰…แˆญแŠ•แŒซแ แ‹แˆตแŒฅ แ‹แ‹ญแˆ แŠ แˆˆ แŠฅแŠ•แ‰ แˆ แ•แˆฎแŒแˆซแˆ.csแˆตแˆ…แ‰ฐแ‰ถแ‰ฝแŠ• แ‹ซแˆแ‹ซแ‹˜ แŠฅแŠ“ แ‰ แˆŒแˆ‹ แ‰…แˆญแŠ•แŒซแ แ‹แˆตแŒฅ แŒˆแŠ•แ‰ขแ‹ แ‹จแ‰ฐแˆณแˆณแ‰ฐ แŠฎแ‹ต แŒจแˆแˆฏแˆ แŠฅแŠ“ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แˆ›แ‰…แˆจแ‰ฅ แ‹ญแˆแˆแŒ‹แˆแข แˆแŠ• แŠ แ‹ญแАแ‰ต แˆตแˆ…แ‰ฐแ‰ต แŠฅแŠ•แ‹ฐแˆฐแˆซ แ‰ แŒฃแˆ แŠ แˆตแˆแˆ‹แŒŠ แŠ แ‹ญแ‹ฐแˆˆแˆ, แ‹‹แŠ“แ‹ แАแŒˆแˆญ แˆ˜แŠ–แˆฉ แАแ‹. แˆˆแˆแˆณแˆŒ แŠฆแ•แˆฌแ‰ฐแˆฉแŠ• แˆจแˆณแˆแ‰ต แ‹ญแŒฅแ‰ (แŠ แ‹Ž, แ‰ แŒฃแˆ แ‰ฐแˆณแˆตแ‰ทแˆแข):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

แ‹จแˆแˆณแˆŒ แ‰ตแŠ•แ‰ณแŠ” แ‹แŒคแ‰ฑแŠ• แŠจแˆตแˆ…แ‰ฐแ‰ต แŒ‹แˆญ แŠฅแŠ•แ‹ญแข แŠฅแŠ•แ‹ฒแˆแˆ แŠ แŠ•แ‹ต แ‹แ‹ญแˆ แ‰ฅแ‰ป แˆ˜แ‰ฐแŠ•แ‰ฐแŠ‘แŠ• แˆˆแˆ›แˆจแŒ‹แŒˆแŒฅ แ‰ฃแŠ•แ‹ฒแˆซแ‹แŠ• แŒจแˆแˆฌแ‹ซแˆˆแˆ -r แ‹ˆแ‹ฐ pvs-studio-dotnet แˆ˜แАแˆป แˆ˜แˆตแˆ˜แˆญแก-

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แ‰ฐแŠ•แ‰ณแŠ™ แˆตแˆ…แ‰ฐแ‰ต แŠฅแŠ•แ‹ณแŒˆแŠ˜ แŠฅแŠ“ แ‰…แˆญแŠ•แŒซแŽแ‰นแŠ• แŠฅแŠ•แ‹ฒแ‹‹แˆƒแ‹ฑ แŠฅแŠ•แ‹ณแˆแˆแ‰€แ‹ฐ แŠฅแŠ“แ‹ซแˆˆแŠ•แข

แˆแˆณแˆŒแ‹แŠ• แ‹ซแˆˆแˆแŠ•แˆ แˆตแˆ…แ‰ฐแ‰ต แŠฅแŠ•แˆแ‰ตแˆฝแข แŠฎแ‹ฑแŠ• แ‰ แˆ›แˆตแ‰ฐแŠซแŠจแˆ แˆ‹แ‹ญ;

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„ แ‰ตแŠ•แ‰ฐแŠ“ แ‹แŒคแ‰ถแ‰ฝแก-

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แŠฅแŠ•แ‹ฐแˆแŠ“แ‹จแ‹, แˆแŠ•แˆ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แŠ แˆแ‰ฐแŒˆแŠ™แˆ, แŠฅแŠ“ แ‹จแ‰ฐแŒแ‰ฃแˆฉ แŠ แˆแƒแ€แˆ แ‹จแ‰ฐแˆณแŠซ แАแ‰ แˆญ, แ‹ญแˆ…แˆ แˆˆแˆ˜แˆแ‰ฐแˆฝ แ‹จแˆแˆˆแŒแАแ‹ แАแ‹.

แˆ˜แ‹ฐแˆแ‹ฐแˆšแ‹ซ

แ‰…แˆญแŠ•แŒซแŽแ‰ฝแŠ• แŠจแˆ›แ‹‹แˆƒแ‹ต แ‰ แŠแ‰ต แˆ˜แŒฅแŽ แŠฎแ‹ตแŠ• แˆ›แˆตแ‹ˆแŒˆแ‹ต แ‰ แŒฃแˆ แˆแ‰น แŠฅแŠ“ แŠ แˆตแ‹ฐแˆณแ‰ฝ แАแ‹. แˆตแˆˆแ‹šแˆ…แฃ CI/CD แ‹จแˆšแŒ แ‰€แˆ™ แŠจแˆ†แАแฃ แŠฅแˆฑแŠ• แˆˆแˆ˜แˆแ‰ฐแˆฝ แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆต แ‰ฐแŠ•แ‰ณแŠ แˆˆแˆ˜แŠญแ‰ฐแ‰ต แ‹ญแˆžแŠญแˆฉแข แ‰ แ‰ฐแŒจแˆ›แˆชแˆ, แ‹ญแˆ… แ‰ แŒฃแˆ แ‰€แˆ‹แˆ แАแ‹.

แ‹จแŠฅแˆญแˆตแ‹ŽแŠ• แ‰ตแŠฉแˆจแ‰ต แŠฅแŠ“แˆ˜แˆฐแŒแŠ“แˆˆแŠ•.

PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“
แ‹ญแˆ…แŠ• แŒฝแˆ‘แ แˆˆแŠฅแŠ•แŒแˆŠแ‹แŠ› แ‰ฐแŠ“แŒ‹แˆช แ‰ณแ‹ณแˆšแ‹Žแ‰ฝ แˆ›แŒ‹แˆซแ‰ต แŠจแˆแˆˆแŒ‰แฃ แŠฅแ‰ฃแŠญแ‹Ž แ‹จแ‰ตแˆญแŒ‰แˆ แˆ›แŒˆแŠ“แŠ›แ‹แŠ• แ‹ญแŒ แ‰€แˆ™แก Nikolay Mironovแข PVS-Studio แˆˆ C# แ‰ แˆ˜แŒ แ‰€แˆ แ‰  GitLab แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‹จแ‹แˆ…แ‹ฐแ‰ต แŒฅแ‹ซแ‰„แ‹Žแ‰ฝ แ‰ตแŠ•แ‰ฐแŠ“.

แˆแŠ•แŒญ: hab.com

แ‰ DDoS แŒฅแ‰ แ‰ƒแฃ VPS VDS แŠ แŒˆแˆแŒ‹แ‹ฎแ‰ฝ แˆˆแŒฃแ‰ขแ‹ซแ‹Žแ‰ฝ แŠ แˆตแ‰ฐแˆ›แˆ›แŠ แˆ›แˆตแ‰ฐแŠ“แŒˆแŒƒ แ‹ญแŒแ‹™ ๐Ÿ”ฅ แŠ แˆตแ‰ฐแˆ›แˆ›แŠ แ‹จแ‹ตแˆญ แŒฃแ‰ขแ‹ซ แˆ›แˆตแ‰ฐแŠ“แŒˆแŒƒ แ‰ แ‹ฒแ‹ถแŠคแˆต แŒฅแ‰ แ‰ƒแฃ แ‰ แ‰ชแ’แŠคแˆต แ‰ชแ‹ฒแŠคแˆต แŠ แŒˆแˆแŒ‹แ‹ฎแ‰ฝ แ‹ญแŒแ‹™ | ProHoster