PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
Linux เจ…เจคเฉ‡ macOS 'เจคเฉ‡ C เจ…เจคเฉ‡ C++ เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฒเจˆ PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจตเจฟเฉฑเจš, เจธเฉฐเจธเจ•เจฐเจฃ 7.04 เจคเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจจเจฟเจฐเจงเจพเจฐเจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจฎเฉŒเจ•เจพ เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค เจจเจตเฉ‡เจ‚ เจฎเฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจ•เจฎเจฟเจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจ…เจคเฉ‡ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ–เจฟเฉฑเจšเจฃ เจฒเจˆ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจน เจฒเฉ‡เจ– เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจเจ—เจพ เจ•เจฟ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฐเจ—เฉ‡ เจชเฉเจฐเจธเจฟเฉฑเจง CI (เจ•เฉฐเจŸเฉ€เจจเจฟเจŠเจ…เจธ เจ‡เฉฐเจŸเฉ€เจ—เฉเจฐเฉ‡เจธเจผเจจ) เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• GitHub เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจซเจพเจˆเจฒ เจธเฉ‚เจšเฉ€ เจœเจพเจ‚เจš เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจซเจพเจˆเจฒ เจธเฉ‚เจšเฉ€ เจœเจพเจ‚เจš เจฎเฉ‹เจก

เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ C, C++, C# เจ…เจคเฉ‡ Java เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ‡ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเฉฐเจญเจพเจตเฉ€ เจ•เจฎเจœเจผเฉ‹เจฐเฉ€เจ†เจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจธเจพเจงเจจ เจนเฉˆเฅค เจตเจฟเฉฐเจกเฉ‹เจœเจผ, เจฒเฉ€เจจเจ•เจธ เจ…เจคเฉ‡ เจฎเฉˆเจ•เฉ‹เจธ 'เจคเฉ‡ 64-เจฌเจฟเฉฑเจŸ เจธเจฟเจธเจŸเจฎเจพเจ‚ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

Linux เจ…เจคเฉ‡ macOS เจฒเจˆ PVS-Studio 7.04 เจฆเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฎเฉ‹เจก เจนเฉˆเฅค เจ‡เจน เจ‰เจนเจจเจพเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเจพ เจฌเจฟเจฒเจก เจธเจฟเจธเจŸเจฎ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ compile_commands.json. เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจ•เจฒเจจ เจฌเจพเจฐเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ•เฉฑเจขเจฃ เจฒเจˆ เจ‡เจน เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆ. เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเจพ เจฌเจฟเจฒเจก เจธเจฟเจธเจŸเจฎ compile_commands.json เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเจนเจพเจ‡เจ• เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ…เจœเจฟเจนเฉ€ เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค Bear.

เจจเจพเจฒ เจนเฉ€, เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเฉ‡ เจขเฉฐเจ— เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฐเจจ (เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“-เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจŸเจฐเฉ‡เจธ) เจฆเฉ‡ เจธเจŸเจฐเฉ‡เจธ เจŸเจฐเฉ‡เจธ เจฆเฉ‡ เจจเจพเจฒ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจชเฉ‚เจฐเจพ เจจเจฟเจฐเจฎเจพเจฃ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจŸเฉเจฐเฉˆเจ• เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉ‹เจเจ—เฉ€ เจคเจพเจ‚ เจœเฉ‹ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจ•เจฒเจจ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฌเจพเจฐเฉ‡ เจชเฉ‚เจฐเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ‡เจ•เฉฑเจคเจฐ เจ•เจฐเฉ‡เฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจธ เจตเจฟเจ•เจฒเจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจ•เจฎเฉ€ เจนเฉˆ - เจคเฉเจนเจพเจจเฉ‚เฉฐ เจœเจพเจ‚ เจคเจพเจ‚ เจนเจฐเฉ‡เจ• เจฒเจพเจ‚เจš 'เจคเฉ‡ เจชเฉ‚เจฐเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจชเฉ‚เจฐเจพ เจฌเจฟเจฒเจก เจŸเจฐเฉ‡เจธ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉ‹เจเจ—เฉ€, เจœเฉ‹ เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจ•เจฎเจฟเจŸ เจœเจพเจ‚เจš เจฆเฉ‡ เจตเจฟเจšเจพเจฐ เจฆเจพ เจ–เฉฐเจกเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเจพเจ‚, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ–เฉเจฆ เจŸเจฐเฉ‡เจธเจฟเฉฐเจ— เจจเจคเฉ€เจœเฉ‡ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจฆเฉ‡ เจฌเจพเจ…เจฆ เจฆเฉ‡ เจฒเจพเจ‚เจš เจ…เจงเฉ‚เจฐเฉ‡ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ เจœเฉ‡เจ•เจฐ เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒ เจจเจฟเจฐเจญเจฐเจคเจพ เจฌเจฃเจคเจฐ เจŸเจฐเฉ‡เจธเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฌเจฆเจฒ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเจพเจ‚ #include เจœเฉ‹เฉœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ)เฅค

เจ‡เจธเจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ•เจฎเจฟเจŸ เจœเจพเจ‚ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจŸเจฐเฉ‡เจธ เจฒเฉŒเจ— เจฆเฉ‡ เจจเจพเจฒ เจซเจพเจˆเจฒ เจธเฉ‚เจšเฉ€ เจœเจพเจ‚เจš เจฎเฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจธเจฟเจซเจพเจฐเจธเจผ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจตเจšเจจเจฌเฉฑเจงเจคเจพ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เฉฑเจ• เจตเจพเจงเฉ‡ เจตเจพเจฒเจพ เจฌเจฟเจฒเจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจฎเฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹ เจตเจพเจงเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ.

เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจ‡เฉฑเจ• เจŸเฉˆเจ•เจธเจŸ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ -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-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

เจฆเจพ เจฆเจฟเจ–เจพเจตเจพ เจ•เจฐเฉ€เจ เจ•เจฟ เจตเจšเจจเจฌเฉฑเจงเจคเจพ A1 เจ•เฉ‹เจก เจฆเฉ€ เจ•เจพเจซเจผเฉ€ เจตเฉฑเจกเฉ€ เจฎเจพเจคเจฐเจพ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพ เจšเฉเฉฑเจ•เฉ€ เจนเฉˆเฅค เจฅเฉ‹เฉœเจพ เจชเจนเจฟเจฒเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ•เจฎเจฟเจŸ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเจผเจพเจ–เจพ เจฌเจฃเจพเจˆ เจธเฉ€ A1 เจ…เจคเฉ‡ เจ•เฉเจ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฟเจ†เฅค

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

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ…เจญเฉ‡เจฆ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉ‹เจตเฉ‡เจ—เจพ, เจชเจฐ เจ‡เจน เจฌเจนเฉเจค เจฒเฉฐเจฎเจพ เจ…เจคเฉ‡ เจ—เฉˆเจฐ-เจตเจพเจœเจฌ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจฟเจฐเจซ เจ•เฉเจ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจธ เจฒเจˆ, เจธเจฟเจฐเจซ เจฌเจฆเจฒเฉ‡ เจนเฉ‹เจ เจฒเฉ‹เจ•เจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจเจพ เจตเจงเฉ‡เจฐเฉ‡ เจ•เฉเจธเจผเจฒ เจนเฉˆ.

เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจธเจผเจพเจ–เจพเจตเจพเจ‚ เจฆเฉ‡ เจตเจฟเฉฑเจš เจ…เฉฐเจคเจฐ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ, เจธเจผเจพเจ–เจพ เจฆเฉ‡ เจธเจฟเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจฃ เจ•เจฐเจ•เฉ‡ เจœเจฟเจธ เจคเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจฎเจพเจธเจŸเจฐ เจตเจฟเฉฑเจš เจ…เจญเฉ‡เจฆ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚:

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

$MERGE_BASE เจ…เจธเฉ€เจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฟเจšเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ เจนเจฐ เจธเฉ€เจ†เจˆ เจธเฉ‡เจตเจพ เจ…เจญเฉ‡เจฆ เจฒเจˆ เจ…เจงเจพเจฐ เจฌเจพเจฐเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจนเจฐ เจตเจพเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจจเจตเฉ‡เจ‚ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจ†เจ‰เจฃเจพ เจชเฉˆเจ‚เจฆเจพ เจนเฉˆ. เจตเจฐเจฃเจจ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจฐเฉ‡เจ• เจตเฉˆเฉฑเจฌ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เจธเจฆเจพ เจตเฉ‡เจฐเจตเจพ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจ‡เจธ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจธเจผเจพเจ–เจพเจตเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจ…เฉฐเจคเจฐ เจฎเจฟเจฒเจฟเจ† เจนเฉˆ, เจœเจพเจ‚ เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ, เจซเจพเจˆเจฒ เจฆเฉ‡ เจจเจพเจฎเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจœเฉ‹ เจฌเจฆเจฒเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ. เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจฆเฉ‡เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ .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 scriptname.sh function_name).

เจ…เจธเฉ€เจ‚ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ bash, เจ‡เจธ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆเฅค เจญเจพเจ— เจตเจฟเฉฑเจš เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเฉ‹ เจ†เจ‰ เจนเฉ‡เจ เจพเจ‚ เจฒเจฟเจ–เฉ€เจ:

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

เจ…เจคเฉ‡ bash เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš:

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-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจฐเจฟเจŸเจฐเจจ เจ•เฉ‹เจกเจพเจ‚ เจฆเจพ เจœเจตเจพเจฌ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจšเฉ‡เจคเจพเจตเจจเฉ€เจ†เจ‚ เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจธเฉ‡เจตเจพ เจจเฉ‚เฉฐ เจฌเฉฑเจ—เฉ€ เจตเจœเฉ‹เจ‚ เจตเจšเจจเจฌเฉฑเจงเจคเจพ เจจเฉ‚เฉฐ เจซเจฒเฉˆเจ— เจ•เจฐเจจ เจฒเจˆ เจฆเฉฑเจธเฉ‡เจ—เฉ€เฅค

เจ†เจ“ เจ•เฉ‹เจก เจฆเฉ€ เจ‡เจธ เจฒเจพเจˆเจจ 'เจคเฉ‡ เจกเฉ‚เฉฐเจ˜เจพเจˆ เจจเจพเจฒ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจ:

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

เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจ‡เฉฑเจ• เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจธเจผเจพเจ–เจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ A4เจ…เจคเฉ‡ เจจเจนเฉ€เจ‚ B3->A3. เจ‡เจธ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจธเจพเจจเฉ‚เฉฐ เจคเฉ‹เจ‚ เจ…เฉฐเจคเจฐ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ เจ…เฉˆเจ•เจจเฉ‡เจ•เจธ x, เจœเฉ‹ เจ•เจฟ เจฌเฉเจฐเจพเจ‚เจš เจฆเฉ‡ เจธเจฟเจฐเจซเจผ เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจนเฉˆ เจฎเฉ‚เจฒ.

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

cache:
  directories:
    - .PVS-Studio/

เจ‡เจธ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ .travis.yml. เจ‡เจน เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เจ•เฉฑเจคเจฐ เจ•เฉ€เจคเฉ‡ เจ—เจ เจตเฉฑเจ–-เจตเฉฑเจ– เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจซเจพเจˆเจฒ เจธเฉ‚เจšเฉ€ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจœเจพเจ‚ เจตเจพเจงเฉ‡ เจตเจพเจฒเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจฌเจพเจ…เจฆ เจฆเฉ€เจ†เจ‚ เจฆเฉŒเฉœเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเฉ‡เจœเจผ เจ•เจฐเฉ‡เจ—เฉ€เฅค เจœเฉ‡เจ•เจฐ เจ…เจœเจฟเจนเจพ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจ…เจธเจฒ เจตเจฟเฉฑเจš เจนเจฐ เจตเจพเจฐ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเฉ‡เจ—เจพเฅค

เจฌเฉฑเจกเฉ€

เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€.เจ†เจˆ. เจตเจพเจ‚เจ—, เจฌเฉฑเจกเฉ€ GitHub 'เจคเฉ‡ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจฆเฉ‡ เจ‰เจฒเจŸ, เจ‡เจน เจตเฉˆเจฌ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเจฟเฉฑเจš เจธเฉฐเจฐเจšเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจฌเจพเจธเจผ เจธเจนเจพเจ‡เจคเจพ เจ‰เจชเจฒเจฌเจง เจนเฉˆ), เจ‡เจธเจฒเจˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจธเจพเจจเฉ‚เฉฐ เจฌเจฟเจฒเจก เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจ•เจพเจฐเจตเจพเจˆ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฆเจฟเจ“ เจœเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจธ เจ—เจคเฉ€เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš เจธเจฅเจพเจชเจค เจกเฉŒเจ•เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจฆเจฟเจ“เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, GCC เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจนเฉˆ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ†เจ‰ เจนเฉเจฃ เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจธเจนเฉ‚เจฒเจคเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเฉ€เจ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจธเฉฐเจชเจพเจฆเจ• เจตเจฟเฉฑเจš เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจฒเจพเจˆเจจเจพเจ‚ เจœเฉ‹เฉœเฉ‹:

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

เจšเจฒเฉ‹ เจนเฉเจฃ เจฐเจจ เจŸเฉˆเจฌ (เจชเจนเจฟเจฒเจพ เจ†เจˆเจ•เจจ) 'เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ เจ…เจคเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจเจกเฉ€เจŸเจฐ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเฉ€เจ:

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-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ…เจญเฉ‡เจฆ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจจเจนเฉ€เจ‚ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚, เจชเจฐ เจ‰เจธ เจฌเฉเจฐเจพเจ‚เจš เจฆเฉ‡ เจฎเฉเจ–เฉ€ เจจเฉ‚เฉฐ เจœเจฟเฉฑเจฅเฉ‹เจ‚ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจผเจฐเจคเฉ€เจ† เจตเจšเจจเจฌเฉฑเจงเจคเจพ เจตเจฟเฉฑเจš เจนเจพเจ‚ 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-เจธเจŸเฉ‚เจกเฉ€เจ“ เจ•เฉˆเจธเจผเจฟเฉฐเจ— เจฒเจˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฌเฉฑเจกเฉ€ เจ…เจ—เจฒเฉ€เจ†เจ‚ เจฒเจพเจ‚เจšเจพเจ‚ เจฒเจˆ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจ•เฉˆเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, เจ†เจ–เจฐเฉ€ เจšเฉ€เจœเจผ เจฌเจšเฉ€ เจนเฉˆ เจฌเฉฑเจกเฉ€ เจตเจฟเฉฑเจš PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฒเจˆ เจฒเฉŒเจ—เจ‡เจจ เจ…เจคเฉ‡ เจชเจพเจธเจตเจฐเจก เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจเจพเฅค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจ† เจœเจพเจตเจพเจ‚เจ—เฉ‡เฅค เจธเจพเจจเฉ‚เฉฐ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฒเจˆ เจฒเฉŒเจ—เจ‡เจจ เจ…เจคเฉ‡ เจ•เฉเฉฐเจœเฉ€ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€ เจœเจพเจ‚ เจ•เจฎเจฟเจŸ เจฆเฉ€ เจฆเจฟเฉฑเจ– เจ‡เฉฑเจ• เจœเจพเจ‚เจš เจจเฉ‚เฉฐ เจšเจพเจฒเฉ‚ เจ•เจฐเฉ‡เจ—เฉ€เฅค เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจ•เจฎเจฟเจŸ เจตเจฟเฉฑเจš เจ—เจฒเจคเฉ€เจ†เจ‚ เจนเจจ, เจคเจพเจ‚ เจฌเฉฑเจกเฉ€ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€ เจชเฉฐเจจเฉ‡ 'เจคเฉ‡ เจฆเจฐเจธเจพเจเจ—เจพ.

AppVeyor

AppVeyor เจธเฉˆเจŸ เจ…เจช เจ•เจฐเจจเจพ เจฌเฉฑเจกเฉ€ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจญ เจ•เฉเจ เจตเฉˆเฉฑเจฌ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš *.yml เจซเจพเจˆเจฒ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจ†เจ‰ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจธเฉˆเจŸเจฟเฉฐเจ—เจœเจผ เจŸเฉˆเจฌ เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจšเจฒเฉ‹ เจ‡เจธ เจชเฉฐเจจเฉ‡ เจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจธเจ•เฉเจฐเฉ‹เจฒ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉˆเจธเจผ เจธเฉ‡เจตเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเฉ€เจ:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจ†เจ‰ เจนเฉเจฃ เจตเจพเจคเจพเจตเจฐเจฃ เจŸเฉˆเจฌ เจคเฉ‡ เจšเฉฑเจฒเฉ€เจ, เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจšเจฟเฉฑเจคเจฐ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เจนเจจเจพเจ‚ เจฆเฉ‹ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ - เจคเฉ‹เจ‚ เจฌเจนเฉเจค เจœเจพเจฃเฉ‚ เจนเฉ‹ PVS_KEY ะธ PVS_USERNAME. เจœเฉ‡ เจจเจนเฉ€เจ‚, เจคเจพเจ‚ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ‰เจน เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจ• เจฆเฉ‡ เจฒเจพเจ‡เจธเฉˆเจ‚เจธ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเจจเฅค เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจพเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฎเจฟเจฒเจพเจ‚เจ—เฉ‡.

เจนเฉ‡เจ เจพเจ‚ เจ‰เจธเฉ‡ เจชเฉฐเจจเฉ‡ 'เจคเฉ‡, เจ•เฉˆเจšเจฟเฉฐเจ— เจฒเจˆ เจซเฉ‹เจฒเจกเจฐ เจฆเจฟเจ“:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ…เจœเจฟเจนเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฆเฉ‹ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจฌเจœเจพเจ เจชเฉ‚เจฐเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจชเจฐ เจธเจพเจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจตเฉ‡เจ—เฉ€. เจ‡เจธ เจฒเจˆ, เจธเจนเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจจเจพเจฎ เจฆเจฐเจœ เจ•เจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆเฅค

เจนเฉเจฃ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจชเจฐเจ–เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจ† เจ—เจฟเจ† เจนเฉˆเฅค เจŸเฉˆเจธเจŸ เจŸเฉˆเจฌ เจ–เฉ‹เจฒเฉเจนเฉ‹ เจ…เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ เจšเฉเจฃเฉ‹:

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 เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจเฉ‚เจ  เจนเฉˆเฅค เจ‡เจธ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจฎเฉˆเจ‚ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธเจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจ…เจชเจกเฉ‡เจŸ เจ•เฉ€เจคเจพ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจญ เจ•เฉเจ, เจชเจนเจฟเจฒเจพเจ‚ เจตเจพเจ‚เจ—:

PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
เจนเฉเจฃ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจธเจจเจฟเฉฑเจชเจŸ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹:

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-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจ…เฉฐเจ—เฉเจฐเฉ‡เจœเจผเฉ€ เจฌเฉ‹เจฒเจฃ เจตเจพเจฒเฉ‡ เจฆเจฐเจธเจผเจ•เจพเจ‚ เจจเจพเจฒ เจธเจพเจ‚เจเจพ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจ…เจจเฉเจตเจพเจฆ เจฒเจˆ เจฒเจฟเฉฐเจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹: เจฎเฉˆเจ•เจธเจฟเจฎ เจœเจผเจตเจฟเจ†เจ—เจฟเฉฐเจŸเจธเฉ‡เจตเฅค PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ, เจฌเฉฑเจกเฉ€ เจ…เจคเฉ‡ เจเจชเจตเฉ€เจ…เจฐ เจตเจฟเฉฑเจš เจ•เจฎเจฟเจŸเจธ เจ…เจคเฉ‡ เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹