Linux เช
เชจเซ macOS เชชเชฐ C เช
เชจเซ C++ เชญเชพเชทเชพเช เชฎเชพเชเซ PVS-Studio เชตเชฟเชถเซเชฒเซเชทเชเชฎเชพเช, เชตเชฐเซเชเชจ 7.04 เชฅเซ เชถเชฐเซ เชเชฐเซเชจเซ, เชเชฒเซเชฒเซเชเชฟเชค เชซเชพเชเชฒเซเชจเซ เชธเซเชเชฟ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซ เชเช เชชเชฐเซเชเซเชทเชฃ เชตเชฟเชเชฒเซเชช เชฆเซเชเชพเชฏเซ เชเซ. เชจเชตเชพ เชฎเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชคเชฎเซ เชเชฎเชฟเชเซเชธเชจเซ เชคเชชเชพเชธเชตเชพ เช
เชจเซ เชตเชฟเชจเชเชคเซเช เชเซเชเชเชตเชพ เชฎเชพเชเซ เชตเชฟเชถเซเชฒเซเชทเชเชจเซ เชเซเช เชตเซ เชถเชเซ เชเซ. เช เชฒเซเช เชคเชฎเชจเซ เชเชฃเชพเชตเชถเซ เชเซ เชเซเชฐเซเชตเชฟเชธ CI, เชฌเชกเซ เช
เชจเซ เชเชชเชตเซเชฏเชฐ เชเซเชตเซ เชฒเซเชเชชเซเชฐเชฟเชฏ CI (เชธเชคเชค เชเชเซเชเชฐเชฃ) เชธเชฟเชธเซเชเชฎเซเชธเชฎเชพเช GitHub เชชเซเชฐเซเชเซเชเซเชเชจเซ เชฌเชฆเชฒเชพเชฏเซเชฒ เชซเชพเชเชฒเซเชจเซ เชธเซเชเชฟเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชคเชชเชพเชธเชตเซ.
เชซเชพเชเชฒ เชธเซเชเชฟ เชคเชชเชพเชธเชตเชพเชจเซ เชธเซเชฅเชฟเชคเชฟ
Linux เช
เชจเซ macOS เชฎเชพเชเซ PVS-Studio 7.04 เชธเชเชธเซเชเชฐเชฃเชฎเชพเช, เชธเซเชฐเซเชค เชซเชพเชเชฒเซเชจเซ เชธเซเชเชฟ เชคเชชเชพเชธเชตเชพเชจเซ เชเช เชฎเซเชก เชฆเซเชเชพเชฏเซ เชเซ. เช เชเชตเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธ เชฎเชพเชเซ เชเชพเชฎ เชเชฐเซ เชเซ เชเซเชจเซ เชฌเชฟเชฒเซเชก เชธเชฟเชธเซเชเชฎ เชคเชฎเชจเซ เชซเชพเชเชฒ เชเชจเชฐเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ
เชเชชเชฐเชพเชเชค, เชเชฎเซเชชเชพเชเชฒเชฐ เชฒเซเชเชเชจเชพ เชธเซเชเซเชฐเซเชธ เชเซเชฐเซเชธ เชฒเซเช (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++ เชซเชพเชเชฒเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชธเซเชตเชฟเชงเชพ เชเซ. เชญเชตเชฟเชทเซเชฏเชฎเชพเช, เชจเชฟเชฐเซเชญเชฐเชคเชพ เชซเชพเชเชฒเชจเซ เชเซเชถ เชเชฐเซ เชถเชเชพเชฏ เชเซ เช เชจเซ เชคเซเชจเซ เชตเชฟเชถเซเชฒเซเชทเช เชฆเซเชตเชพเชฐเชพ เชเชชเชฎเซเชณเซ เช เชชเชกเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเชจเซเชเซเชฐเซเชฎเซเชจเซเชเชฒ เชเชจเชพเชฒเชฟเชธเชฟเชธ เชฎเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชซเชพเชเชฒ เชฒเชฟเชธเซเช เชเซเชเชฟเชเช เชฎเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ เชเชฎเชฟเชเซเชธเชจเซ เชเซเช เชเชฐเชตเชพเชจเซ เชซเชพเชฏเชฆเซ เช เชเซ เชเซ เชคเชฎเชพเชฐเซ เชซเชเซเชค เชคเซ เชซเชพเชเชฒเชจเซ เชเซเชถ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เช เชจเซ เชเชฌเซเชเซเชเซเช เชซเชพเชเชฒเซเชจเซ เชจเชนเซเช.
เชชเซเชฒ เชตเชฟเชจเชเชคเซ เชตเชฟเชถเซเชฒเซเชทเชฃเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฟเชฆเซเชงเชพเชเชคเซ
เชเชเชพ เชชเซเชฐเซเชเซเชเซเชเชจเซเช เชชเซเชฅเซเชฅเชเชฐเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชฃเซ เชธเชฎเชฏ เชฒเชพเชเซ เชเซ, เชคเซเชฅเซ เชคเซเชจเซ เชฎเชพเชคเซเชฐ เช เชฎเซเช เชญเชพเช เช เชคเชชเชพเชธเชตเชพเชฎเชพเช เช เชฐเซเชฅเชชเซเชฐเซเชฃ เชเซ. เชธเชฎเชธเซเชฏเชพ เช เชเซ เชเซ เชคเชฎเชพเชฐเซ เชจเชตเซ เชซเชพเชเชฒเซเชจเซ เชฌเชพเชเซเชจเซ เชชเซเชฐเซเชเซเชเซเช เชซเชพเชเชฒเซเชฅเซ เช เชฒเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชเชพเชฒเซ เชฌเซ เชถเชพเชเชพเชเชตเชพเชณเชพ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เชตเซเชเซเชทเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซเชเช:
เชเชพเชฒเซ เชคเซ เชชเซเชฐเชคเชฟเชฌเชฆเซเชงเชคเชพเชจเซ เชเชฒเซเชชเชจเชพ เชเชฐเซเช 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
เช เชเชฆเซเชถ เชญเซเชฒเซเชจเซ เชฏเชพเชฆเซ เชเชชเชถเซ
เชฎเชพเชคเซเชฐ เชนเชตเซ เช เชฎเชพเชฐเซ เชฎเชพเชคเซเชฐ เชญเซเชฒเซ เชฆเชฐเซเชถเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ, เชชเชฃ เชธเชฎเชธเซเชฏเชพเชเชจเซ เชนเชพเชเชฐเซ เชตเชฟเชถเซ เชเชธเซเชฎเซเชฌเชฒเซ เช เชจเซ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เช เชฎเชพเชฐเซ เชธเซเชตเชพเชจเซ เชเชพเชฃ เชเชฐเชตเชพเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ. เช เชนเซเชคเซ เชฎเชพเชเซ, เชเชจเซเชตเชฐเซเชเชฐเชฎเชพเช เชเช เชงเซเชตเช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ -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 เชชเซเชฐเซเชเซเชเซเช เชฐเซเชชเซเชเซเชเชฐเซเชจเซเช เชจเชพเชฎ เชธเซเชเซเชฐ เชเชฐเซ เชเซ.
เช เชเชพเชฐเซเชฏ เชฎเชพเชเซ เช เชฒเซเชเซเชฐเชฟเชงเชฎ:
เชเซเชฐเซเชตเชฟเชธ CI เชฐเซเชเชฐเซเชจ เชเซเชกเซเชธเชจเซ เชเชตเชพเชฌ เชเชชเซ เชเซ, เชคเซเชฅเซ เชเซเชคเชตเชฃเซเชเชจเซ เชนเชพเชเชฐเซ เชธเซเชตเชพเชจเซ เชเชฎเชฟเชเชจเซ เชญเซเชฒเซ เชงเชฐเชพเชตเชคเซ เชคเชฐเซเชเซ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชตเชพ เชเชนเซเชถเซ.
เชนเชตเซ เชเชพเชฒเซ เชเซเชกเชจเซ เช เชฒเชพเชเชจ เชชเชฐ เชจเชเซเชเชฅเซ เชจเชเชฐ เชเชฐเซเช:
git diff --name-only origin/HEAD > .pvs-pr.list
เชนเชเซเชเชค เช เชเซ เชเซ เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชชเซเชฒ เชตเชฟเชจเชเชคเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชคเซ เชตเชเชคเซ เชเชชเชฎเซเชณเซ เชถเชพเชเชพเชเชจเซ เชฎเชฐเซเช เชเชฐเซ เชเซ:
เชคเซเชฅเซ เช
เชฎเซ เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเซเช เชเซเช A4, เช
เชจเซ เชจเชนเซเช B3->A3. เช เชฒเชเซเชทเชฃเชจเซ เชเชพเชฐเชฃเซ, เชเชชเชฃเซ เชธเชพเชฅเซ เชคเชซเชพเชตเชคเชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเชเซเชธเชเชเซเชธเชเชเซเชธเชเชเซเชธ, เชเซ เชเซเชเซเชเชธเชชเชฃเซ เชถเชพเชเชพเชจเซ เชเซเช เชชเชฐ เชเซ เชฎเซเชณ.
เชเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชตเชฟเชเชค เชฌเชพเชเซ เชเซ - เชธเชเชเชฒเชฟเชค เช เชจเซเชตเชพเชฆ เชเชเชฎเซ (*.c, *.cc, *.cpp, เชตเชเซเชฐเซ) เชชเชฐ เชนเซเชกเชฐ เชซเชพเชเชฒเซเชจเซ เช เชตเชฒเชเชฌเชจเชจเซ เชเซเชถ เชเชฐเชตเซ. เชตเชฟเชถเซเชฒเซเชทเช เช เชจเชฟเชฐเซเชญเชฐเชคเชพเชเชจเซ เชเชฃเชคเชฐเซ เชเชฐเซ เชเซ เชเซเชฏเชพเชฐเซ เชคเซ เชซเชพเชเชฒเซเชจเซ เชธเซเชเชฟ เชคเชชเชพเชธเชตเชพเชจเชพ เชฎเซเชกเชฎเชพเช เชชเซเชฐเชฅเชฎ เชฒเซเชจเซเช เชฅเชพเชฏ เชเซ เช เชจเซ เชชเชเซ เชคเซเชจเซ .PVS-Studio เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเช เชธเชพเชเชตเซ เชเซ. เชเซเชฐเซเชตเชฟเชธ เชธเซเชเช เชคเชฎเชจเซ เชซเซเชฒเซเชกเชฐเซเชธเชจเซ เชเซเชถ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชคเซเชฅเซ เช เชฎเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชกเซเชเชพเชจเซ เชธเชพเชเชตเซเชถเซเช .PVS-เชธเซเชเซเชกเชฟเชฏเซ/:
cache:
directories:
- .PVS-Studio/
เช เชเซเชก เชซเชพเชเชฒเชฎเชพเช เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ .travis.yml. เช เชกเชฟเชฐเซเชเซเชเชฐเซ เชชเซเชฅเซเชฅเชเชฐเชฃ เชชเชเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒ เชตเชฟเชตเชฟเชง เชกเซเชเชพเชจเซ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชเซ, เชเซ เชซเชพเชเชฒ เชฏเชพเชฆเซ เชตเชฟเชถเซเชฒเซเชทเชฃ เช เชฅเชตเชพ เชตเชงเชพเชฐเชพเชจเชพ เชตเชฟเชถเซเชฒเซเชทเชฃเชจเชพ เช เชจเซเชเชพเชฎเซ เชฐเชจเชจเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฐเซเชคเซ เชเชกเชชเซ เชฌเชจเชพเชตเชถเซ. เชเซ เช เชเชฐเชตเชพเชฎเชพเช เชจ เชเชตเซ, เชคเซ เชตเชฟเชถเซเชฒเซเชทเช เชตเชพเชธเซเชคเชตเชฎเชพเช เชฆเชฐเซเช เชตเชเชคเซ เชฌเชงเซ เชซเชพเชเชฒเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชถเซ.
เชฌเชกเซ
เชเซเชฐเซเชตเชฟเชธ เชธเซเชเชเชจเซ เชเซเชฎ,
เชธเซ เชชเซเชฐเชฅเชฎ, เชเชชเชฃเซ เชเชธเซเชฎเซเชฌเชฒเซ เชฒเชพเชเชจเชฎเชพเช เชจเชตเซ เชเซเชฐเชฟเชฏเชพ เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
เชเชพเชฒเซ เชเชฎเซเชชเชพเชเชฒเชฐ เชธเซเชเชตเซเช เชเซเชจเซ เชเชชเชฏเซเช เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ. เช เชเซเชฐเชฟเชฏเชพเชฎเชพเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฒ เชกเซเชเชฐ เชเชจเซเชเซเชจเชฐ เชชเชฐ เชงเซเชฏเชพเชจ เชเชชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, GCC เชฎเชพเชเซ เชเช เชเชพเชธ เชเชจเซเชเซเชจเชฐ เชเซ:
เชนเชตเซ เชเชพเชฒเซ PVS-Studio เช
เชจเซ เชเชฐเซเชฐเซ เชเชชเชฏเซเชเชฟเชคเชพเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช:
เชเชพเชฒเซ เชธเชเชชเชพเชฆเชเชฎเชพเช เชจเซเชเซเชจเซ เชฒเซเชเซเช เชเชฎเซเชฐเซเช:
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 เชชเชฐเชจเซ เชตเชฟเชญเชพเช เชตเชพเชเชเซ เชเซ, เชคเซ เชชเชเซ เช เชเซเชก เชคเชฎเชจเซ เชชเชนเซเชฒเซเชฅเซ เช เชชเชฐเชฟเชเชฟเชค เชเซ, เชเซ เชเซ, เชนเชตเซ เชเช เชจเชตเซ เชคเชฌเชเซเชเซ เชเซ:
เชนเชเซเชเชค เช เชเซ เชเซ เชนเชตเซ เช
เชฎเซ เชฎเชฐเซเชเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชจเชนเซเช เชเชฐเซเช, เชชเชฐเชเชคเซ เชเซ เชถเชพเชเชพเชฎเชพเชเชฅเซ เชชเซเชฒ เชตเชฟเชจเชเชคเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชคเซเชจเชพ เชนเซเชกเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเซเช เชเซเช:
เชคเซเชฅเซ เช
เชฎเซ เชถเชฐเชคเซ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เชเซเช 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-เชธเซเชเซเชกเชฟเชฏเซ เชเซเชถเซเชเช เชฎเชพเชเซ, เชเชพเชฐเชฃ เชเซ เชฌเชกเซ เช
เชจเซเชเชพเชฎเซ เชฒเซเชเช เชฎเชพเชเซ เชฌเชงเซ เชซเชพเชเชฒเซเชจเซ เชเชชเชฎเซเชณเซ เชเซเชถ เชเชฐเซ เชเซ. เชคเซเชฅเซ, เชฌเชกเซเชฎเชพเช PVS-Studio เชฎเชพเชเซ เชฒเซเชเชฟเชจ เช
เชจเซ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชเชตเชตเชพเชจเซเช เชเซเชฒเซเชฒเซเช เชฌเชพเชเซ เชเซ. เชซเซเชฐเชซเชพเชฐเซ เชธเชพเชเชตเซเชฏเชพ เชชเชเซ, เช
เชฎเชจเซ เชชเชพเชเชพ เชชเชพเชเชชเชฒเชพเชเชจ เชชเชฐ เชฒเช เชเชตเชพเชฎเชพเช เชเชตเชถเซ. เช
เชฎเชพเชฐเซ เชเชฒเซเชจเซ เชธเซเช เชเชฐเชตเชพ เช
เชจเซ PVS-เชธเซเชเซเชกเชฟเชฏเซ เชฎเชพเชเซ เชฒเซเชเชฟเชจ เช
เชจเซ เชเซ เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
เช เชชเชเซ, เชจเชตเซ เชชเซเชฒ เชตเชฟเชจเชเชคเซ เช
เชฅเชตเชพ เชเชฎเชฟเชเชจเซ เชฆเซเชเชพเชต เชธเชฎเซเชเซเชทเชพเชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเชถเซ. เชเซ เชเชฎเชฟเชเชฎเชพเช เชญเซเชฒเซ เชนเซเชฏ, เชคเซ เชฌเชกเซ เชคเซเชจเซ เชชเซเชฒ เชตเชฟเชจเชเชคเซ เชชเซเชทเซเช เชชเชฐ เชธเซเชเชตเซ เชเซ.
AppVeyor
AppVeyor เชธเซเชเช เชช เชเชฐเชตเซเช เช เชฌเชกเซ เชเซเชตเซเช เช เชเซ, เชเชพเชฐเชฃ เชเซ เชฌเชงเซเช เช เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชฅเชพเชฏ เชเซ เช เชจเซ เชชเซเชฐเซเชเซเชเซเช เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช *.yml เชซเชพเชเชฒ เชเชฎเซเชฐเชตเชพเชจเซ เชเซเช เชเชฐเซเชฐ เชจเชฅเซ.
เชเชพเชฒเซ เชชเซเชฐเซเชเซเชเซเช เชเชพเชเชเซเชฎเชพเช เชธเซเชเชฟเชเชเซเชธ เชเซเชฌ เชชเชฐ เชเชเช:
เชเชพเชฒเซ เช เชชเซเชทเซเช เชจเซเชเซ เชธเซเชเซเชฐเซเชฒ เชเชฐเซเช เช
เชจเซ เชชเซเชฒ เชตเชฟเชจเชเชคเซเช เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชถ เชฌเชเชคเชจเซ เชธเชเซเชทเชฎ เชเชฐเซเช:
เชนเชตเซ เชเชพเชฒเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเซ
เชฌ เชชเชฐ เชเชเช, เชเซเชฏเชพเช เชเชชเชฃเซ เชเชธเซเชฎเซเชฌเชฒเซ เช
เชจเซ เชเชฐเซเชฐเซ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซ เชฎเชพเชเซ เชเชฎเซเชเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเช เชเซเช:
เชเซ เชคเชฎเซ เช
เชเชพเชเชจเชพ เชตเชฟเชญเชพเชเซ เชตเชพเชเชเซเชฏเชพ เชนเซเชฏ, เชคเซ เชคเชฎเซ เช เชฌเซ เชเชฒเซ เชฅเซ เชเซเชฌ เช เชชเชฐเชฟเชเชฟเชค เชเซ โ PVS_KEY ะธ PVS_USERNAME. เชเซ เชจเชนเชฟเช, เชคเซ เชนเซเช เชคเชฎเชจเซ เชฏเชพเชฆ เช
เชชเชพเชตเซ เชฆเชเช เชเซ PVS-เชธเซเชเซเชกเชฟเชฏเซ เชตเชฟเชถเซเชฒเซเชทเชเชจเซเช เชฒเชพเชเชธเชจเซเชธ เชเชเชพเชธเชตเชพ เชฎเชพเชเซ เชคเซเช เชเชฐเซเชฐเซ เชเซ. เช
เชฎเซ เชคเซเชฎเชจเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชฌเซ
เชถ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชฎเชพเช เชซเชฐเซ เชเซเชเชถเซเช.
เชจเซเชเซเชจเชพ เชธเชฎเชพเชจ เชชเซเชทเซเช เชชเชฐ เช เชฎเซ เชเซเชถเซเชเช เชฎเชพเชเซ เชซเซเชฒเซเชกเชฐ เชธเซเชเชตเซเช เชเซเช:
เชเซ เชเชชเชฃเซ เช เชจเชนเซเช เชเชฐเซเช, เชคเซ เช
เชฎเซ เชเซเชเชฒเซเช เชซเชพเชเชฒเซเชจเซ เชฌเชฆเชฒเซ เชธเชฎเชเซเชฐ เชชเซเชฐเซเชเซเชเซเชเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเซเชถเซเช, เชชเชฐเชเชคเซ เช
เชฎเชจเซ เชเชฒเซเชฒเซเชเชฟเชค เชซเชพเชเชฒเซเชฎเชพเชเชฅเซ เชเชเชเชชเซเช เชฎเชณเชถเซ. เชคเซเชฅเซ, เชฏเซเชเซเชฏ เชกเชฟเชฐเซเชเซเชเชฐเซ เชจเชพเชฎ เชฆเชพเชเชฒ เชเชฐเชตเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ.
เชนเชตเซ เชธเซเชเซเชฐเชฟเชชเซเช เชเชเชพเชธเชตเชพเชจเซ เชธเชฎเชฏ เชเซ. เชเซเชธเซเช เชเซเชฌ เชเซเชฒเซ เช เชจเซ เชธเซเชเซเชฐเชฟเชชเซเช เชชเชธเชเชฆ เชเชฐเซ:
เชคเชฎเชพเชฐเซ เช เชซเซเชฐเซเชฎเชฎเชพเช เชจเซเชเซเชจเชพ เชเซเชกเชจเซ เชชเซเชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
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 เชเชฒ เชฅเซเชกเซเช เชเซเชเซเช เชฌเซเชฒเซ เชฐเชนเซเชฏเซเช เชนเชคเซเช. เช เชเชพเชฐเชฃเซเชธเชฐ, เชฎเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชถเชฐเซ เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เชคเซเชจเซเช เชฎเซเชฒเซเชฏ เชฎเซเชจเซเชฏเซเช เชฒเซ เช เชชเชกเซเช เชเชฐเซเชฏเซเช เชเซ.
เช เชจเซ เชชเชเซ เชฌเชงเซเช เชชเชนเซเชฒเชพ เชเซเชตเซเช เชเซ:
เชนเชตเซ เชจเซเชเซเชจเชพ เชญเชพเชเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซ:
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 เชจเซ เชเซเชฎ, เชคเชฎเชพเชฐเซ เชซเชเซเชค เชธเซเชเชฟเชเชเซเชธเชฎเชพเช เชซเซเชฒเซเชกเชฐเชจเซ เชเชฒเซเชฒเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ; เชชเชฐเชเชคเซ เชเซเชฏเชพเชเช เชคเชฎเชพเชฐเซ เช เชจเชจเซเชฏ เชเซเช เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เช เชจเซ เชคเชฎเชจเซ เชเซเชถเซเชก เชเซเชเชกเชพเชจเซ เชเชตเชฐเชฐเชพเชเช เชเชฐเชตเชพเชจเซ เชคเช เชเชชเชตเชพ เชฎเชพเชเซ เชธเชฟเชธเซเชเชฎเชจเซ เชธเชฎเชเชพเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ. เชคเซเชฅเซ, เชเซ เชคเชฎเซ เชธเชคเชค เชเชเซเชเชฐเชฃ เชธเซเชตเชพ เชชเชฐ เชชเซเชฒ เชตเชฟเชจเชเชคเซเชเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซเชต เชเซเชจเซ เชเชชเชฐ เชเชฐเซเชเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเซเชฏ, เชคเซ เชชเชนเซเชฒเชพ เชเชพเชคเชฐเซ เชเชฐเซ เชเซ เชคเชฎเชจเซ เชเซเชถเซเชเชเชฎเชพเช เชธเชฎเชธเซเชฏเชพ เชจเชนเซเช เชนเซเชฏ.
เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เชเชญเชพเชฐ. เชเซ เชเชเชเช เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ, เชคเซ เช
เชฎเชจเซ เช
เชนเซเช เชฒเชเชตเชพ เชฎเชพเชเซ เชฎเชซเชค เชฒเชพเชเซ
เชเซ เชคเชฎเซ เช เชฒเซเชเชจเซ เช
เชเชเซเชฐเซเชเซ เชฌเซเชฒเชคเชพ เชชเซเชฐเซเชเซเชทเชเซ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ เชเซเชชเชพ เชเชฐเซเชจเซ เช
เชจเซเชตเชพเชฆ เชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ: เชฎเซเชเซเชธเชฟเชฎ เชเซเชตเซเชฏเชพเชเชฟเชเชเชธเซเชต.
เชธเซเชฐเซเชธ: www.habr.com