PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
เช…เชฎเซ‡ PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช เช›เซ€เช. เช…เชฎเชพเชฐเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เชœเซ‡ Windows เชฎเชพเชŸเซ‡ เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐ เช›เซ‡. เช…เชฎเซ‡ เชฎเชพเชจเซ€เช เช›เซ€เช เช•เซ‡ เช† PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹เชจเซ€ เชœเชฎเชพเชตเชŸเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชถเซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เช•เซเชฒเชพเช‰เชก เชธเซ‡เชตเชพเช“เชฎเชพเช‚. เชฆเซ‚เชฐ เชจ เชœเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชคเซ‡ เชœ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‹ เชธเซเชฐเซ‹เชค เช•เซ‹เชก เชคเชชเชพเชธเซ€เช. Azure DevOps CI เชธเชฟเชธเซเชŸเชฎ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชถเซ‡.

เช…เชนเซ€เช‚ เช•เซเชฒเชพเช‰เชก เชธเชฟเชธเซเชŸเชฎเซเชธ เชธเชพเชฅเซ‡ เชเช•เซ€เช•เชฐเชฃเชจเชพ เชตเชฟเชทเชฏ เชชเชฐเชจเชพ เช…เชฎเชพเชฐเชพ เช…เชจเซเชฏ เชฒเซ‡เช–เซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช›เซ‡:

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

เชคเซ‡เชฅเซ€, เช† เชฒเซ‡เช–เชจเชพ เชนเซ€เชฐเซ‹:

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

เชเชเซเชฐ เชกเซ‡เชตเช“เชชเซเชธ - เช•เซเชฒเชพเช‰เชก เชธเซ‡เชตเชพเช“เชจเซ‹ เชธเชฎเซ‚เชน เชœเซ‡ เชธเช‚เชฏเซเช•เซเชค เชฐเซ€เชคเซ‡ เชธเชฎเช—เซเชฐ เชตเชฟเช•เชพเชธ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡ เช›เซ‡. เช† เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎเชฎเชพเช‚ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans เชœเซ‡เชตเชพ เชธเชพเชงเชจเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ เชคเชฎเชจเซ‡ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช—เซเชฃเชตเชคเซเชคเชพ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.

เชšเซ‹เช•เชฒเซ‡เชŸ Windows เชฎเชพเชŸเซ‡ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซ‡เช•เซ‡เชœ เชฎเซ‡เชจเซ‡เชœเชฐ เช›เซ‡. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‹ เชงเซเชฏเซ‡เชฏ เชตเชฟเชจเซเชกเซ‹เช เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชฅเซ€ เช…เชชเชกเซ‡เชŸ เช…เชจเซ‡ เช…เชจเช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชธเซเชงเซ€เชจเชพ เชธเชฎเช—เซเชฐ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชœเซ€เชตเชจเชšเช•เซเชฐเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡.

เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเชพ เช‰เชชเชฏเซ‹เช— เชตเชฟเชถเซ‡

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

เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเชพ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ‹ เช†เชฆเซ‡เชถ:

choco install pvs-studio

PVS-Studio เชชเซ…เช•เซ‡เชœเชจเซเช‚ เชšเซ‹เช•เซเช•เชธ เชตเชฐเซเชเชจ เช‡เชจเซเชธเซเชŸเซ‰เชฒ เช•เชฐเชตเชพเชจเซ‹ เช†เชฆเซ‡เชถ:

choco install pvs-studio --version=7.05.35617.2075

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชฎเชพเชคเซเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‹ เชฎเซเช–เซเชฏ เชญเชพเช—, เชฎเซเช–เซเชฏ เช˜เชŸเช•, เชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซ‡เชฒ เช›เซ‡. เช…เชจเซเชฏ เชคเชฎเชพเชฎ เชซเซเชฒเซ‡เช—เซเชธ (เชธเซเชŸเซ‡เชจเซเชกเช…เชฒเซ‹เชจ, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) --package-parameters เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเชธเชพเชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช†เชฆเซ‡เชถเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‡ เชตเชฟเชเซเชฏเซเช…เชฒ เชธเซเชŸเซเชกเชฟเชฏเซ‹ 2019 เชฎเชพเชŸเซ‡ เชชเซเชฒเช—เช‡เชจ เชธเชพเชฅเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช• เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชถเซ‡:

choco install pvs-studio --package-parameters="'/MSVS2019'"

เชนเชตเซ‡ เชšเชพเชฒเซ‹ Azure DevOps เชนเซ‡เช เชณ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเชพ เช…เชจเซเช•เซ‚เชณ เช‰เชชเชฏเซ‹เช—เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช.

เช—เซ‹เช เชตเชฃ

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

เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เชฒเซ‹เชจเซเชš เชŸเซเชฐเชฟเช—เชฐ เชธเซ‡เชŸ เช•เชฐเซ€เช, เชœเซ‡ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ เชซเช•เซเชค เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฎเชพเชŸเซ‡ เชœ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช เชฎเชพเชธเซเชŸเชฐ เชถเชพเช–เชพ:

trigger:
- master

เช†เช—เชณ เช†เชชเชฃเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡ เชคเซ‡ Windows เชธเชฐเซเชตเชฐ 2019 เช…เชจเซ‡ เชตเชฟเชเซเชฏเซเช…เชฒ เชธเซเชŸเซเชกเชฟเชฏเซ‹ 2019 เชธเชพเชฅเซ‡ เชฎเชพเช‡เช•เซเชฐเซ‹เชธเซ‹เชซเซเชŸ-เชนเซ‹เชธเซเชŸเซ‡เชก เชเชœเชจเซเชŸ เชนเชถเซ‡:

pool:
  vmImage: 'windows-latest'

เชšเชพเชฒเซ‹ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เช†เช—เชณ เชตเชงเซ€เช (block เชชเช—เชฒเชพเช‚เช“). เชคเชฎเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชฎเชพเช‚ เชฎเชจเชธเซเชตเซ€ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เชคเซ‡ เชนเช•เซ€เช•เชค เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชฎเซ‡เช‚ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เชจเชฅเซ€. เช…เชฎเซ‡ Azure DevOps เชฎเชพเชŸเซ‡ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชคเชฐเซ€เช•เซ‡ Chocolatey เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชœเชˆเช เช•เชกเซ€. เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เชคเซ‡ เชฎเชซเชคเชฎเชพเช‚ เชฎเซ‡เชณเชตเซ‹. เช†เช—เชณ, เชœเซ‹ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช…เชงเชฟเช•เซƒเชค เช›เซ‹, เชคเซ‹ เชซเช•เซเชค เชคเชฎเชพเชฐเซเช‚ เชเช•เชพเช‰เชจเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช…เชจเซ‡ เชœเซ‹ เชจเชนเซ€เช‚, เชคเซ‹ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเช›เซ€ เชคเซ‡ เชœ เช•เชฐเซ‹.

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เชนเซ€เช‚ เชคเชฎเชพเชฐเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เช•เซเชฏเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชฌเชŸเชจ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹.

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชธเชซเชณ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชชเช›เซ€, เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เชธเช‚เชธเซเชฅเชพเชฎเชพเช‚ เช†เช—เชณ เชตเชงเซ‹:

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชนเชตเซ‡ เชคเชฎเซ‡ เชตเชฟเชจเซเชกเซ‹เชฎเชพเช‚ เชšเซ‹เช•เชฒเซ‡เชŸเซ€ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡เชจเซ‹ เชจเชฎเซ‚เชจเซ‹ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เชพเชฐเซเชฏเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเชˆเชฒเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชฏ azure-pipelines.yml:

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชšเซ‹เช•เชฒเซ‡เชŸเซ€ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช…เชจเซ‡ เชซเซ€เชฒเซเชกเซเชธเชจเซ€ เชธเซ‚เชšเชฟ เชœเซเช“:

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ เชŸเซ€เชฎเซ‹ เชธเชพเชฅเซ‡ เชฎเซ‡เชฆเชพเชจเชฎเชพเช‚. IN Nuspec เชซเชพเช‡เชฒเชจเซเช‚ เชจเชพเชฎ เชœเชฐเซ‚เชฐเซ€ เชชเซ‡เช•เซ‡เชœเชจเซเช‚ เชจเชพเชฎ เชธเซ‚เชšเชตเซ‹ - pvs-studio. เชœเซ‹ เชคเชฎเซ‡ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชคเชพ เชจเชฅเซ€, เชคเซ‹ เชจเชตเซ€เชจเชคเชฎ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชœเซ‡ เช…เชฎเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชจเซเช•เซ‚เชณ เช›เซ‡. เชšเชพเชฒเซ‹ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ€เช เช‰เชฎเซ‡เชฐเชตเซเช‚ เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเชˆเชฒเชฎเชพเช‚ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒ เช•เชพเชฐเซเชฏ เชœเซ‹เชˆเชถเซเช‚.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

เช†เช—เชณ, เชšเชพเชฒเซ‹ เช†เชชเชฃเซ€ เชซเชพเช‡เชฒเชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช— เชชเชฐ เชœเชˆเช:

- task: CmdLine@2
  inputs:
    script: 

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

ัall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
โ€“u $(PVSNAME) โ€“n $(PVSKEY)

เชšเชพเชฒเซ‹ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเซเชฅเชฟเชค เชฌเซ‡เชŸ เชซเชพเช‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ€เช:

ัall build.bat

เชšเชพเชฒเซ‹ เชเช• เชซเซ‹เชฒเซเชกเชฐ เชฌเชจเชพเชตเซ€เช เชœเซเชฏเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชธเชพเชฅเซ‡เชจเซ€ เชซเชพเช‡เชฒเซ‹ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡:

ัall mkdir PVSTestResults

เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ€เช:

ัall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
โ€“t .srcchocolatey.sln โ€“o .PVSTestResultsChoco.plog 

เช…เชฎเซ‡ PlogConverter เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเชพเชฐเชพ เชฐเชฟเชชเซ‹เชฐเซเชŸเชจเซ‡ html เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ€เช เช›เซ€เช:

ัall "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
โ€“t html โ€“o PVSTestResults .PVSTestResultsChoco.plog

เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เชเช• เช•เชพเชฐเซเชฏ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชคเชฎเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹.

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

- task: CmdLine@2
  inputs:
    script: |
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      credentials โ€“u $(PVSNAME) โ€“n $(PVSKEY)
      call build.bat
      call mkdir PVSTestResults
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      โ€“t .srcchocolatey.sln โ€“o .PVSTestResultsChoco.plog
      call "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
      โ€“t html โ€“o .PVSTestResults .PVSTestResultsChoco.plog

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

เชšเชพเชฒเซ‹ เช•เซเชฒเชฟเช• เช•เชฐเซ€เช เชธเซ‡เชต->เชธเซ‡เชต->เชฐเชจ เช•เชพเชฐเซเชฏ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡. เชšเชพเชฒเซ‹ เชŸเชพเชธเซเช• เชŸเซ‡เชฌ เชชเชฐ เชœเชˆเชจเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€เช.

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชšเซ‹เช•เชฒเซ‡เชŸเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ C# เช•เซ‹เชกเชจเซ€ เชฎเชพเชคเซเชฐ 37615 เชฐเซ‡เช–เชพเช“ เช›เซ‡. เชšเชพเชฒเซ‹ เช•เซ‡เชŸเชฒเซ€เช• เชญเซ‚เชฒเซ‹ เชถเซ‹เชงเซ€ เช•เชพเชขเซ€เช.

เชชเชฐเซ€เช•เซเชทเชพ เชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ

เชšเซ‡เชคเชตเชฃเซ€ N1

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3005 'เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐ' เชšเชฒ เชชเซ‹เชคเซ‡ เชœ เชธเซ‹เช‚เชชเชพเชฏเซ‡เชฒ เช›เซ‡. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

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

เชšเซ‡เชคเชตเชฃเซ€ N2

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3093 [CWE-480] '&' เช“เชชเชฐเซ‡เชŸเชฐ เชฌเช‚เชจเซ‡ เช“เชชเชฐเซ‡เชจเซเชกเชจเซเช‚ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเซ‡ เช›เซ‡. เช•เชฆเชพเชš เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชถเซ‹เชฐเซเชŸ-เชธเชฐเซเช•เชฟเชŸ '&&' เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช. Platform.cs 64

public static PlatformType get_platform()
{
  switch (Environment.OSVersion.Platform)
  {
    case PlatformID.MacOSX:
    {
      ....
    }
    case PlatformID.Unix:
    if(file_system.directory_exists("/Applications")
      & file_system.directory_exists("/System")
      & file_system.directory_exists("/Users")
      & file_system.directory_exists("/Volumes"))
      {
        return PlatformType.Mac;
      }
        else
          return PlatformType.Linux;
    default:
      return PlatformType.Windows;
  }
}

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

เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชฏเซ‡เชฒเชพ เชŸเซเช•เชกเชพเชฎเชพเช‚, เช† เชเช• เชจเชพเชจเซ€ เช–เชพเชฎเซ€ เช›เซ‡. เชนเชพ, เช† เชธเซเชฅเชฟเชคเชฟ & เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‡ && เช“เชชเชฐเซ‡เชŸเชฐ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซ€เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชตเซเชฏเชตเชนเชพเชฐเชฟเช• เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, เช† เช•เช‚เชˆเชชเชฃ เช…เชธเชฐ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เชœเซ‹ เช•เซ‡, เช…เชจเซเชฏ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชจเซ€ เชœเชฎเชฃเซ€ เชฌเชพเชœเซเชจเซ‡ เช–เซ‹เชŸเชพ/เช…เชฎเชพเชจเซเชฏ เชฎเซ‚เชฒเซเชฏเซ‹ เชธเชพเชฅเซ‡ เช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ & เช…เชจเซ‡ && เชตเชšเซเชšเซ‡เชจเซ€ เชฎเซ‚เช‚เชเชตเชฃ เช—เช‚เชญเซ€เชฐ เชธเชฎเชธเซเชฏเชพเช“เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชฎเชพเชฐเชพ เชญเซ‚เชฒ เชธเช‚เช—เซเชฐเชนเชฎเชพเช‚, V3093 เชกเชพเชฏเช—เซเชจเซ‹เชธเซเชŸเชฟเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช† เช•เซ‡เชธ เช›เซ‡:

if ((k < nct) & (s[k] != 0.0))

เชญเชฒเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธ k เช–เซ‹เชŸเซเช‚ เช›เซ‡, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชเชฐเซ‡ เชเชฒเชฟเชฎเซ‡เชจเซเชŸเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชชเชตเชพเชฆ เชซเซ‡เช‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ IndexOutOfRangeException.

เชšเซ‡เชคเชตเชฃเซ€เช“ N3, N4

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3022 [CWE-571] เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 'เชถเซ‹เชฐเซเชŸ เชชเซเชฐเซ‹เชฎเซเชชเซเชŸ' เชนเช‚เชฎเซ‡เชถเชพ เชธเชพเชšเซ€ เชนเซ‹เชฏ เช›เซ‡. InteractivePrompt.cs 101
เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3022 [CWE-571] เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 'เชถเซ‹เชฐเซเชŸ เชชเซเชฐเซ‹เชฎเซเชชเซเชŸ' เชนเช‚เชฎเซ‡เชถเชพ เชธเชพเชšเซ€ เชนเซ‹เชฏ เช›เซ‡. InteractivePrompt.cs 105

public static string 
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
  ....
  if (shortPrompt)
  {
    var choicePrompt = choice.is_equal_to(defaultChoice) //1
    ?
    shortPrompt //2
    ?
    "[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
    choice.Substring(1,choice.Length - 1))
    :
    "[{0}]".format_with(choice.ToUpperInvariant()) //0
    : 
    shortPrompt //4
    ? 
    "[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
    choice.Substring(1,choice.Length - 1)) 
    :
    choice; //0
    ....
  }
  ....
}

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

เชšเซ‡เชคเชตเชฃเซ€ N5

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3123 [CWE-783] เช•เชฆเชพเชš '?:' เช“เชชเชฐเซ‡เชŸเชฐ เช…เชชเซ‡เช•เซเชทเชพ เช•เชฐเชคเชพ เช…เชฒเช— เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชจเซ€ เชชเซเชฐเชพเชฅเชฎเชฟเช•เชคเชพ เชคเซ‡เชจเซ€ เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เช…เชจเซเชฏ เช“เชชเชฐเซ‡เชŸเชฐเซ‹เชจเซ€ เชชเซเชฐเชพเชฅเชฎเชฟเช•เชคเชพ เช•เชฐเชคเชพเช‚ เช“เช›เซ€ เช›เซ‡. Options.cs 1019

private static string GetArgumentName (...., string description)
{
  string[] nameStart;
  if (maxIndex == 1)
  {
    nameStart = new string[]{"{0:", "{"};
  }
  else
  {
    nameStart = new string[]{"{" + index + ":"};
  }
  for (int i = 0; i < nameStart.Length; ++i) 
  {
    int start, j = 0;
    do 
    {
      start = description.IndexOf (nameStart [i], j);
    } 
    while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

เชกเชพเชฏเช—เซเชจเซ‹เชธเซเชŸเชฟเช• เช เชฒเชพเช‡เชจ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚:

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

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

เชšเซ‡เชคเชตเชฃเซ€ N6

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3022 [CWE-571] เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 'installedPackageVersions.Count != 1' เชนเช‚เชฎเซ‡เชถเชพ เชธเชพเชšเซ€ เชนเซ‹เชฏ เช›เซ‡. NugetService.cs 1405

private void remove_nuget_cache_for_package(....)
{
  if (!config.AllVersions && installedPackageVersions.Count > 1)
  {
    const string allVersionsChoice = "All versions";
    if (installedPackageVersions.Count != 1)
    {
      choices.Add(allVersionsChoice);
    }
    ....
  }
  ....
}

เช…เชนเซ€เช‚ เชเช• เชตเชฟเชšเชฟเชคเซเชฐ เชจเซ‡เชธเซเชŸเซ‡เชก เชธเซเชฅเชฟเชคเชฟ เช›เซ‡: InstallPackageVersions.Count != 1เชœเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชฐเชนเซ‡เชถเซ‡ เชธเชพเชšเซเช‚. เช˜เชฃเซ€เชตเชพเชฐ เช†เชตเซ€ เชšเซ‡เชคเชตเชฃเซ€ เช•เซ‹เชกเชฎเชพเช‚ เชคเชพเชฐเซเช•เชฟเช• เชญเซ‚เชฒ เชธเซ‚เชšเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช…เชจเซเชฏ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เชคเซ‡ เชซเช•เซเชค เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชšเช•เชพเชธเชฃเซ€ เชธเซ‚เชšเชตเซ‡ เช›เซ‡.

เชšเซ‡เชคเชตเชฃเซ€ N7

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3001 '||' เชจเซ€ เชกเชพเชฌเซ€ เช…เชจเซ‡ เชœเชฎเชฃเซ€ เชฌเชพเชœเซเช เชธเชฎเชพเชจ เชชเซ‡เชŸเชพ-เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเช“ 'commandArguments.contains("-apikey")' เช›เซ‡. เช“เชชเชฐเซ‡เชŸเชฐ ArgumentsUtility.cs 42

public static bool arguments_contain_sensitive_information(string
 commandArguments)
{
  return commandArguments.contains("-install-arguments-sensitive")
  || commandArguments.contains("-package-parameters-sensitive")
  || commandArguments.contains("apikey ")
  || commandArguments.contains("config ")
  || commandArguments.contains("push ")
  || commandArguments.contains("-p ")
  || commandArguments.contains("-p=")
  || commandArguments.contains("-password")
  || commandArguments.contains("-cp ")
  || commandArguments.contains("-cp=")
  || commandArguments.contains("-certpassword")
  || commandArguments.contains("-k ")
  || commandArguments.contains("-k=")
  || commandArguments.contains("-key ")
  || commandArguments.contains("-key=")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key");
}

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

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

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

PS เช…เชจเซ‡ เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เช† เชญเซ‚เชฒ เชฎเชฒเซเชŸเชฟ-เชฒเชพเช‡เชจ เชถเชฐเชคเชจเชพ เช…เช‚เชคเซ‡ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ :). เชชเซเชฐเช•เชพเชถเชจ เชœเซเช“ "เช›เซ‡เชฒเซเชฒเซ€ เชฒเชพเช‡เชจเชจเซ€ เช…เชธเชฐ".

เชšเซ‡เชคเชตเชฃเซ€ N8

เชตเชฟเชถเซเชฒเซ‡เชทเช• เชšเซ‡เชคเชตเชฃเซ€: V3095 [CWE-476] 'เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒ เชชเซ‡เช•เซ‡เชœ' เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชจเชฒ เชธเชพเชฎเซ‡ เชšเช•เชพเชธเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชฐเซ‡เช–เชพเช“ เชคเชชเชพเชธเซ‹: 910, 917. NugetService.cs 910

public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
  ....
  var pinnedPackageResult = outdatedPackages.GetOrAdd(
    packageName, 
    new PackageResult(installedPackage, 
                      _fileSystem.combine_paths(
                        ApplicationParameters.PackagesLocation, 
                        installedPackage.Id)));
  ....
  if (   installedPackage != null
      && !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion) 
      && !config.UpgradeCommand.ExcludePrerelease)
  {
    ....
  }
  ....
}

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

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

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

เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช†เชฎเช‚เชคเซเชฐเชฃ เช†เชชเซ€เช เช›เซ€เช ัะบะฐั‡ะฐั‚ัŒ เช…เชจเซ‡ PVS-Studio เช…เชœเชฎเชพเชตเซ€ เชœเซเช“. เชธเซเชฅเชฟเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‹ เชจเชฟเชฏเชฎเชฟเชค เช‰เชชเชฏเซ‹เช— เชคเชฎเชพเชฐเซ€ เชŸเซ€เชฎ เชœเซ‡ เช•เซ‹เชก เชตเชฟเช•เชธเชพเชตเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เช—เซเชฃเชตเชคเซเชคเชพ เช…เชจเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏเชคเชพเชฎเชพเช‚ เชธเซเชงเชพเชฐเซ‹ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เช˜เชฃเชพเชจเซ‡ เชฐเซ‹เช•เชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡ เชถเซ‚เชจเซเชฏ เชฆเชฟเชตเชธเชจเซ€ เชจเชฌเชณเชพเชˆเช“.

PS

เชชเซเชฐเช•เชพเชถเชจ เชชเชนเซ‡เชฒเชพเช‚, เช…เชฎเซ‡ เชฒเซ‡เช– เชšเซ‹เช•เชฒเซ‡เชŸเซ€ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชฎเซ‹เช•เชฒเซเชฏเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ เชคเซ‡เช“เชจเซ‡ เชคเซ‡ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชฎเชณเซเชฏเซ‹ เชนเชคเซ‹. เช…เชฎเชจเซ‡ เช•เช‚เชˆเชชเชฃ เชœเชŸเชฟเชฒ เชฒเชพเช—เซเชฏเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เช“เชจเซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชฎเชจเซ‡ "api-key" เช•เซ€ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชฌเช— เช—เชฎเซเชฏเซเช‚.

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชจเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชœเซ‹ เชคเชฎเซ‡ เช† เชฒเซ‡เช– เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชฌเซ‹เชฒเชคเชพ เชชเซเชฐเซ‡เช•เซเชทเช•เซ‹ เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹, เชคเซ‹ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เช…เชจเซเชตเชพเชฆ เชฒเชฟเช‚เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹: Vladislav Stolyarov. PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชนเชตเซ‡ เชšเซ‹เช•เชฒเซ‡เชŸเซ€เชฎเชพเช‚ เช›เซ‡: Azure DevOps เชนเซ‡เช เชณ เชšเซ‹เช•เชฒเซ‡เชŸเซ€ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡.

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

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