C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
GitLab เชจเซ‡ เชชเซเชฐเซ‡เชฎ เช•เชฐเซ‹ เช›เซ‹ เช…เชจเซ‡ เชฌเช—เซเชธเชจเซ‡ เชงเชฟเช•เซเช•เชพเชฐเซ‹ เช›เซ‹? เชคเชฎเชพเชฐเชพ เชธเซเชฐเซ‹เชค เช•เซ‹เชกเชจเซ€ เช—เซเชฃเชตเชคเซเชคเชพ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹? เชชเช›เซ€ เชคเชฎเซ‡ เชฏเซ‹เช—เซเชฏ เชธเซเชฅเชพเชจเซ‡ เช†เชตเซเชฏเชพ เช›เซ‹. เช†เชœเซ‡ เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช•เชนเซ€เชถเซเช‚ เช•เซ‡ PVS-Studio C# เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚ เชคเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“ เชคเชชเชพเชธเซ‹. เชฏเซเชจเชฟเช•เซ‹เชฐเซเชจ เชฎเซ‚เชก เชฐเชพเช–เซ‹ เช…เชจเซ‡ เชฆเชฐเซ‡เช•เชจเซ‡ เช–เซเชถ เชตเชพเช‚เชšเซ‹.

เชชเซ€เชตเซ€เชเชธ-เชธเซเชŸเซเชกเชฟเชฏเซ‹ C, C++, C# เช…เชจเซ‡ Java เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเชพ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชกเชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เชธเช‚เชญเชตเชฟเชค เชจเชฌเชณเชพเชˆเช“เชจเซ‡ เช“เชณเช–เชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชธเชพเชงเชจ เช›เซ‡. Windows, Linux เช…เชจเซ‡ macOS เชชเชฐ 64-เชฌเซ€เชŸ เชธเชฟเชธเซเชŸเชฎเซเชธ เชชเชฐ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. 32-เชฌเซ€เชŸ, 64-เชฌเซ€เชŸ เช…เชจเซ‡ เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชเช†เชฐเชเชฎ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฎเชพเชŸเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เช•เซ‹เชกเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช…เชฎเซ‡ PVS-Studio 7.08 เชฐเชฟเชฒเซ€เช เช•เชฐเซเชฏเซเช‚, เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เช•เชฐเซเชฏเซเช‚ เชฐเชธเชชเซเชฐเชฆ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡:

  • Linux เช…เชจเซ‡ macOS เชฎเชพเชŸเซ‡ C# เชตเชฟเชถเซเชฒเซ‡เชทเช•;
  • เชฐเชพเช‡เชกเชฐ เชฎเชพเชŸเซ‡ เชชเซเชฒเช—เช‡เชจ;
  • เชจเชตเซ€ เชซเชพเชˆเชฒ เชฏเชพเชฆเซ€ เชšเช•เชพเชธเชฃเซ€ เชฎเซ‹เชก.

เชซเชพเช‡เชฒ เชธเซ‚เชšเชฟ เชคเชชเชพเชธเชตเชพเชจเซ€ เชธเซเชฅเชฟเชคเชฟ

เช…เช—เชพเช‰, เช…เชฎเซเช• เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡, เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชธเชพเชฅเซ‡ .xml เชชเชพเชธ เช•เชฐเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เชนเชคเซเช‚. เชชเชฐเช‚เชคเซ เช† เช–เซ‚เชฌ เช…เชจเซเช•เซ‚เชณ เชจ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ .txt เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช‰เชฎเซ‡เชฐเซ€ เช›เซ‡, เชœเซ‡ เชœเซ€เชตเชจเชจเซ‡ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชšเซ‹เช•เซเช•เชธ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชงเซเชตเชœเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡ --เชธเซ‹เชฐเซเชธ เชซเชพเช‡เชฒเซ‹ (-f) เช…เชจเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชธเชพเชฅเซ‡ .txt เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‹. เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

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

เชœเซ‹ เชคเชฎเชจเซ‡ เช•เชฎเชฟเชŸ เชšเซ‡เช•เชฟเช‚เช— เช…เชฅเชตเชพ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชฐเชธ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เช† เชฎเซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡ เชชเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชคเชซเชพเชตเชค เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เชนเชถเซ‡ เช…เชจเซ‡ เชคเชฎเซ‡ เช•เชˆ เชธเชฟเชธเซเชŸเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹ เชคเซ‡เชจเชพ เชชเชฐ เชจเชฟเชฐเซเชญเชฐ เชฐเชนเซ‡เชถเซ‡.

เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชคเชชเชพเชธเชตเชพเชจเซ‹ เชธเชฟเชฆเซเชงเชพเช‚เชค

เชคเชชเชพเชธเชจเซ‹ เชฎเซเช–เซเชฏ เชธเชพเชฐ เช เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡ เช•เซ‡ เชตเชฟเชฒเชฏ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชพเชฏเซ‡เชฒ เชธเชฎเชธเซเชฏเชพเช“ เช†เชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€. เชฎเชพเชธเซเชŸเชฐ เชถเชพเช–เชพ เช…เชฎเซ‡ เชฆเชฐ เชตเช–เชคเซ‡ เชธเชฎเช—เซเชฐ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชชเชฃ เชจเชฅเซ€ เชฎเชพเช‚เช—เชคเชพ. เชคเชฆเซเชชเชฐเชพเช‚เชค, เชœเซเชฏเชพเชฐเซ‡ เชถเชพเช–เชพเช“ เชฎเชฐเซเชœ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฌเชฆเชฒเชพเชฏเซ‡เชฒ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชนเซ‹เชฏ เช›เซ‡. เชคเซ‡เชฅเซ€, เชนเซเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชšเซ‡เช• เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซเช‚ เช›เซเช‚.

เชธเซเชฅเชฟเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเช• เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชคเชพ เชชเชนเซ‡เชฒเชพ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชเชŸเชฒเซ‡ เช•เซ‡ เชถเชพเชณเชพเชฎเชพเช‚ เชœเซ‡ เชญเซ‚เชฒเซ‹ เชนเชคเซ€ เชซเซ‡เชฐเชซเชพเชฐเซ‹, เชฎเชพเชธเซเชŸเชฐ เชฌเซเชฐเชพเชจเซเชšเชฎเชพเช‚ เชœเชถเซ‡. เช…เชฎเชจเซ‡ เช† เชœเซ‹เชˆเชคเซเช‚ เชจ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช‰เชฎเซ‡เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชนเชตเซ‡ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เช…เชฎเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เช เช›เซ€เช เชซเซ‡เชฐเชซเชพเชฐเซ‹2 เช…เชจเซ‡, เชœเซ‹ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชญเซ‚เชฒเซ‹ เชจเชฅเซ€, เชคเซ‹ เช…เชฎเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชธเซเชตเซ€เช•เชพเชฐเซ€เช เช›เซ€เช, เช…เชจเซเชฏเชฅเชพ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชจเช•เชพเชฐเซ€เชถเซเช‚.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชœเซ‹ เชคเชฎเชจเซ‡ เช•เชฎเชฟเชŸ เช…เชจเซ‡ C/C++ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เชฐเชธ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹. เช…เชนเซ€เช‚.

GitLab

GitLab เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชตเซ‡เชฌ-เช†เชงเชพเชฐเชฟเชค DevOps เชฒเชพเช‡เชซเชธเชพเช‡เช•เชฒ เชŸเซ‚เชฒ เช›เซ‡ เชœเซ‡ Git เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เชตเชฟเช•เชฟ, เช‡เชถเซเชฏเซ‚ เชŸเซเชฐเซ‡เช•เชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ, CI/CD เชชเชพเช‡เชชเชฒเชพเช‡เชจ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเซเชตเชฟเชงเชพเช“ เชธเชพเชฅเซ‡ เช•เซ‹เชก เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฟเชธเซเชŸเชฎ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.

เชคเชฎเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‹ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚, เชคเชฎเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€ เช…เชจเซ‡ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชœเชพเชฃเชคเชพ เชจเชฅเซ€, เชคเซ‹ เชนเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซเช‚ เช›เซเช‚ เชเช• เชฒเซ‡เช– เชฎเชพเชฐเชพ เชธเชพเชฅเซ€เชฆเชพเชฐ.

เชจเซ‹เช‚เชงเชฃเซ€. เชจเซ€เชšเซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟ เชถเช•เซเชฏ เช›เซ‡. เชงเซเชฏเซ‡เชฏ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชตเชพเชคเชพเชตเชฐเชฃ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพเช‚ เชชเช—เชฒเชพเช‚ เชฌเชคเชพเชตเชตเชพเชจเซ‹ เช›เซ‡. เช•เชฆเชพเชš เชคเชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชคเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ€ เชคเซˆเชฏเชพเชฐเซ€ (เชญเช‚เชกเชพเชฐ เช‰เชฎเซ‡เชฐเชตเชพ, เชตเชฟเชถเซเชฒเซ‡เชทเช• เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ) เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเชพ เชคเชฌเช•เซเช•เชพเช“เชจเซ‡ เช…เชฒเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เชถเซเชฐเซ‡เชทเซเช  เชฐเชนเซ‡เชถเซ‡: เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเชฐเซ‚เชฐเซ€ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชธเชพเชฅเซ‡ เชกเซ‹เช•เชฐ เช›เชฌเซ€เช“ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เช…เชฅเชตเชพ เช…เชจเซเชฏ เช•เซ‹เชˆ เชชเชฆเซเชงเชคเชฟ.

เชนเชตเซ‡ เชถเซเช‚ เชฅเชถเซ‡ เชคเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡, เชนเซเช‚ เชจเซ€เชšเซ‡เชจเชพ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎเชจเซ‡ เชœเซ‹เชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซเช‚ เช›เซเช‚:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เช“เชชเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ .NET เช•เซ‹เชฐ SDK 3 เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‡เชฅเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชคเชฎเชพเชฐเซ‡ Microsoft เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เช เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพเช“ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชตเชฟเชตเชฟเชง Linux เชตเชฟเชคเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ Microsoft เชญเช‚เชกเชพเชฐ เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชธเช‚เชฌเช‚เชงเชฟเชค เชฆเชธเซเชคเชพเชตเซ‡เชœเชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡.

เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐ เชฆเซเชตเชพเชฐเชพ PVS-Studio เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ PVS-Studio เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เช เชชเชฃ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชตเชฟเชตเชฟเชง เชตเชฟเชคเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เช เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชจเซ‹ เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชฟเชญเชพเช—.

เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฒเชพเชฏเชธเชจเซเชธ เช•เซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเชฐ เชคเชฎเซ‡ เชŸเซเชฐเชพเชฏเชฒ เชฒเชพเช‡เชธเชจเซเชธ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชกเชพเช‰เชจเชฒเซ‹เชก เชชเซƒเชทเซเช .

เชจเซ‹เช‚เชงเชฃเซ€. เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เช“เชชเชฐเซ‡เชถเชจเชจเชพ เชตเชฐเซเชฃเชตเซ‡เชฒ เชฎเซ‹เชก (เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ) เชฎเชพเชŸเซ‡ เชเชจเซเชŸเชฐเชชเซเชฐเชพเช‡เช เชฒเชพเชฏเชธเชจเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เชฅเซ€, เชœเซ‹ เชคเชฎเซ‡ เช“เชชเชฐเซ‡เชถเชจเชจเชพ เช† เชฎเซ‹เชกเชจเซ‡ เช…เชœเชฎเชพเชตเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ "เชธเช‚เชฆเซ‡เชถ" เชซเซ€เชฒเซเชกเชฎเชพเช‚ เชธเซ‚เชšเชตเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชเชจเซเชŸเชฐเชชเซเชฐเชพเช‡เช เชฒเชพเชฏเชธเชจเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชœเซ‹ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เช…เชฎเชพเชฐเซ‡ เชซเช•เซเชค เชฌเชฆเชฒเชพเชฏเซ‡เชฒ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ เช…เชฎเซ‡ เชฌเชงเซ€ เชซเชพเช‡เชฒเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชถเซเช‚. เชชเซƒเชฅเซเชฅเช•เชฐเชฃ เชชเช›เซ€, เช†เชชเชฃเซ‡ เชฒเซ‹เช—เชจเซ‡ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเชคเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชนเชตเซ‡, เชคเชฎเชพเชฐเซ€ เชจเชœเชฐ เชธเชฎเช•เซเชท เช•เชพเชฐเซเชฏเชจเซเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชนเซ‹เชตเชพเชฅเซ€, เชคเชฎเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพ เชคเชฐเชซ เช†เช—เชณ เชตเชงเซ€ เชถเช•เซ‹ เช›เซ‹. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชซเชพเช‡เชฒ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ .gitlab-ci.yml เช…เชฅเชตเชพ, เชœเซ‹ เชคเซ‡ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเซ‡ เชฌเชจเชพเชตเซ‹. เชคเซ‡เชจเซ‡ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชจเชพเชฎ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ -> CI/CD เชธเซ‡เชŸ เช•เชฐเซ‹.

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ 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/CD.

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เช–เซเชฒเชคเซ€ เชตเชฟเช‚เชกเซ‹เชฎเชพเช‚, เช†เช‡เชŸเชฎ เชถเซ‹เชงเซ‹ เชšเชฒเซ‹, เชœเชฎเชฃเซ€ เชฌเชพเชœเซเชจเชพ เชฌเชŸเชจ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชšเชฒเซ‹ เช‰เชฎเซ‡เชฐเซ‹. เชชเชฐเชฟเชฃเชพเชฎ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชตเซเช‚ เชœเซ‹เชˆเช:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ 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) เชฐเซ€เชŸเชฐเซเชจ เช•เซ‹เชกเซเชธ" เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชฐเซ€เชŸเชฐเซเชจ เช•เซ‹เชกเซเชธเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจเชฎเชพเช‚เชฅเซ€ เชตเชฟเชเซเชฏเซเช…เชฒ เชธเซเชŸเซเชกเชฟเชฏเซ‹ / MSBuild / .NET เช•เซ‹เชฐ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡".

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเชจเซ‡ เชฌเชงเชพ เชตเชณเชคเชฐ เช•เซ‹เชกเซเชธเชฎเชพเช‚ เชฐเชธ เช›เซ‡ เชœเซเชฏเชพเช‚ 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. เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซเช‚ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ "เชชเซเชฒเซ‹เช— เช•เชจเซเชตเชฐเซเชŸเชฐ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€" เชชเซ‡เชŸเชพเชตเชฟเชญเชพเช—เชฎเชพเช‚ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชจเซ‹ เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชฟเชญเชพเช—.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชœเซ‹ เชคเชฎเซ‡ IDE เชฅเซ€ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ .json เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ เชนเซเช‚ เช…เชฎเชพเชฐเชพ เชฎเชพเช‚ เชจเชพเช–เซ‹ IDE เชฐเชพเช‡เชกเชฐ เชฎเชพเชŸเซ‡. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชฆเชธเซเชคเชพเชตเซ‡เชœ.

เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชคเซ‡ เช…เชนเซ€เช‚ เช›เซ‡ .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

เชเช•เชตเชพเชฐ เชคเชฎเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชฌเชงเซเช‚ เช‰เชฎเซ‡เชฐเซเชฏเชพ เชชเช›เซ€, เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เช•เชฐเซ‹. เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช›เซ‡ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡, เชชเชฐ เชœเชพเช“ เชธเซ€เช†เชˆ / เชธเซ€เชกเซ€ -> เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ -> เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒ. เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เชตเชฟเชจเซเชกเซ‹ เช–เซเชฒเชถเซ‡, เชœเซ‡เชจเชพ เช…เช‚เชคเซ‡ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชœเซ‹เชฏเซเช‚ เชœเซ‹เชฌ เชธเชซเชณ เชฅเชˆ - เชธเชซเชณเชคเชพ, เชฌเชงเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡. เชนเชตเซ‡ เชคเชฎเซ‡ เชถเซเช‚ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡ เชคเชฎเซ‡ เชšเช•เชพเชธเซ€ เชถเช•เซ‹ เช›เซ‹.

เช•เชพเชฎเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เช•เชพเชฐเซเชฏเชจเชพ เช‰เชฆเชพเชนเชฐเชฃ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชเช• เชธเชฐเชณ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ€เช (เชฎเชพเช‚ เชฎเชพเชธเซเชŸเชฐ) เชœเซ‡เชฎเชพเช‚ เช˜เชฃเซ€ เชซเชพเชˆเชฒเซ‹ เชนเชถเซ‡. เชคเซ‡ เชชเช›เซ€, เชฌเซ€เชœเซ€ เชถเชพเช–เชพเชฎเชพเช‚ เช…เชฎเซ‡ เชซเช•เซเชค เชเช• เชœ เชซเชพเช‡เชฒ เชฌเชฆเชฒเซ€เชถเซเช‚ เช…เชจเซ‡ เชฎเชฐเซเชœ เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เชถเซเช‚.

เชšเชพเชฒเซ‹ เชฌเซ‡ เช•เชฟเชธเซเชธเชพเช“ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเช: เชœเซเชฏเชพเชฐเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เชซเชพเช‡เชฒเชฎเชพเช‚ เชญเซ‚เชฒ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เช•เซเชฏเชพเชฐเซ‡ เชจเชฅเซ€. เชชเซเชฐเชฅเชฎ, เชญเซ‚เชฒ เชธเชพเชฅเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ.

เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เชฎเชพเชธเซเชŸเชฐ เชฌเซเชฐเชพเชจเซเชšเชฎเชพเช‚ เชเช• เชซเชพเช‡เชฒ เช›เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ.เชธเซ€.เชเชธ, เชœเซ‡เชฎเชพเช‚ เชญเซ‚เชฒเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช…เชจเซเชฏ เชถเชพเช–เชพเชฎเชพเช‚ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช เชญเซ‚เชฒเชญเชฐเซ‡เชฒเซ‹ เช•เซ‹เชก เช‰เชฎเซ‡เชฐเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡. เชคเซ‡เชฃเซ‡ เช•เซ‡เชตเชพ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชญเซ‚เชฒ เช•เชฐเซ€ เชคเซ‡ เชเชŸเชฒเซเช‚ เชฎเชนเชคเซเชตเชจเซเช‚ เชจเชฅเซ€, เชฎเซเช–เซเชฏ เชตเชธเซเชคเซ เช เช›เซ‡ เช•เซ‡ เชคเซ‡ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช“เชชเชฐเซ‡เชŸเชฐ เชญเซ‚เชฒเซ€ เช—เชฏเชพ เชซเซ‡เช‚เช•เชตเซเช‚ (เชนเชพ, เชคเซ‡เชฅเซ€ เช–เซ‹เชŸเซเช‚):

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

เชšเชพเชฒเซ‹ เชเช• เชญเซ‚เชฒ เชธเชพเชฅเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชœเซ‹เชˆเช. เช เชชเชฃ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เชซเชพเช‡เชฒเชจเซเช‚ เชชเชฆเชšเซเช›เซ‡เชฆเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เชฎเซ‡เช‚ เชงเซเชตเชœ เช‰เชฎเซ‡เชฐเซเชฏเซ‹ -r pvs-studio-dotnet เชฒเซ‹เชจเซเชš เชฒเชพเช‡เชจ เชชเชฐ:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เช…เชฎเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชญเซ‚เชฒ เชฎเชณเซ€ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฃเซ‡ เชถเชพเช–เชพเช“เชจเซ‡ เชฎเชฐเซเชœ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ€ เชจเชฅเซ€.

เชšเชพเชฒเซ‹ เชญเซ‚เชฒ เชตเชฟเชจเชพ เช‰เชฆเชพเชนเชฐเชฃ เชคเชชเชพเชธเซ€เช. เช•เซ‹เชก เชธเซเชงเชพเชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช:

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

เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชชเชฐเชฟเชฃเชพเชฎเซ‹:

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช, เช•เซ‹เชˆ เชญเซ‚เชฒเซ‹ เชฎเชณเซ€ เชจ เชนเชคเซ€, เช…เชจเซ‡ เช•เชพเชฐเซเชฏเชจเซ‹ เช…เชฎเชฒ เชธเชซเชณ เชฐเชนเซเชฏเซ‹ เชนเชคเซ‹, เชœเซ‡ เช…เชฎเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเช—เซ€เช เช›เซ€เช.

เชจเชฟเชทเซเช•เชฐเซเชท

เชถเชพเช–เชพเช“ เชฎเชฐเซเชœ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เช–เชฐเชพเชฌ เช•เซ‹เชกเชจเซ‡ เชจเซ€เช‚เชฆเชฃ เช•เชฐเชตเซเช‚ เช–เซ‚เชฌ เชœ เช…เชจเซเช•เซ‚เชณ เช…เชจเซ‡ เชธเซเช–เชฆ เช›เซ‡. เชคเซ‡เชฅเซ€ เชœเซ‹ เชคเชฎเซ‡ CI/CD เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹, เชคเซ‹ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชŸเซ‡เชŸเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชเชฎเซเชฌเซ‡เชก เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹. เชคเชฆเซเชชเชฐเชพเช‚เชค, เช† เชเช•เชฆเชฎ เชธเชฐเชณ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชคเชฎเชพเชฐเซเช‚ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เช†เชญเชพเชฐ.

C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชœเซ‹ เชคเชฎเซ‡ เช† เชฒเซ‡เช– เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชฌเซ‹เชฒเชคเชพ เชชเซเชฐเซ‡เช•เซเชทเช•เซ‹ เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เช…เชจเซเชตเชพเชฆ เชฒเชฟเช‚เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹: เชจเชฟเช•เซ‹เชฒเซ‡ เชฎเซ€เชฐเซ‹เชจเซ‹เชต. C# เชฎเชพเชŸเซ‡ PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ GitLab เชฎเชพเช‚ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹