PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
Linux เช…เชจเซ‡ macOS เชชเชฐ C เช…เชจเซ‡ C++ เชญเชพเชทเชพเช“ เชฎเชพเชŸเซ‡ PVS-Studio เชตเชฟเชถเซเชฒเซ‡เชทเช•เชฎเชพเช‚, เชตเชฐเซเชเชจ 7.04 เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซ€เชจเซ‡, เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชชเชฐเซ€เช•เซเชทเชฃ เชตเชฟเช•เชฒเซเชช เชฆเซ‡เช–เชพเชฏเซ‹ เช›เซ‡. เชจเชตเชพ เชฎเซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเชฎเซ‡ เช•เชฎเชฟเชŸเซเชธเชจเซ‡ เชคเชชเชพเชธเชตเชพ เช…เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ เช–เซ‡เช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เซ‹ เช›เซ‹. เช† เชฒเซ‡เช– เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเชถเซ‡ เช•เซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI, เชฌเชกเซ€ เช…เชจเซ‡ เชเชชเชตเซ‡เชฏเชฐ เชœเซ‡เชตเซ€ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ CI (เชธเชคเชค เชเช•เซ€เช•เชฐเชฃ) เชธเชฟเชธเซเชŸเชฎเซเชธเชฎเชพเช‚ GitHub เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชฌเชฆเชฒเชพเชฏเซ‡เชฒ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชคเชชเชพเชธเชตเซ€.

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

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

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

เช‰เชชเชฐเชพเช‚เชค, เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชฒเซ‹เช‚เชšเชจเชพ เชธเซเชŸเซเชฐเซ‡เชธ เชŸเซเชฐเซ‡เชธ เชฒเซ‹เช— (pvs-studio-analyzer trace) เชธเชพเชฅเซ‡ เชซเชพเช‡เชฒ เชฒเชฟเชธเซเชŸ เชšเซ‡เช•เชฟเช‚เช— เชฎเซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเชšเชจเชพ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชคเชชเชพเชธเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซ‡เชฒเซ€ เชคเชฎเชพเชฎ เชซเชพเช‡เชฒเซ‹เชจเชพ เชธเช‚เช•เชฒเชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชตเชฟเชถเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฎเชพเชนเชฟเชคเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ‡.

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

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

เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชธเซเชฐเซ‹เชค เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชŸเซ‡เช•เซเชธเซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเชพเชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเชฐเชฟเชฎเชพเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. -S:

pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt

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

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

plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...

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

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

เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹

เช†เช–เชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซเช‚ เชชเซƒเชฅเซเชฅเช•เชฐเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡เชจเซ‹ เชฎเชพเชคเซเชฐ เช…เชฎเซเช• เชญเชพเช— เชœ เชคเชชเชพเชธเชตเชพเชฎเชพเช‚ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ เช›เซ‡. เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชจเชตเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชฌเชพเช•เซ€เชจเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเซ‹เชฅเซ€ เช…เชฒเช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเชพเชฒเซ‹ เชฌเซ‡ เชถเชพเช–เชพเช“เชตเชพเชณเชพ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เชตเซƒเช•เซเชทเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ

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

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

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

เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชจเซ‡ เชถเชพเช–เชพเช“ เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เชฎเชณเซ‡ เช›เซ‡, เชœเซ‡ เชถเชพเช–เชพเชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชฎเชพเชธเซเชŸเชฐเชฎเชพเช‚ เชฎเชฐเซเชœ เชฅเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

$MERGE_BASE เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชชเช›เซ€เชฅเซ€ เชตเชฟเช—เชคเชตเชพเชฐ เชœเซ‹เชˆเชถเซเช‚. เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เชฆเชฐเซ‡เช• CI เชธเซ‡เชตเชพ เชฎเชฐเซเชœ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชตเชฟเชถเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเซ€ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชฆเชฐเซ‡เช• เชตเช–เชคเซ‡ เชคเชฎเชพเชฐเซ‡ เช† เชกเซ‡เชŸเชพ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชจเชตเชพ เชฐเชธเซเชคเชพเช“ เชธเชพเชฅเซ‡ เช†เชตเชตเซเช‚ เชชเชกเชถเซ‡. เชจเซ€เชšเซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เชฆเชฐเซ‡เช• เชตเซ‡เชฌ เชธเซ‡เชตเชพเช“เชฎเชพเช‚ เช†เชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

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

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชชเช›เซ€, เช…เชฎเชพเชฐเซ‡ เชฒเซ‹เช— เชซเชพเช‡เชฒ (PVS-Studio.log) เชจเซ‡ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

plog-converter -t errorfile PVS-Studio.log --cerr -w

เช† เช†เชฆเซ‡เชถ เชญเซ‚เชฒเซ‹เชจเซ€ เชฏเชพเชฆเซ€ เช†เชชเชถเซ‡ stderr (เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชญเซ‚เชฒ เชธเช‚เชฆเซ‡เชถ เช†เช‰เชŸเชชเซเชŸ).

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

เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ

เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เชคเชฐเซ€เช•เซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ .travis.yml. เชธเช—เชตเชก เชฎเชพเชŸเซ‡, เชนเซเช‚ เชคเชฎเชจเซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชซเช‚เช•เซเชถเชจเซเชธ เชธเชพเชฅเซ‡ เช…เชฒเช— เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เชธเชฒเชพเชน เช†เชชเซเช‚ เช›เซเช‚ เชœเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เช•เซ‰เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. .travis.yml (bash script_name.sh function_name).

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

install:
  - bash .travis.sh travis_install

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช•เซ‹เชˆ เชธเซ‚เชšเชจเชพเช“ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เชนเชพเช‡เชซเชจเซเชธเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชšเชพเชฒเซ‹ เชซเชพเชˆเชฒ เช–เซ‹เชฒเซ€เช .travis.sh เช…เชจเซ‡ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชธเซ‡เชŸเชฟเช‚เช— เช‰เชฎเซ‡เชฐเซ‹ travis_install():

travis_install() {
  wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
  sudo wget -O /etc/apt/sources.list.d/viva64.list 
    https://files.viva64.com/etc/viva64.list
  
  sudo apt-get update -qq
  sudo apt-get install -qq pvs-studio 
}

เชšเชพเชฒเซ‹ เชนเชตเซ‡ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เช เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชšเชฒเชพเชตเซ‹:

script:
  - bash .travis.sh travis_script

เช…เชจเซ‡ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚:

travis_script() {
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

เช† เช•เซ‹เชก เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซเชฏเชพ เชชเช›เซ€ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ CMake เชชเชฐ เชฌเชฟเชฒเซเชก เชนเซ‹เชฏ เชคเซ‹:

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
}

เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฌเชนเชพเชฐ เช†เชตเชถเซ‡:

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
  
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

เชคเชฎเซ‡ เช•เชฆเชพเชš เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช† เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช›เซ‡ $TRAVIS_PULL_REQUEST ะธ $TRAVIS_BRANCH. เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ เชคเซ‡เชฎเชจเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชฐเซ€เชคเซ‡ เชœเชพเชนเซ‡เชฐ เช•เชฐเซ‡ เช›เซ‡:

  • $TRAVIS_PULL_REQUEST เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เชจเช‚เชฌเชฐ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เช–เซ‹เชŸเซเช‚, เชœเซ‹ เช† เชจเชฟเชฏเชฎเชฟเชค เชถเชพเช–เชพ เช›เซ‡;
  • $TRAVIS_REPO_SLUG เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซเช‚ เชจเชพเชฎ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‡ เช›เซ‡.

เช† เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ:

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

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เช•เซ‹เชกเชจเซ€ เช† เชฒเชพเช‡เชจ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช:

git diff --name-only origin/HEAD > .pvs-pr.list

เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชถเชพเช–เชพเช“เชจเซ‡ เชฎเชฐเซเชœ เช•เชฐเซ‡ เช›เซ‡:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เช เช›เซ€เช A4, เช…เชจเซ‡ เชจเชนเซ€เช‚ B3->A3. เช† เชฒเช•เซเชทเชฃเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เช†เชชเชฃเซ‡ เชธเชพเชฅเซ‡ เชคเชซเชพเชตเชคเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชเช•เซเชธเชเช•เซเชธเชเช•เซเชธเชเช•เซเชธ, เชœเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชถเชพเช–เชพเชจเซ€ เชŸเซ‹เชš เชชเชฐ เช›เซ‡ เชฎเซ‚เชณ.

เชเช• เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชตเชฟเช—เชค เชฌเชพเช•เซ€ เช›เซ‡ - เชธเช‚เช•เชฒเชฟเชค เช…เชจเซเชตเชพเชฆ เชเช•เชฎเซ‹ (*.c, *.cc, *.cpp, เชตเช—เซ‡เชฐเซ‡) เชชเชฐ เชนเซ‡เชกเชฐ เชซเชพเช‡เชฒเซ‹เชจเซ€ เช…เชตเชฒเช‚เชฌเชจเชจเซ‡ เช•เซ‡เชถ เช•เชฐเชตเซ€. เชตเชฟเชถเซเชฒเซ‡เชทเช• เช† เชจเชฟเชฐเซเชญเชฐเชคเชพเช“เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชคเชชเชพเชธเชตเชพเชจเชพ เชฎเซ‹เชกเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชฒเซ‹เชจเซเชš เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ .PVS-Studio เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชธเชพเชšเชตเซ‡ เช›เซ‡. เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ เชคเชฎเชจเซ‡ เชซเซ‹เชฒเซเชกเชฐเซเชธเชจเซ‡ เช•เซ‡เชถ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชกเซ‡เชŸเชพเชจเซ‡ เชธเชพเชšเชตเซ€เชถเซเช‚ .PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹/:

cache:
  directories:
    - .PVS-Studio/

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

เชฌเชกเซ€

เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆเชจเซ€ เชœเซ‡เชฎ, เชฌเชกเซ€ GitHub เชชเชฐ เชธเช‚เช—เซเชฐเชนเชฟเชค เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เชคเซ‡ เชตเซ‡เชฌ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡ (เชฌเซ‡เชถ เชธเชชเซ‹เชฐเซเชŸ เช‰เชชเชฒเชฌเซเชง เช›เซ‡), เชคเซ‡เชฅเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซ€ เช•เซ‹เชˆ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชธเซŒ เชชเซเชฐเชฅเชฎ, เช†เชชเชฃเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฒเชพเช‡เชจเชฎเชพเช‚ เชจเชตเซ€ เช•เซเชฐเชฟเชฏเชพ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชนเชตเซ‡ เชšเชพเชฒเซ‹ PVS-Studio เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชšเชพเชฒเซ‹ เชธเช‚เชชเชพเชฆเช•เชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“ เช‰เชฎเซ‡เชฐเซ€เช:

apt-get update && apt-get -y install wget gnupg jq

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

เชนเชตเซ‡ เชšเชพเชฒเซ‹ Run เชŸเซ‡เชฌ (เชชเซเชฐเชฅเชฎ เช†เช‡เช•เซ‹เชจ) เชชเชฐ เชœเชˆเช เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช•เซ‹เชกเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชเชกเชฟเชŸเชฐ เชซเซ€เชฒเซเชกเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
  PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

เชœเซ‹ เชคเชฎเซ‡ Travs-CI เชชเชฐเชจเซ‹ เชตเชฟเชญเชพเช— เชตเชพเช‚เชšเซ‹ เช›เซ‹, เชคเซ‹ เชชเช›เซ€ เช† เช•เซ‹เชก เชคเชฎเชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเชฐเชฟเชšเชฟเชค เช›เซ‡, เชœเซ‹ เช•เซ‡, เชนเชตเซ‡ เชเช• เชจเชตเซ‹ เชคเชฌเช•เซเช•เซ‹ เช›เซ‡:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ เชนเชตเซ‡ เช…เชฎเซ‡ เชฎเชฐเซเชœเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชจเชนเซ€เช‚ เช•เชฐเซ€เช, เชชเชฐเช‚เชคเซ เชœเซ‡ เชถเชพเช–เชพเชฎเชพเช‚เชฅเซ€ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เชคเซ‡เชจเชพ เชนเซ‡เชกเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เช เช›เซ€เช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เชถเชฐเชคเซ€ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เช›เซ€เช B3 เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเชพเชฅเซ€ เชคเชซเชพเชตเชค เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ A3:

PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ A3 เชšเชพเชฒเซ‹ GitHub API เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช:

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

เช…เชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชšเชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชฌเชกเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡:

  • $BUDDY_EXECUTION_PULL_REQEUST_NO - เชตเชฟเชจเช‚เชคเซ€ เชจเช‚เชฌเชฐ เช–เซ‡เช‚เชšเซ‹;
  • $BUDDY_REPO_SLUG โ€” เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพเชฎ เช…เชจเซ‡ เชญเช‚เชกเชพเชฐเชจเซเช‚ เชธเช‚เชฏเซ‹เชœเชจ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชฎเชนเชคเซเชคเชฎ/เชชเชฐเซ€เช•เซเชทเชฃ).

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชจเซ€เชšเซ‡เชจเชพ เชฌเชŸเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชธเชพเชšเชตเซ€เช เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชธเช•เซเชทเชฎ เช•เชฐเซ€เช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เช…เชฎเชพเชฐเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ .pvs-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เช•เซ‡เชถเซ€เช‚เช— เชฎเชพเชŸเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชฌเชกเซ€ เช…เชจเซเช—เชพเชฎเซ€ เชฒเซ‹เช‚เชš เชฎเชพเชŸเซ‡ เชฌเชงเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เช•เซ‡เชถ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชฌเชกเซ€เชฎเชพเช‚ PVS-Studio เชฎเชพเชŸเซ‡ เชฒเซ‰เช—เชฟเชจ เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชšเชตเชตเชพเชจเซเช‚ เช›เซ‡เชฒเซเชฒเซเช‚ เชฌเชพเช•เซ€ เช›เซ‡. เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชธเชพเชšเชตเซเชฏเชพ เชชเช›เซ€, เช…เชฎเชจเซ‡ เชชเชพเช›เชพ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชชเชฐ เชฒเชˆ เชœเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เช…เชฎเชพเชฐเซ‡ เชšเชฒเซ‹เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชฎเชพเชŸเซ‡ เชฒเซ‹เช—เชฟเชจ เช…เชจเซ‡ เช•เซ€ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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

AppVeyor

AppVeyor เชธเซ‡เชŸเช…เชช เช•เชฐเชตเซเช‚ เช เชฌเชกเซ€ เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชฌเชงเซเช‚ เชœ เชตเซ‡เชฌ เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ *.yml เชซเชพเชˆเชฒ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เช•เซ‹เชˆ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชเชพเช‚เช–เซ€เชฎเชพเช‚ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชŸเซ‡เชฌ เชชเชฐ เชœเชˆเช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชšเชพเชฒเซ‹ เช† เชชเซƒเชทเซเช  เชจเซ€เชšเซ‡ เชธเซเช•เซเชฐเซ‹เชฒ เช•เชฐเซ€เช เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชถ เชฌเชšเชคเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ€เช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชŸเซ…เชฌ เชชเชฐ เชœเชˆเช, เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช…เชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹ เชฎเชพเชŸเซ‡ เช‡เชฎเซ‡เชœเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช เช›เซ€เช:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชœเซ‹ เชคเชฎเซ‡ เช…เช—เชพเช‰เชจเชพ เชตเชฟเชญเชพเช—เซ‹ เชตเชพเช‚เชšเซเชฏเชพ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เช† เชฌเซ‡ เชšเชฒเซ‹ เชฅเซ€ เช–เซ‚เชฌ เชœ เชชเชฐเชฟเชšเชฟเชค เช›เซ‹ โˆ’ PVS_KEY ะธ PVS_USERNAME. เชœเซ‹ เชจเชนเชฟเช‚, เชคเซ‹ เชนเซเช‚ เชคเชฎเชจเซ‡ เชฏเชพเชฆ เช…เชชเชพเชตเซ€ เชฆเช‰เช‚ เช•เซ‡ PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซเช‚ เชฒเชพเช‡เชธเชจเซเชธ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เช“ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เช…เชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชฌเซ…เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธเชฎเชพเช‚ เชซเชฐเซ€ เชœเซ‹เชˆเชถเซเช‚.

เชจเซ€เชšเซ‡เชจเชพ เชธเชฎเชพเชจ เชชเซƒเชทเซเช  เชชเชฐ เช…เชฎเซ‡ เช•เซ‡เชถเซ€เช‚เช— เชฎเชพเชŸเซ‡ เชซเซ‹เชฒเซเชกเชฐ เชธเซ‚เชšเชตเซ€เช เช›เซ€เช:

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

เชนเชตเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเช•เชพเชธเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡. เชŸเซ‡เชธเซเชŸ เชŸเซ‡เชฌ เช–เซ‹เชฒเซ‹ เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเซ‹:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชคเชฎเชพเชฐเซ‡ เช† เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเชพ เช•เซ‹เชกเชจเซ‡ เชชเซ‡เชธเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

sudo apt-get update && sudo apt-get -y install jq

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
  | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list

sudo apt-get update && sudo apt-get -y install pvs-studio

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

เชšเชพเชฒเซ‹ เช•เซ‹เชกเชจเชพ เชจเซ€เชšเซ‡เชจเชพ เชญเชพเช— เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ€เช:

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
   https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
   | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

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

AppVeyor เชฎเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเช• เชธเซ‡เชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชฎเชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเชพ เช…เชคเซเชฏเช‚เชค เชตเชฟเชšเชฟเชคเซเชฐ เชตเชฐเซเชคเชจเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซเชฏเซ‹. เชเช• เชคเชฐเชซ, เชฌเชงเซเช‚ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚, เชชเชฐเช‚เชคเซ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชถเชฐเซ‚ เชฅเชฏเซเช‚ เชจเชนเซ€เช‚. เชฎเซ‡เช‚ เช เชจเซ‹เช‚เชงเชตเชพเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเชฎเชฏ เชชเชธเชพเชฐ เช•เชฐเซเชฏเซ‹ เช•เซ‡ เช…เชฎเซ‡ /home/appveyor/projects/testcalc/ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช›เซ€เช, เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เช–เชพเชคเชฐเซ€ เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ /opt/appveyor/build-agent/ เชฎเชพเช‚ เช›เซ€เช. เชชเช›เซ€ เชฎเชจเซ‡ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ $PWD เชšเชฒ เชฅเซ‹เชกเซเช‚ เช–เซ‹เชŸเซเช‚ เชฌเซ‹เชฒเซ€ เชฐเชนเซเชฏเซเช‚ เชนเชคเซเช‚. เช† เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชฎเซ‡เช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชถเชฐเซ‚ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชคเซ‡เชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เช…เชชเชกเซ‡เชŸ เช•เชฐเซเชฏเซเช‚ เช›เซ‡.

เช…เชจเซ‡ เชชเช›เซ€ เชฌเชงเซเช‚ เชชเชนเซ‡เชฒเชพ เชœเซ‡เชตเซเช‚ เช›เซ‡:

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ
เชนเชตเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชญเชพเช—เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹:

PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO - 
  https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
  | jq -r ".base.ref"`

เชคเซ‡เชฎเชพเช‚ เช…เชฎเชจเซ‡ เชคเซ‡ เชถเชพเช–เชพเช“ เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เชฎเชณเซ‡ เช›เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เชœเชพเชนเซ‡เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • $APPVEYOR_PULL_REQUEST_NUMBER โ€” เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€ เชจเช‚เชฌเชฐ;
  • $APPVEYOR_REPO_NAME - เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชจเชพเชฎ เช…เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชญเช‚เชกเชพเชฐ.

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

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

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

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

PVS-Studio เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Travis CI, Buddy เช…เชจเซ‡ AppVeyor เชฎเชพเช‚ เช•เชฎเชฟเชŸเซเชธ เช…เชจเซ‡ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ

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

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

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