PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-Studio เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚

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

เชชเชฐเชฟเชšเชฏ

เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชตเซ‡เชฌ เชธเซ‡เชตเชพ เช›เซ‡. เชคเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃ เชชเซเชฐเชฅเชพเช“ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฃเชฎเชพเช‚ เชตเชชเชฐเชพเชฏ เช›เซ‡.

เชชเซ€.เชชเซ€.เชเชธ.เชชเซ€.เชชเซ€. - PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐ. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเซ‹เชจเซ€ PSP เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชพเชฏเซ‡เชฒ เชกเชฟเชธเซเช• เชˆเชฎเซ‡เชœเซ€เชธเชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆเชชเชฃ เช—เซ‡เชฎเซเชธเชจเชพ เชฒเซ‹เชจเซเชšเชจเซเช‚ เช…เชจเซเช•เชฐเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เช›เซ‡. เช† เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ เชจเชตเซ‡เชฎเซเชฌเชฐ 1, 2012 เชจเชพ เชฐเซ‹เชœ เชฌเชนเชพเชฐ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. PPSSPP GPL v2 เชนเซ‡เช เชณ เชฒเชพเช‡เชธเชจเซเชธ เชชเซเชฐเชพเชชเซเชค เช›เซ‡. เช•เซ‹เชˆเชชเชฃ เชคเซ‡เชฎเชพเช‚ เชธเซเชงเชพเชฐเซ‹ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก.

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

เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชธเซเชฏเซ‹เชœเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เช…เชฎเชจเซ‡ GitHub เชชเชฐ เชเช• เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡, เชœเซเชฏเชพเช‚ เช…เชฎเชจเซ‡ เชœเซ‹เชˆเชคเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชธเซเชฅเชฟเชค เช›เซ‡, เชคเซ‡เชฎเชœ PVS-Studio เชฎเชพเชŸเซ‡ เช•เซ€ (เชคเชฎเซ‡ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹) เชŸเซเชฐเชพเชฏเชฒ เช•เซ€ เช…เชฅเชตเชพ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชฎเชซเชค).

เชšเชพเชฒเซ‹ เชธเชพเช‡เชŸ เชชเชฐ เชœเชˆเช เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ. เชคเชฎเชพเชฐเชพ GitHub เชเช•เชพเช‰เชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชเชจเซ€ เชธเซ‚เชšเชฟ เชœเซ‹เชถเซเช‚:

PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-Studio เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚
เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ PPSSPP เชซเซ‹เชฐเซเช• เช•เชฐเซเชฏเซเช‚.

เช…เชฎเซ‡ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เชธเช•เซเชฐเชฟเชฏ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡ เช…เชฎเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช:

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

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

PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-Studio เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚
เช…เชฎเชจเซ‡ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡:

  • PVS_USERNAME - เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชจเชพเชฎ
  • PVS_KEY - เช•เซ€
  • MAIL_USER - เช‡เชฎเซ‡เช‡เชฒ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฐเชฟเชชเซ‹เชฐเซเชŸ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡
  • MAIL_PASSWORD - เช‡เชฎเซ‡เช‡เชฒ เชชเชพเชธเชตเชฐเซเชก

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

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹ เช‰เชฎเซ‡เชฐเซเชฏเชพ เช›เซ‡:

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

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

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชคเชฎเชพเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชซเช•เซเชค PPSSPP เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡.

เชนเชตเซ‡ เช…เชฎเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชธเซ‚เชšเชตเซ€เช เช›เซ€เช:

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"
      env: PPSSPP_BUILD_TYPE=Linux

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

เชœเซ‡ เชฌเชพเช•เซ€ เช›เซ‡ เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ-เชตเชฟเชถเชฟเชทเซเชŸ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชธเซ‚เชšเชจเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡:

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

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

เชตเชพเช‚เชšเชตเชพเชจเซ€ เชธเชฐเชณเชคเชพ เชฎเชพเชŸเซ‡, เช†เชฆเซ‡เชถเซ‹ เชเช• เช…เชฒเช— เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ .travis.sh, เชœเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฐเซเชŸ เชชเชฐ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชคเซ‹ เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชซเชพเชˆเชฒ เช›เซ‡ .travis.yml:

language: cpp
dist: xenial

addons:
  apt:
    update: true
    packages:
      - ant
      - aria2
      - build-essential
      - cmake
      - libgl1-mesa-dev
      - libglu1-mesa-dev
      - libsdl2-dev
      - pv
      - sendemail
      - software-properties-common
    sources:
      - sourceline: 'ppa:ubuntu-toolchain-r/test'
      - sourceline: 'ppa:ubuntu-sdk-team/ppa'

matrix:
  include:
    - os: linux
      compiler: "gcc"
      env: PVS_ANALYZE=Yes
    - os: linux
      compiler: "clang"

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เช…เชฎเซ‡ เชธเชฌเชฎเซ‹เชกเซเชฏเซเชฒเซเชธ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€เชถเซเช‚. PPSSPP เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชšเชพเชฒเซ‹ เชชเซเชฐเชฅเชฎ เชซเช‚เช•เซเชถเชจ เชคเซ‡เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€เช .travis.sh (เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจเชจเซ€ เชจเซ‹เช‚เชง เชฒเซ‹):

travis_before_install() {
  git submodule update --init --recursive
}

เชนเชตเซ‡ เช…เชฎเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹เชจเชพ เชธเซเชตเชšเชพเชฒเชฟเชค เชฒเซ‹เช‚เชšเชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชธเซ€เชงเชพ เช†เชตเซ€เช เช›เซ€เช. เชชเซเชฐเชฅเชฎ เช†เชชเชฃเซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ PVS-Studio เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    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 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}

เช•เชพเชฐเซเชฏเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ travis_install เช†เชชเชฃเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชชเชฃเชจเซ‡ เชœเซ‹เชˆเชคเชพ เช•เชฎเซเชชเชพเชˆเชฒเชฐเซเชธ เชˆเชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เช เช›เซ€เช. เชชเช›เซ€ เชœเซ‹ เชšเชฒ $PVS_ANALYZE เชธเซเชŸเซ‹เชฐ เชฎเซ‚เชฒเซเชฏ เชนเชพ (เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชธเซ‚เชšเชตเซเชฏเซเช‚ เช›เซ‡ เช†เชถเชฐเซ‡ เชฌเชฟเชฒเซเชก เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ), เช…เชฎเซ‡ เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เช เช›เซ€เช pvs-เชธเซเชŸเซเชกเชฟเชฏเซ‹. เช† เช‰เชชเชฐเชพเช‚เชค, เชชเซ‡เช•เซ‡เชœเซ‹ เชชเชฃ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ libio-เชธเซ‹เช•เซ‡เชŸ-ssl-perl ะธ libnet-ssleay-perl, เชœเซ‹ เช•เซ‡, เชคเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชฎเซ‡เช‡เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชคเซ‡เชฅเซ€ เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ‹ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซ€เชœเซ€ เชชเชฆเซเชงเชคเชฟ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€.

เช•เชพเชฐเซเชฏ เชกเชพเช‰เชจเชฒเซ‹เชก_เช…เชฐเซเช• เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช†เชฐเซเช•เชพเช‡เชตเชจเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช…เชจเซ‡ เช…เชจเชชเซ…เช• เช•เชฐเซ‡ เช›เซ‡:

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เชเช•เชธเชพเชฅเซ‡ เชฎเซ‚เช•เชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡. เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ:

travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}

เชนเช•เซ€เช•เชคเชฎเชพเช‚, เช† เชฒเซ€เชŸเซ€เช“ เชธเชฟเชตเชพเชฏ, เช† เชเช• เชธเชฐเชณ เชฎเซ‚เชณ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช›เซ‡:

if [ "$PVS_ANALYZE" = "Yes" ]; then
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi

เช•เซ‹เชกเชจเชพ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช…เชฎเซ‡ เชธเซ‡เชŸ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ cmake เชธเช‚เช•เชฒเชจ เช†เชฆเซ‡เชถเซ‹เชจเซ€ เชจเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ เชงเซเชตเชœ. เชธเซเชŸเซ‡เชŸเชฟเช• เช•เซ‹เชก เชตเชฟเชถเซเชฒเซ‡เชทเช• เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชคเชฎเซ‡ เชฒเซ‡เช–เชฎเชพเช‚ เช† เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹ โ€œLinux เช…เชจเซ‡ macOS เชชเชฐ PVS-Studio เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเซเช‚".

เชœเซ‹ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชธเชซเชณ เชฐเชนเซ€, เชคเซ‹ เช…เชฎเซ‡ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช เชธเชซเชณเชคเชพ เชชเช›เซ€, เชœเซเชฏเชพเช‚ เช…เชฎเซ‡ เชธเซเชฅเชฟเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เช เช›เซ€เช:

travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}

เชšเชพเชฒเซ‹ เชจเซ€เชšเซ‡เชจเซ€ เชฒเซ€เชŸเซ€เช“ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                -o PVS-Studio-${CC}.log 
                                --disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html

เชชเซเชฐเชฅเชฎ เชฒเซ€เชŸเซ€ เชฏเซเชเชฐเชจเชพเชฎ เช…เชจเซ‡ เช•เซ€เชฎเชพเช‚เชฅเซ€ เชฒเชพเชฏเชธเชจเซเชธ เชซเชพเชˆเชฒ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เช…เชฎเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชเชจเซเชตเชพเชฏเชฐเชฎเซ‡เชจเซเชŸ เชตเซ‡เชฐเซ€เชเชฌเชฒ เชธเซ‡เชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชœ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช•เชฐเซ€ เช›เซ‡.

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

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

เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชฎเซ‡เช‚ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‡เช‡เชฒ เชฆเซเชตเชพเชฐเชพ เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เชˆ - เชฎเซ‡เชฒ เชฎเซ‹เช•เชฒเซ‹.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชซเชพเช‡เชฒ เชฎเชณเซ€ .travis.sh:

#/bin/bash

travis_before_install() {
  git submodule update --init --recursive
}

download_extract() {
  aria2c -x 16 $1 -o $2
  tar -xf $2
}

travis_install() {
  if [ "$CXX" = "g++" ]; then
    sudo apt-get install -qq g++-4.8
  fi
  
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    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 
                             libio-socket-ssl-perl 
                             libnet-ssleay-perl
  fi
    
  download_extract 
    "https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz" 
    cmake-3.6.2-Linux-x86_64.tar.gz
}
travis_script() {
  if [ -d cmake-3.6.2-Linux-x86_64 ]; then
    export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
  fi
  
  CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  fi
  cmake $CMAKE_ARGS CMakeLists.txt
  make
}
travis_after_success() {
  if [ "$PVS_ANALYZE" = "Yes" ]; then
    pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
    pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic 
                                    -o PVS-Studio-${CC}.log 
                                    --disableLicenseExpirationCheck
    
    plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
    sendemail -t [email protected] 
              -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" 
              -s smtp.gmail.com:587 
              -xu $MAIL_USER 
              -xp $MAIL_PASSWORD 
              -o tls=yes 
              -f $MAIL_USER 
              -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
  fi
}
set -e
set -x

$1;

เชนเชตเซ‡ เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชฆเชฌเชพเชฃ เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡, เชœเซ‡ เชชเช›เซ€ เชŸเซเชฐเซ‡เชตเชฟเชธ เชธเซ€เช†เชˆ เช†เชชเซ‹เช†เชช เชฌเชฟเชฒเซเชกเชจเซ‡ เชšเชฒเชพเชตเชถเซ‡. เชฌเชฟเชฒเซเชก เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชชเชฐ เชœเชตเชพ เชฎเชพเชŸเซ‡ "ppsspp" เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹:

PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-Studio เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚
เช…เชฎเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชฌเชฟเชฒเซเชกเชจเซ€ เชเชพเช‚เช–เซ€ เชœเซ‹เชˆเชถเซเช‚:

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

เชญเซ‚เชฒเชจเซ‹ เชธเชพเชฐเชพเช‚เชถ

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

เช–เชคเชฐเชจเชพเช• เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  memset( &ctx, 0, sizeof( sha1_context ) );
}

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชšเซ‡เชคเชตเชฃเซ€: V597 เช•เชฎเซเชชเชพเชˆเชฒเชฐ 'เชฎเซ‡เชฎเชธเซ‡เชŸ' เชซเช‚เช•เซเชถเชจ เช•เซ‹เชฒเชจเซ‡ เช•เชพเชขเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— 'เชธเชฎ' เชฌเชซเชฐเชจเซ‡ เชซเซเชฒเชถ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. RtlSecureZeroMemory() เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช–เชพเชจเช—เซ€ เชกเซ‡เชŸเชพเชจเซ‡ เชญเซ‚เช‚เชธเซ€ เชจเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ เชฅเชตเซ‹ เชœเซ‹เชˆเช. sha1.cpp 325

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

; Line 355
  mov r8d, 20
  xor edx, edx
  lea rcx, QWORD PTR sum$[rsp]
  call memset
; Line 356

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

; 354  :
; 355  :  memset( sum, 0, sizeof( sum ) );
; 356  :}

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

เชธเชพเชšเซเช‚

void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
  sha1_context ctx;

  sha1_starts( &ctx );
  sha1_update( &ctx, input, ilen );
  sha1_finish( &ctx, output );

  RtlSecureZeroMemory(&ctx, sizeof( sha1_context ) );
} 

เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€

static u32 sceAudioOutputPannedBlocking
             (u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    if (leftvol >= 0) {
      chans[chan].leftVolume = leftvol;
    }
    if (rightvol >= 0) {
      chans[chan].rightVolume = rightvol;
    }
    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชšเซ‡เชคเชตเชฃเซ€: V547 เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 'leftvol >= 0' เชนเช‚เชฎเซ‡เชถเชพ เชธเชพเชšเซ€ เชนเซ‹เชฏ เช›เซ‡. sceAudio.cpp 120

เชชเซเชฐเชฅเชฎ เชฎเชพเชŸเซ‡ เชฌเซ€เชœเซ€ เชถเชพเช–เชพ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ‹ if. เชœเซ‹ เชฌเชงเซ€ เชถเชฐเชคเซ‹ เชนเซ‹เชฏ เชคเซ‹ เชœ เช•เซ‹เชกเชจเซ‹ เช…เชฎเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชฒเซ‡เชซเซเชŸเชตเซ‹เชฒ > 0xFFFF || rightvol > 0xFFFF || เชฒเซ‡เชซเซเชŸเชตเซ‹เชฒ < 0 || เช…เชงเชฟเช•เชพเชฐ เชตเซ‹เชฒ < 0 เช–เซ‹เชŸเชพ เชธเชพเชฌเชฟเชค เชฅเชถเซ‡. เชคเซ‡เชฅเซ€, เช…เชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชจเชฟเชตเซ‡เชฆเชจเซ‹ เชฎเชณเซ‡ เช›เซ‡, เชœเซ‡ เช…เชจเซเชฏ เชถเชพเช–เชพ เชฎเชพเชŸเซ‡ เชธเชพเชšเชพ เชนเชถเซ‡: เชฒเซ‡เชซเซเชŸเชตเซ‹เชฒ <= 0xFFFF, rightvol <= 0xFFFF, เชฒเซ‡เชซเซเชŸเชตเซ‹เชฒ >= 0 ะธ rightvol >= 0. เช›เซ‡เชฒเซเชฒเชพ เชฌเซ‡ เชจเชฟเชตเซ‡เชฆเชจเซ‹ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซ‹. เชถเซเช‚ เช† เช•เซ‹เชกเชจเชพ เชญเชพเช—เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชถเชฐเชค เชถเซเช‚ เช›เซ‡ เชคเซ‡ เชคเชชเชพเชธเชตเชพเชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡?

เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช† เชถเชฐเชคเซ€ เชจเชฟเชตเซ‡เชฆเชจเซ‹เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช:

static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
  int result = 0;
  // For some reason, this is the only one that checks for negative.
  if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
    ....
  } else {
    chans[chan].leftVolume = leftvol;
    chans[chan].rightVolume = rightvol;

    chans[chan].sampleAddress = samplePtr;
    result = __AudioEnqueue(chans[chan], chan, true);
  }
}

เช…เชจเซเชฏ เชฆเซƒเชถเซเชฏ. เช† เชจเชฟเชฐเชฐเซเชฅเช• เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“ เชชเชพเช›เชณ เชเช• เชชเซเชฐเช•เชพเชฐเชจเซ€ เชญเซ‚เชฒ เช›เซเชชเชพเชฏเซ‡เชฒเซ€ เช›เซ‡. เช•เชฆเชพเชš เชคเซ‡เช“เช เชถเซเช‚ เชœเชฐเซ‚เชฐเซ€ เชนเชคเซเช‚ เชคเซ‡ เชคเชชเชพเชธเซเชฏเซเช‚ เชจ เชนเชคเซเช‚.

Ctrl+C Ctrl+V เชธเซเชŸเซเชฐเชพเช‡เช•เซเชธ เชฌเซ‡เช•

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfData) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

V501 '||' เชจเซ€ เชกเชพเชฌเซ€ เช…เชจเซ‡ เชœเชฎเชฃเซ€ เชฌเชพเชœเซเช '!Memory::IsValidAddress(psmfData)' เชธเชฎเชพเชจ เชชเซ‡เชŸเชพ-เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเช“ เช›เซ‡. เช“เชชเชฐเซ‡เชŸเชฐ scePsmf.cpp 703

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

เชธเชพเชšเซ‹ เชตเชฟเช•เชฒเซเชช:

static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
  if (!Memory::IsValidAddress(psmfStruct) ||
      !Memory::IsValidAddress(psmfData)) {
    return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
  }
  ....
}

เชญเซ‚เชฒเซ€ เช—เชฏเซ‡เชฒเชพ เชšเชฒ

extern void ud_translate_att(
  int size = 0;
  ....
  if (size == 8) {
    ud_asmprintf(u, "b");
  } else if (size == 16) {
    ud_asmprintf(u, "w");
  } else if (size == 64) {
    ud_asmprintf(u, "q");
  }
  ....
}

PVS-เชธเซเชŸเซเชกเชฟเชฏเซ‹ เชšเซ‡เชคเชตเชฃเซ€: V547 เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ 'size == 8' เชนเช‚เชฎเซ‡เชถเชพ เช–เซ‹เชŸเซ€ เชนเซ‹เชฏ เช›เซ‡. syn-att.c 195

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

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

เชฆเซ‡เช–เซ€เชคเซ€ เชฐเซ€เชคเซ‡, เช•เซ‹เชก เชซเซเชฐเซ‡เช—เชฎเซ‡เชจเซเชŸเชจเชพ เชฒเซ‡เช–เช• เชตเซ‡เชฐเซ€เชเชฌเชฒ เชชเชฐ เชซเชฐเซ€เชฅเซ€ เชฒเช–เชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเชพ เช•เชฆ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚.

เชฌเช‚เชง

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

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

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

เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ

PSP เช—เซ‡เชฎ เช•เชจเซเชธเซ‹เชฒ เช‡เชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเซ‡เชตเชฟเชธ CI เชฎเชพเช‚ PVS-Studio เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเซเช‚

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

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

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