เจ‡เฉฑเจ• PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ

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

เจœเจพเจฃ เจชเจ›เจพเจฃ

เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€.เจ†เจˆ. เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจตเฉˆเฉฑเจฌ เจธเฉ‡เจตเจพ เจนเฉˆเฅค เจ‡เจน เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจœเฉ‹เฉœ เจ•เฉ‡ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจชเฉ€เจชเฉ€เจเจธเจชเฉ€เจชเฉ€ - PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐเฅค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจธเฉ‹เจจเฉ€ PSP เจฒเจˆ เจฌเจฃเจพเจ เจ—เจ เจกเจฟเจธเจ• เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ—เฉ‡เจฎ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆ. เจ‡เจน เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ 1 เจจเจตเฉฐเจฌเจฐ 2012 เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค PPSSPP GPL v2 เจ…เจงเฉ€เจจ เจฒเจพเจ‡เจธเฉฐเจธเจธเจผเฉเจฆเจพ เจนเฉˆเฅค เจ•เฉ‹เจˆ เจตเฉ€ เจ‡เจธ เจตเจฟเฉฑเจš เจธเฉเจงเจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก.

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

เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ

เจธเจพเจจเฉ‚เฉฐ GitHub 'เจคเฉ‡ เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€, เจœเจฟเฉฑเจฅเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจฅเจฟเจค เจนเฉˆ, เจจเจพเจฒ เจนเฉ€ PVS-เจธเจŸเฉ‚เจกเฉ€เจ“ เจฒเจˆ เจ‡เฉฑเจ• เจ•เฉเฉฐเจœเฉ€ (เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹) เจ…เจœเจผเจฎเจพเจ‡เจธเจผ เจ•เฉเฉฐเจœเฉ€ เจœ เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจฎเฉเจซเจผเจค).

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

เจ‡เฉฑเจ• PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ
เจŸเฉˆเจธเจŸ เจฒเจˆ, เจฎเฉˆเจ‚ PPSSPP เจจเฉ‚เฉฐ เจซเฉ‹เจฐเจ• เจ•เฉ€เจคเจพเฅค

เจ…เจธเฉ€เจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจธเจฐเจ—เจฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเจฟเจธ เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚:

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

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

เจ‡เฉฑเจ• PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ
เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€:

  • PVS_USERNAME - เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเจพเจฎ
  • PVS_KEY - เจ•เฉเฉฐเจœเฉ€
  • MAIL_USER - เจˆเจฎเฉ‡เจฒ เจœเฉ‹ เจฐเจฟเจชเฉ‹เจฐเจŸ เจญเฉ‡เจœเจฃ เจฒเจˆ เจตเจฐเจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€
  • MAIL_PASSWORD - เจˆเจฎเฉ‡เจฒ เจชเจพเจธเจตเจฐเจก

เจ†เจ–เจฐเฉ€ เจฆเฉ‹ เจตเจฟเจ•เจฒเจชเจฟเจ• เจนเจจเฅค เจ‡เจนเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจกเจพเจ• เจฐเจพเจนเฉ€เจ‚ เจจเจคเฉ€เจœเฉ‡ เจญเฉ‡เจœเจฃ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฐเจฟเจชเฉ‹เจฐเจŸ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจตเฉฐเจกเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจนเจจ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ€ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ:

เจ‡เฉฑเจ• PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ
เจนเฉเจฃ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰ .travis.yml เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจฐเฉ‚เจŸ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เฉ‹เฅค PPSSPP เจ•เฉ‹เจฒ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจธเฉ€, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจฌเจนเฉเจค เจตเฉฑเจกเฉ€ เจธเฉ€ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ…เจขเฉเจ•เจตเฉ€เจ‚ เจธเฉ€, เจ‡เจธเจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจฃเจพ เจชเจฟเจ† เจ…เจคเฉ‡ เจธเจฟเจฐเจซ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจคเฉฑเจคเจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจกเจฃเจพ เจชเจฟเจ†เฅค

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

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

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

เจœเฉ‹ เจ•เฉเจ เจฌเจšเจฟเจ† เจนเฉˆ เจ‰เจน เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจเจพ เจนเฉˆ:

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

เจชเฉœเฉเจนเจจ เจฆเฉ€ เจธเฉŒเจ– เจฒเจˆ, เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ€ เจฒเจฟเจชเฉ€ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€ .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
}

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

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-socket-ssl-perl ะธ libnet-ssleay-perl, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉ‡เจฒเจฟเฉฐเจ— เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เจพ เจšเฉเจฃเจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจ‰เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเจจเฅค

เจซเฉฐเจ•เจธเจผเจจ download_extract เจจเจฟเจฐเจงเจพเจฐเจค เจชเฉเจฐเจพเจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ…เจคเฉ‡ เจ…เจจเจชเฉˆเจ• เจ•เจฐเจฆเจพ เจนเฉˆ:

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

เจœเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจธเจซเจฒ เจฐเจนเฉ€, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจพเจ‚เจ—เฉ‡ เจธเจซเจฒเจคเจพ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

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

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

เจ—เจฒเจคเฉ€ เจธเฉฐเจ–เฉ‡เจช

เจ…เจธเฉ€เจ‚ เจธเจญ เจคเฉ‹เจ‚ เจ”เจ–เฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉ‚เจฐเจพ เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจนเฉเจฃ เจ†เจ“ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจ•เจฐเฉ€เจ เจ•เจฟ เจธเจพเจกเฉ‡ เจธเจพเจฐเฉ‡ เจฏเจคเจจ เจ‡เจธ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเจจ. เจ†เจ‰ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฐเจฟเจชเฉ‹เจฐเจŸ เจคเฉ‹เจ‚ เจ•เฉเจ เจฆเจฟเจฒเจšเจธเจช เจจเฉเจ•เจคเจฟเจ†เจ‚ 'เจคเฉ‡ เจจเจœเจผเจฐ เจฎเจพเจฐเฉ€เจ เจœเฉ‹ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจกเจพเจ• เจฆเฉเจ†เจฐเจพ เจ†เจ‡เจ† เจธเฉ€ (เจ‡เจน เจ•เฉเจ เจตเฉ€ เจจเจนเฉ€เจ‚ เจธเฉ€ เจœเฉ‹ เจฎเฉˆเจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจธเฉฐเจ•เฉ‡เจค เจ•เฉ€เจคเจพ เจธเฉ€).

เจ–เจคเจฐเจจเจพเจ• เจ“เจชเจŸเฉ€เจฎเจพเจˆเจœเฉ‡เจธเจผเจจ

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  :}

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเฉ‚เจšเฉ€ เจคเฉ‹เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจจเฉ‡ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจ…เจฃเจกเจฟเฉฑเจ  เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจฏเจพเจฆ. เจ‡เจน เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจนเฉˆ เจ•เจฟ เจธเจฎเจพเจ—เจฎ เจตเจฟเฉฑเจš sha1 เจ•เจพเจฒ เจฆเฉ‡ เจฌเจพเจ…เจฆ เจฏเจพเจฆ เจฌเจฃเจคเจฐ เจฆเจพ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจนเจตเจพเจฒเจพ เจจเจนเฉ€เจ‚ เจธเฉ€เจŸเฉ€เจเจ•เจธ. เจ‡เจธ เจฒเจˆ, เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจŸ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจจเฉ‚เฉฐ เจฌเจฐเจฌเจพเจฆ เจ•เจฐเจจ เจฆเจพ เจ•เฉ‹เจˆ เจฎเจคเจฒเจฌ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเจพ เจœเฉ‹ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€เฅค เจคเฉเจธเฉ€เจ‚ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ 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 เจธเจฎเฉ€เจ•เจฐเจจ 'เจธเจพเจˆเจœเจผ == 8' เจนเจฎเฉ‡เจธเจผเจพ เจ—เจฒเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค syn-att.c 195

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

เจชเจฐเจฟเจตเจฐเจคเจจเจธเจผเฉ€เจฒ เจฆเจพ เจ†เจ•เจพเจฐ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐเจพเจ‚เจ• เจฆเฉเจ†เจฐเจพ เจ…เจฐเฉฐเจญ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฟเจฒเจ•เฉเจฒ เจจเจนเฉ€เจ‚ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจฌเจฟเจฒเจ•เฉเจฒ เจนเฉ‡เจ เจพเจ‚ เจ“เจชเจฐเฉ‡เจŸเจฐ เจฒเจˆ if, เจœเฉ‹, เจฌเฉ‡เจธเจผเฉฑเจ•, เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจเฉ‚เจ เฉ‡ เจธเจผเจฐเจคเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจนเฉˆ, เจฆเจพ เจ†เจ•เจพเจฐ เจœเจผเฉ€เจฐเฉ‹ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจ…เจ—เจฒเฉ€เจ†เจ‚ เจœเจพเจ‚เจšเจพเจ‚ เจฆเจพ เจตเฉ€ เจ•เฉ‹เจˆ เจฎเจคเจฒเจฌ เจจเจนเฉ€เจ‚ เจฌเจฃเจฆเจพเฅค

เจœเจผเจพเจนเจฐเจพ เจคเฉŒเจฐ 'เจคเฉ‡, เจ•เฉ‹เจก เจซเจฐเฉˆเจ—เจฎเฉˆเจ‚เจŸ เจฆเจพ เจฒเฉ‡เจ–เจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจŸ เจ•เจฐเจจเจพ เจญเฉเฉฑเจฒ เจ—เจฟเจ† เจธเฉ€ เจฆเจพ เจ†เจ•เจพเจฐ เจ‰เจธ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚เฅค

เจฐเฉ‚เจ•เฉ‹

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

เจธเจฟเฉฑเจŸเจพ

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

เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจฒเจฟเฉฐเจ•

เจ‡เฉฑเจ• PSP เจ—เฉ‡เจฎ เจ•เฉฐเจธเฉ‹เจฒ เจ‡เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจฆเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉเจฐเฉˆเจตเจฟเจธ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจชเฉ€เจตเฉ€เจเจธ-เจธเจŸเฉ‚เจกเฉ€เจ“ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจนเฉˆ

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

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

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