เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดธเต‹เดดเตโ€Œเดธเต เด•เต‹เดกเต เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เดพเดฏเดฟ GitHub เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดค เดตเต†เดฌเต เดธเต‡เดตเดจเดฎเดพเดฃเต เดŸเตเดฐเดพเดตเดฟเดธเต CI. เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เตพเด•เตเด•เต เดชเตเดฑเดฎเต‡, เดตเดฟเดชเตเดฒเดฎเดพเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด“เดชเตเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดจเดจเตเดฆเดฟ เดšเต‡เตผเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ PPSSPP เด•เต‹เดกเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต PVS-Studio-เดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดŸเตเดฐเดพเดตเดฟเดธเต CI เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเด‚.

เด†เดฎเตเด–เด‚

เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเด เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดตเต†เดฌเต เดธเต‡เดตเดจเดฎเดพเดฃเต. เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดธเด‚เดฏเต‹เดœเดจ เดธเดฎเตเดชเตเดฐเดฆเดพเดฏเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เด‡เดคเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เดชเดฟ.เดชเดฟ.เดŽเดธเต.เดŽเดธเต.เดชเดฟ.เดชเดฟ. - เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเตผ. เดธเต‹เดฃเดฟ เดชเดฟเดŽเดธเตเดชเดฟเด•เตเด•เดพเดฏเดฟ เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดณเตเดณ เดกเดฟเดธเตเด•เต เด‡เดฎเต‡เดœเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด—เต†เดฏเดฟเดฎเตเด•เดณเตเดŸเต† เดธเดฎเดพเดฐเด‚เดญเด‚ เด…เดจเตเด•เดฐเดฟเด•เตเด•เดพเตป เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด•เดดเดฟเดฏเตเด‚. 1 เดจเดตเด‚เดฌเตผ 2012 เดจเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฑเดคเตเดคเดฟเดฑเด™เตเด™เดฟ. GPL v2 เดชเตเดฐเด•เดพเดฐเด‚ PPSSPP เดฒเตˆเดธเตปเดธเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เด†เตผเด•เตเด•เตเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเตเด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเต‹เดดเตเดธเต เด•เต‹เดกเต.

เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ - เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‹เดกเดฟเดฒเต† เดชเดฟเดถเด•เตเด•เดณเตเด‚ เดธเดพเดงเตเดฏเดคเดฏเตเดณเตเดณ เด•เต‡เดŸเตเดชเดพเดŸเตเด•เดณเตเด‚ เดคเดฟเดฐเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด•เต‹เดกเต เด…เดจเดฒเตˆเดธเตผ. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เด’เดฐเต เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดžเด™เตเด™เตพ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดกเต†เดตเดฒเดชเตเดชเดฑเตเดŸเต† เดฎเต†เดทเต€เดจเดฟเตฝ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เด…เดฒเตเดฒ, เด•เตเดฒเต—เดกเดฟเตฝ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด‚, เด•เต‚เดŸเดพเดคเต† PPSSPP-เดฏเดฟเดฒเต† เดชเดฟเดถเด•เตเด•เตพเด•เตเด•เดพเดฏเดฟ เดจเต‹เด•เตเด•เตเด•.

เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเด เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตเดฅเดฟเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจ GitHub-เตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดถเต‡เด–เดฐเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† PVS-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹เดฏเตเด•เตเด•เตเดณเตเดณ เด’เดฐเต เด•เต€เดฏเตเด‚ (เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚ เดŸเตเดฐเดฏเตฝ เด•เต€ เด…เดฅเดตเดพ เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดธเต—เดœเดจเตเดฏเด‚).

เดจเดฎเตเด•เตเด•เต เดธเตˆเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚ เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเด. เดจเดฟเด™เตเด™เดณเตเดŸเต† GitHub เด…เด•เตเด•เต—เดฃเตเดŸเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเดณเตเดณ เด…เด‚เด—เต€เด•เดพเดฐเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดžเด™เตเด™เตพ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด•เดพเดฃเตเด‚:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดŸเต†เดธเตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ, เดžเดพเตป PPSSPP เดซเต‹เตผเด•เตเด•เต เดšเต†เดฏเตเดคเต.

เดžเด™เตเด™เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดถเต‡เด–เดฐเด‚ เดžเด™เตเด™เตพ เดธเดœเต€เดตเดฎเดพเด•เตเด•เตเดจเตเดจเต:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดจเดฟเดฒเดตเดฟเตฝ, เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เด•เต†เดŸเตเดŸเดฟเดŸเดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเดณเตเดณ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต.

เดตเดฟเดถเด•เดฒเดจ เดธเดฎเดฏเดคเตเดคเต, เดšเดฟเดฒ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹เดฏเตเด•เตเด•เตเดณเตเดณ เด•เต€, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต เด…เดญเดฟเด•เดพเดฎเตเดฏเดฎเดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเดฒเต† เดฌเดฟเตฝเดกเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดšเต‡เตผเด•เตเด•เดพเด‚:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดžเด™เตเด™เตพเด•เตเด•เต เดตเต‡เดฃเตเดŸเดคเต:

  • PVS_USERNAME - เด‰เดชเดฏเต‹เด•เตเดคเตƒเดจเดพเดฎเด‚
  • PVS_KEY - เด•เต€
  • MAIL_USER - เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เด…เดฏเดฏเตเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด‡เดฎเต†เดฏเดฟเตฝ
  • MAIL_PASSWORD - เด‡เดฎเต†เดฏเดฟเตฝ เดชเดพเดธเตโ€Œเดตเต‡เดกเต

เด…เดตเดธเดพเดจเดคเตเดคเต† เดฐเดฃเตเดŸเต†เดฃเตเดฃเด‚ เด“เดชเตเดทเดฃเตฝ เด†เดฃเต. เดฎเต†เดฏเดฟเตฝ เดตเดดเดฟ เดซเดฒเด™เตเด™เตพ เด…เดฏเดฏเตเด•เตเด•เดพเตป เด‡เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดฐเต เดฐเต€เดคเดฟเดฏเดฟเตฝ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดฃเดฎเต†เด™เตเด•เดฟเตฝ, เด…เดต เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ.

เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดžเด™เตเด™เตพ เดšเต‡เตผเดคเตเดคเต:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดซเดฏเตฝ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚ .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'

เดฒเดฟเดธเตโ€Œเดฑเตเดฑเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเด‚ 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-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
}

เดšเดŸเด™เตเด™เดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดŸเตเดฐเดพเดตเดฟเดธเต_เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด•เดฎเตเดชเตˆเดฒเดฑเตเด•เตพ เดžเด™เตเด™เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด…เดชเตเดชเต‹เตพ เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เด†เดฃเต†เด™เตเด•เดฟเตฝ $PVS_ANALYZE เดฎเต‚เดฒเตเดฏเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต เด…เดคเต† (เดžเด™เตเด™เตพ เด…เดคเต เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเต เด…เดฏเด•เตเด•เตเด• เดฌเดฟเตฝเดกเต เดฎเดพเดŸเตเดฐเดฟเด•เตเดธเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดธเดฎเดฏเดคเตเดคเต), เดžเด™เตเด™เตพ เดชเดพเด•เตเด•เต‡เดœเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต pvs-studio. เด‡เดคเตเด•เต‚เดŸเดพเดคเต†, เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต libio-socket-ssl-perl ะธ libnet-ssley-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 เด•เด‚เดชเตˆเดฒเต‡เดทเตป เด•เดฎเดพเตปเดกเตเด•เตพ เด•เดฏเดฑเตเดฑเตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดซเตเดฒเดพเด—เต. เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด•เต‹เดกเต เด…เดจเดฒเตˆเดธเดฑเดฟเดจเต เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดตเดพเดฏเดฟเด•เตเด•เดพเด‚ "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

เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเด เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดคเดจเตเดจเต† เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เด‰เดชเดฏเต‹เด•เตเดคเตƒเดจเดพเดฎเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด•เต€เดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด†เดฆเตเดฏ เดตเดฐเดฟ เด’เดฐเต เดฒเตˆเดธเตปเดธเต เดซเดฏเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต.

เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดตเดฐเดฟ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดตเดฟเดถเด•เดฒเดจเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต. เดชเดคเดพเด• -เดœเต† เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดคเตเดฐเต†เดกเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเดจเตเดจเต, เดซเตเดฒเดพเด—เต -เดŽเตฝ เดฒเตˆเดธเตปเดธเต, เดซเตเดฒเดพเด—เต เดŽเดจเตเดจเดฟเดต เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต -เด’ เดฒเต‹เด—เตเด•เตพ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดซเดฏเดฒเตเด‚ เดซเตเดฒเดพเด—เตเด‚ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต -เดกเดฟเดธเต†เดฌเดฟเตพ เดฒเตˆเดธเตปเดธเต เดŽเด•เตโ€Œเดธเตโ€Œเดชเดฑเต‡เดทเตป เดšเต†เด•เตเด•เต เดธเตเดตเดคเดตเต‡เดฏเตเดณเตเดณเดคเดฟเดจเดพเตฝ เดŸเตเดฐเดฏเตฝ เดชเดคเดฟเดชเตเดชเตเด•เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฃเต pvs-studio-analyzer เดฒเตˆเดธเตปเดธเต เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเดพเตป เดชเต‹เด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต เดจเตฝเด•เตเด‚. เด‡เดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เดคเดŸเดฏเดพเตป, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดซเตเดฒเดพเด—เต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเด‚.

เดฒเต‹เด—เต เดซเดฏเดฒเดฟเตฝ เดฑเต‹ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดพเดคเต† เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดซเดฏเตฝ เดฑเต€เดกเดฌเดฟเตพ เด†เด•เตเด•เดฃเด‚. เดจเดฎเตเด•เตเด•เต เดฒเต‹เด—เตเด•เตพ เด•เดŸเดจเตเดจเตเดชเต‹เด•เดพเด‚ เดชเตเดฒเด—เต-เด•เตบเดตเต†เตผเดŸเตเดŸเตผ, เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด’เดฐเต 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;

Git เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดพเดจเตเดณเตเดณ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เดŸเตเดฐเดพเดตเดฟเดธเต CI เดฌเดฟเตฝเดกเต เดธเตเดตเดฏเดฎเต‡เดต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เดฌเดฟเตฝเดกเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเตป "ppsspp" เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดจเดฟเดฒเดตเดฟเดฒเต† เดฌเดฟเตฝเดกเดฟเดจเตเดฑเต† เด’เดฐเต เด…เดตเดฒเต‹เด•เดจเด‚ เดžเด™เตเด™เตพ เด•เดพเดฃเตเด‚:

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚
เดฌเดฟเตฝเดกเต เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเตเดฑเต† เดซเดฒเด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต เด‡เดฎเต†เดฏเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดฒเดญเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด’เดฐเต‡เดฏเตŠเดฐเต เดฎเดพเตผเด—เตเด—เด‚ เดฎเต†เดฏเดฟเดฒเดฟเด‚เด—เต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ. เดเดคเต เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เดฐเต€เดคเดฟเดฏเตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเด‚. เดŽเดจเตเดจเดพเตฝ เดฌเดฟเตฝเดกเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏ เดถเต‡เดทเด‚, เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เดซเดฏเดฒเตเด•เตพ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเต เด“เตผเดคเตเดคเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.

เดชเดฟเดถเด•เต เดธเด‚เด—เตเดฐเดนเด‚

เดเดฑเตเดฑเดตเตเด‚ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เดญเดพเด—เด‚ เดžเด™เตเด™เตพ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟ. เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตเดŸเต† เดŽเดฒเตเดฒเดพ เดถเตเดฐเดฎเด™เตเด™เดณเตเด‚ เดตเดฟเดฒเดฎเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเด‚. เดฎเต†เดฏเดฟเตฝ เดตเดดเดฟ เดŽเดจเดฟเด•เตเด•เต เดตเดจเตเดจ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด…เดจเดพเดฒเดฟเดธเดฟเดธเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฐเดธเด•เดฐเดฎเดพเดฏ เดšเดฟเดฒ เดชเต‹เดฏเดฟเดจเตเดฑเตเด•เตพ เดจเต‹เด•เตเด•เดพเด‚ (เดžเดพเตป เด…เดคเต เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดคเต เดตเต†เดฑเตเดคเต†เดฏเดฒเตเดฒ).

เด…เดชเด•เดŸเด•เดฐเดฎเดพเดฏ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเตป

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

เดŽเดฒเตเดฒเดพเด‚ เด•เตเดฐเดฎเดคเตเดคเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดฒเตเดฎเดพเดฃเต เดฎเต†เด‚เดธเต†เดฑเตเดฑเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดคเตเดตเดดเดฟ เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸ เดกเดพเดฑเตเดฑ เดฑเดพเดฎเดฟเตฝ เดชเตเดจเดฐเดพเดฒเต‡เด–เดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด‡เดคเตเดตเดฐเต† เดธเดจเตเดคเต‹เดทเดฟเด•เตเด•เดฐเตเดคเต. เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต‡เดทเดจเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เดฑเดฟเดฒเต€เดธเต เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† เด…เดธเด‚เดฌเตเดฒเดฟ เดฒเดฟเดธเตเดฑเตเดฑเดฟเด‚เด—เต เดจเต‹เด•เตเด•เดพเด‚:

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

เดฒเดฟเดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเตฝ เดจเดฟเดจเตเดจเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด•เด‚เดชเตˆเดฒเตผ เด•เต‹เตพ เด…เดตเด—เดฃเดฟเดšเตเดšเต เดฎเต†เด‚เดธเต†เดฑเตเดฑเต. เด‡เดคเต เดšเดŸเด™เตเด™เดฟเตฝ เดตเดธเตเดคเตเดค เด•เดพเดฐเดฃเด‚ sha1 เด•เต‹เดณเดฟเดจเต เดถเต‡เดทเด‚ เดฎเต†เด‚เดธเต†เดฑเตเดฑเต เด˜เดŸเดจเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดชเดฐเดพเดฎเตผเดถเดฎเดฟเดฒเตเดฒ ctx. เด…เดคเดฟเดจเดพเตฝ, เดญเดพเดตเดฟเดฏเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเตเดค เดฎเต†เดฎเตเดฎเดฑเดฟ เด“เดตเตผเดฑเตˆเดฑเตเดฑเดฟเด‚เด—เต เดชเตเดฐเต‹เดธเดธเตเดธเตผ เดธเดฎเดฏเด‚ เดชเดพเดดเดพเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เด•เด‚เดชเตˆเดฒเตผ เด’เดจเตเดจเตเด‚ เด•เดพเดฃเตเดจเตเดจเดฟเดฒเตเดฒ. เดซเด‚เด—เตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚ 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. เดŽเดฒเตเดฒเดพ เดตเตเดฏเดตเดธเตเดฅเด•เดณเตเด‚ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เด•เต‹เดกเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเดณเตเดณเต‚ leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 เดตเตเดฏเดพเดœเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเด‚. เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเดธเตเดคเดพเดตเดจเด•เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดฎเดฑเตเดฑเต เดฌเตเดฐเดพเดžเตเดšเดฟเดจเต เดถเดฐเดฟเดฏเดพเด•เตเด‚: leftvol <= 0xFFFF, rightvol <= 0xFFFF, leftvol >= 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. เดตเดฟเดฒเดพเดธเด‚ เดธเดพเดงเตเดคเดฏเตเดณเตเดณเดคเดพเดฃเต‹ เดŽเดจเตเดจเต เดžเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเดฟเดฒเตเดฒเต‡? psmfData, เด‡เดฐเดŸเตเดŸเดฟ? เด…เดคเดฟเดจเดพเตฝ เด‡เดคเต เดŽเดจเดฟเด•เตเด•เต เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเต... เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด‡เดคเต เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เด’เดฐเต เด…เด•เตเดทเดฐเดคเตเดคเต†เดฑเตเดฑเดพเดฃเต, เดฐเดฃเตเดŸเต เด‡เตปเดชเตเดŸเตเดŸเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต เด†เดถเดฏเด‚.

เดถเดฐเดฟเดฏเดพเดฏ เด“เดชเตเดทเตป:

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, เด…เดคเต เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดจเตฝเด•เตเดจเตเดจเต เดคเต†เดฑเตเดฑเดพเดฏ เดตเตเดฏเดตเดธเตเดฅเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด•เดพเดฐเดฃเด‚, เดžเด™เตเด™เตพ เด“เตผเด•เตเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดตเดฒเตเดชเตเดชเด‚ เดชเต‚เดœเตเดฏเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเด‚. เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพเด•เตเด•เตเด‚ เด…เตผเดคเตเดฅเดฎเดฟเดฒเตเดฒ.

เดชเตเดฐเดคเตเดฏเด•เตเดทเดคเตเดคเดฟเตฝ, เด•เต‹เดกเต เดถเด•เดฒเดคเตเดคเดฟเดจเตเดฑเต† เดฐเดšเดฏเดฟเดคเดพเดตเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเดจเต† เดคเดฟเดฐเตเดคเตเดคเดฟเดฏเต†เดดเตเดคเดพเตป เดฎเดฑเดจเตเดจเต เดตเดฒเตเดชเตเดชเด‚ เด…เดคเดฟเดจเต เดฎเตเตปเดชเต.

เดจเดฟเตผเดคเตเดคเตเด•

เด‡เดตเดฟเดŸเต†เดฏเดพเดฃเต เดจเดฎเตเดฎเตพ เดคเต†เดฑเตเดฑเตเด•เดณเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจเดคเต. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เด‰เดฆเตเดฆเต‡เดถเตเดฏเด‚ เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเตเดฎเดพเดฏเดฟ เดšเต‡เตผเดจเตเดจเต เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹เดฏเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเตเดฐเด•เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต, เด…เดฒเตเดฒเดพเดคเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดฐ เดธเดฎเด—เตเดฐเดฎเดพเดฏเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเดฒเตเดฒ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฒเตเดคเตเด‚ เดฎเดจเต‹เดนเดฐเดตเตเดฎเดพเดฏ เดคเต†เดฑเตเดฑเตเด•เตพ เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เด…เดตเดฐเต† เด…เดญเดฟเดจเดจเตเดฆเดฟเด•เตเด•เดพเด‚ เด‡เดตเดฟเดŸเต† :).

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดตเต†เดฌเต เดธเต‡เดตเดจเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด‡เตปเด•เตเดฐเดฟเดฎเต†เดจเตเดฑเตฝ เด…เดจเดพเดฒเดฟเดธเดฟเดธเต เดชเตเดฐเดพเด•เตเดŸเต€เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดกเต เดฒเดฏเดฟเดชเตเดชเดฟเดšเตเดš เด‰เดŸเตป เดคเดจเตเดจเต† เดจเดฟเดฐเดตเดงเดฟ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด’เดฐเต เดฌเดฟเตฝเดกเต เดฎเดคเดฟเดฏเดพเด•เดฃเดฎเต†เดจเตเดจเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเดคเตเดคเต‹เดŸเตŠเดชเตเดชเด‚ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‹เดกเดฟเดจเตเดฑเต† เด—เตเดฃเดจเดฟเดฒเดตเดพเดฐเด‚ เด—เดฃเตเดฏเดฎเดพเดฏเดฟ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเด‚.

เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดฒเดฟเด™เตเด•เตเด•เตพ

เด’เดฐเต เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเด‚

เด‡เด‚เด—เตเดฒเต€เดทเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‡เด•เตเดทเด•เดฐเตเดฎเดพเดฏเดฟ เดˆ เดฒเต‡เด–เดจเด‚ เดชเด™เตเด•เดฟเดŸเดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, เดตเดฟเดตเตผเดคเตเดคเดจ เดฒเดฟเด™เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•: Maxim Zvyagintsev. เดชเดฟเดŽเดธเตเดชเดฟ เด—เต†เดฏเดฟเด‚ เด•เตบเดธเต‹เตพ เดŽเดฎเตเดฒเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดพเดตเดฟเดธเต เดธเดฟเดเดฏเดฟเตฝ เดชเดฟเดตเดฟเดŽเดธเต-เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ เดŽเด™เตเด™เดจเต† เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดพเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•