แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
Travis CI แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก GitHub-แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒ˜แƒก แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒก. แƒ–แƒ”แƒ›แƒแƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒชแƒ”แƒœแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ แƒ—แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ—. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒ— Travis CI-แƒก PVS-Studio-แƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก PPSSPP แƒ™แƒแƒ“แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

แƒขแƒ แƒ”แƒ•แƒ˜แƒก CI แƒแƒ แƒ˜แƒก แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒฃแƒฌแƒงแƒ•แƒ”แƒขแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“.

PPSSPP - PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜. แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒ‘แƒแƒซแƒแƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒก Sony PSP-แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒœแƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ˜ แƒ“แƒ˜แƒกแƒ™แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ. แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ 1 แƒฌแƒšแƒ˜แƒก 2012 แƒœแƒแƒ”แƒ›แƒ‘แƒ”แƒ แƒก. PPSSPP แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ GPL v2-แƒ˜แƒ—. แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ’แƒแƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒฌแƒงแƒแƒ แƒ แƒ™แƒแƒ“แƒ˜.

PVS- แƒกแƒขแƒฃแƒ“แƒ˜แƒ โ€” แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒš แƒ™แƒแƒ“แƒจแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒžแƒแƒขแƒ”แƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒแƒซแƒ”แƒ‘แƒœแƒแƒ“. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜, แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒ˜แƒ— PVS-Studio แƒแƒ แƒ แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒแƒ“ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜แƒก แƒแƒžแƒแƒ แƒแƒขแƒ–แƒ”, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜ แƒ“แƒ แƒ•แƒ”แƒซแƒ”แƒ‘แƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก PPSSPP-แƒจแƒ˜.

Travis CI-แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒแƒชแƒแƒ•แƒ˜ GitHub-แƒ–แƒ”, แƒกแƒแƒ“แƒแƒช แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜, แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ PVS-Studio-แƒกแƒ—แƒ•แƒ˜แƒก (แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒกแƒแƒชแƒ“แƒ”แƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ แƒแƒœ แƒฃแƒคแƒแƒกแƒ แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก).

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ”แƒ— แƒกแƒแƒ˜แƒขแƒ–แƒ” แƒขแƒ แƒ”แƒ•แƒ˜แƒก CI. แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ GitHub แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒแƒ•แƒขแƒแƒ แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒกแƒแƒชแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒแƒก:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
แƒขแƒ”แƒกแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ” แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜ PPSSPP.

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ”แƒ‘แƒ— แƒกแƒแƒชแƒแƒ•แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
แƒแƒ› แƒ“แƒ แƒแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Travis CI แƒ•แƒ”แƒ  แƒแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒ แƒแƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒก แƒ“แƒ แƒแƒก แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜ PVS-Studio-แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒแƒช แƒแƒ แƒแƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜. แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜ Travis CI-แƒจแƒ˜ build แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ:

  • PVS_USERNAME - แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜
  • PVS_KEY - แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜
  • MAIL_USER - แƒ”แƒšแƒคแƒแƒกแƒขแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ“
  • MAIL_PASSWORD - แƒ”แƒšแƒคแƒแƒกแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒ˜

แƒ‘แƒแƒšแƒ แƒแƒ แƒ˜ แƒแƒ แƒฉแƒ”แƒ•แƒ˜แƒ—แƒ˜แƒ. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒกแƒขแƒ˜แƒ— แƒ’แƒแƒกแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ“. แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ’แƒ–แƒ˜แƒ— แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒ, แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ›แƒแƒ—แƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
แƒแƒฎแƒšแƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒคแƒแƒ˜แƒšแƒ˜ .travis.yml แƒ“แƒ แƒ’แƒแƒœแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒซแƒ˜แƒ แƒจแƒ˜. PPSSPP-แƒก แƒฃแƒ™แƒ•แƒ” แƒฐแƒฅแƒแƒœแƒ“แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ Travis CI-แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฃแƒ›แƒชแƒ, แƒ˜แƒก แƒ˜แƒงแƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ“แƒ˜แƒ“แƒ˜ แƒ“แƒ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒฃแƒ•แƒแƒ แƒ’แƒ˜แƒกแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒแƒ’แƒ•แƒ˜แƒฌแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒ˜แƒ“แƒแƒ“ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒ›แƒ˜แƒ•แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒ”แƒœแƒ, Ubuntu Linux-แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ“แƒ แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜:

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

แƒชแƒแƒขแƒ แƒ›แƒ”แƒขแƒ˜ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ matrix. Travis CI-แƒจแƒ˜ แƒแƒ แƒ˜แƒก build-แƒ˜แƒก แƒแƒคแƒชแƒ˜แƒแƒœแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒแƒ แƒ˜ แƒ’แƒ–แƒ: แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒ แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ˜แƒก, แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜แƒก, แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ.แƒจ. แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ, แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒฌแƒแƒ แƒ›แƒแƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒขแƒ แƒ˜แƒชแƒ; แƒ›แƒ”แƒแƒ แƒ” แƒแƒ แƒ˜แƒก แƒ›แƒแƒขแƒ แƒ˜แƒชแƒ˜แƒก แƒแƒจแƒ™แƒแƒ แƒ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ. แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒ”แƒก แƒแƒ แƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒแƒœ, แƒžแƒ˜แƒ แƒ˜แƒฅแƒ˜แƒ—, แƒ’แƒแƒ›แƒแƒ แƒ˜แƒชแƒฎแƒแƒ— แƒ˜แƒ’แƒ˜ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒ แƒ˜แƒชแƒฎแƒแƒ•แƒก. แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ›แƒ”แƒขแƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒแƒฅ Travis 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

Travis CI แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ”แƒขแƒแƒžแƒ–แƒ”. แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒแƒ“แƒ แƒ”_แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ›แƒ“แƒ”. แƒ›แƒ”แƒ แƒ” แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒงแƒ•แƒ”แƒ‘แƒ แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒแƒก addons.aptแƒ แƒแƒช แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ”แƒ—. แƒ—แƒแƒ•แƒแƒ“ แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒฎแƒ“แƒ”แƒ‘แƒ script. แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒฌแƒแƒ•แƒ˜แƒ“แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ›แƒแƒ•แƒฉแƒœแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’_แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ (แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒ› แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒฉแƒแƒ•แƒแƒขแƒแƒ แƒ”แƒ‘แƒ— แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ  แƒแƒœแƒแƒšแƒ˜แƒ–แƒก). แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ˜แƒก แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก, แƒ—แƒฃ แƒ›แƒ”แƒขแƒ˜ แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ—, แƒ›แƒแƒจแƒ˜แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒแƒ— Travis CI แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ.

แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ—แƒแƒ•แƒกแƒ“แƒ แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒจแƒ˜ .แƒขแƒ แƒ”แƒ•แƒ˜แƒก.แƒจ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒซแƒ˜แƒ แƒจแƒ˜.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜ .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_before_install() {
  git submodule update --init --recursive
}

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒ˜แƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ— PVS-Studio-แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ–แƒ” Travis CI-แƒจแƒ˜. แƒฏแƒ”แƒ  แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒ–แƒ” แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— 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 แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒแƒก แƒ“แƒ˜แƒแƒฎ (แƒฉแƒ•แƒ”แƒœ แƒ”แƒก แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ”แƒ— แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ env build matrix-แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒก), แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ— แƒžแƒแƒ™แƒ”แƒขแƒก pvs-แƒกแƒขแƒฃแƒ“แƒ˜แƒ. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒช libio-socket-ssl-perl ะธ libnet-ssleay-perlแƒ—แƒฃแƒ›แƒชแƒ, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒคแƒแƒกแƒขแƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒก.

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ_แƒแƒ›แƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒ“แƒ แƒฎแƒกแƒœแƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒแƒ แƒฅแƒ˜แƒ•แƒก:

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

แƒ“แƒ แƒแƒ แƒ’แƒแƒ•แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒแƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜. แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ script:

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

แƒ™แƒแƒ“แƒ˜แƒก แƒแƒ› แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ— แƒกแƒ›แƒ™แƒ”แƒ˜ แƒ“แƒ แƒแƒจแƒ แƒ™แƒแƒ›แƒžแƒ˜แƒšแƒแƒชแƒ˜แƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ›แƒ”แƒขแƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ "แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— PVS-Studio Linux-แƒ–แƒ” แƒ“แƒ macOS-แƒ–แƒ”".

แƒ—แƒฃ แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’_แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ, แƒกแƒแƒ“แƒแƒช แƒ•แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ— แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ  แƒแƒœแƒแƒšแƒ˜แƒ–แƒก:

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

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒฎแƒแƒ–แƒ˜ แƒแƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒก แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ–แƒฃแƒกแƒขแƒ”แƒ— แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœแƒ•แƒ” Travis CI แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก.

แƒ›แƒ”แƒแƒ แƒ” แƒฎแƒแƒ–แƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒก. แƒ“แƒ แƒแƒจแƒ -แƒฏ แƒแƒ“แƒ’แƒ”แƒœแƒก แƒซแƒแƒคแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ“แƒ แƒแƒจแƒ -แƒš แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ, แƒ“แƒ แƒแƒจแƒ -แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒคแƒแƒ˜แƒšแƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒขแƒแƒœแƒแƒ“ แƒ“แƒ แƒ“แƒ แƒแƒจแƒแƒก -แƒ’แƒแƒ›แƒแƒ แƒ—แƒ”แƒ— แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒ•แƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒกแƒแƒชแƒ“แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“ pvs-แƒกแƒขแƒฃแƒ“แƒ˜แƒ-แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜ แƒ’แƒแƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก, แƒ แƒแƒ› แƒšแƒ˜แƒชแƒ”แƒœแƒ–แƒ˜แƒแƒก แƒ•แƒแƒ“แƒ แƒ”แƒฌแƒฃแƒ แƒ”แƒ‘แƒ. แƒแƒ›แƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒกแƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒ”แƒก แƒ“แƒ แƒแƒจแƒ.

แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ“แƒแƒฃแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒš แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฏแƒ”แƒ  แƒฃแƒœแƒ“แƒ แƒ’แƒแƒฎแƒแƒ“แƒแƒ— แƒคแƒแƒ˜แƒšแƒ˜ แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ‘แƒแƒ“แƒ˜. แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒแƒ— แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒ˜ แƒ‘แƒšแƒแƒ’-แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒ แƒ˜แƒ“แƒ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒแƒ แƒ˜แƒก html แƒคแƒแƒ˜แƒšแƒ˜.

แƒแƒ› แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜ แƒ›แƒ” แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ แƒคแƒแƒกแƒขแƒ˜แƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒคแƒแƒกแƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ.

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒคแƒแƒ˜แƒšแƒ˜ .แƒขแƒ แƒ”แƒ•แƒ˜แƒก.แƒจ:

#/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 แƒกแƒแƒชแƒแƒ•แƒจแƒ˜, แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช Travis CI แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ’แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒก build-แƒก. แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ— โ€žppssppโ€œ-แƒ–แƒ”, แƒ แƒแƒ—แƒ แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ˜แƒ“แƒ”แƒ— แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ–แƒ”:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—
แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒแƒก:

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ 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-Studio แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ: V597 แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒฌแƒแƒจแƒแƒšแƒแƒก "memset" แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ "sum" แƒ‘แƒฃแƒคแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒกแƒแƒกแƒฃแƒคแƒ—แƒแƒ•แƒ”แƒ‘แƒšแƒแƒ“. 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  :}

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜แƒ“แƒแƒœ แƒฉแƒแƒœแƒก, แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ›แƒ แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒงแƒ แƒ–แƒแƒ แƒ˜ แƒ›แƒ”แƒ›แƒกแƒ”แƒขแƒ˜. แƒ”แƒก แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ แƒฎแƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒจแƒ˜ แƒจแƒ 1 แƒ–แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒ”แƒ›แƒกแƒ”แƒขแƒ˜ แƒแƒฆแƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒ–แƒ” 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-Studio แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ: V547 แƒ’แƒแƒ›แƒแƒ—แƒฅแƒ›แƒ 'leftvol >= 0' แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒแƒšแƒ˜แƒ. sceAudio.cpp 120

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ แƒ›แƒ˜แƒแƒฅแƒชแƒ˜แƒ”แƒ— แƒกแƒฎแƒ•แƒ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒก if. แƒ™แƒแƒ“แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒงแƒ•แƒ”แƒšแƒ แƒžแƒ˜แƒ แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ leftvol > 0xFFFF || rightvol > 0xFFFF || แƒ›แƒแƒ แƒชแƒฎแƒ”แƒœแƒ vol < 0 || แƒฃแƒคแƒšแƒ”แƒ‘แƒ vol < 0 แƒงแƒแƒšแƒ‘แƒ˜ แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ›แƒแƒ แƒ—แƒแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒฎแƒ•แƒ แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก: แƒ›แƒแƒ แƒชแƒฎแƒ”แƒœแƒ vol <= 0xFFFF, rightvol <= 0xFFFF, แƒ›แƒแƒ แƒชแƒฎแƒ”แƒœแƒ แƒ›แƒแƒชแƒฃแƒšแƒแƒ‘แƒ >= 0 ะธ แƒฃแƒคแƒšแƒ”แƒ‘แƒแƒ›แƒแƒกแƒ˜แƒšแƒ”แƒ‘แƒ >= 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-Studio แƒ’แƒแƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ: V547 แƒ’แƒแƒ›แƒแƒ—แƒฅแƒ›แƒ "แƒ–แƒแƒ›แƒ == 8" แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ›แƒชแƒ“แƒแƒ แƒ˜แƒ. syn-att.c 195

แƒ”แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ ext, แƒแƒกแƒ” แƒ แƒแƒ›, แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ  แƒ”แƒฎแƒ”แƒ‘แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ แƒ˜แƒžแƒแƒ•แƒ”แƒก แƒ›แƒแƒœแƒแƒ›, แƒกแƒแƒœแƒแƒ› แƒแƒ›แƒแƒก แƒจแƒ”แƒ•แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒ“แƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ. แƒงแƒแƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒ  แƒ”แƒฎแƒ”แƒ‘แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒแƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ Travis CI-แƒกแƒ—แƒแƒœ แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒแƒก แƒ“แƒ แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒแƒ  แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ.

แƒชแƒ•แƒแƒšแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ–แƒแƒ›แƒ แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜แƒ—, แƒ—แƒฃแƒ›แƒชแƒ, แƒ˜แƒก แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ™แƒแƒ“แƒจแƒ˜, แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒแƒ›แƒ“แƒ” if, แƒ แƒแƒช, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒงแƒแƒšแƒ‘แƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ แƒแƒ“แƒ’แƒแƒœ, แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒ•แƒแƒฎแƒกแƒแƒ•แƒก, แƒ–แƒแƒ›แƒ แƒœแƒฃแƒšแƒ˜แƒก แƒขแƒแƒšแƒ˜. แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒแƒกแƒแƒช แƒแƒ–แƒ แƒ˜ แƒแƒ  แƒแƒฅแƒ•แƒก.

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒ™แƒแƒ“แƒ˜แƒก แƒคแƒ แƒแƒ’แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒแƒ•แƒขแƒแƒ แƒก แƒ“แƒแƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒ”แƒ แƒ แƒ–แƒแƒ›แƒ แƒ›แƒแƒœแƒแƒ›แƒ“แƒ”.

แƒ’แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒ

แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒฅ แƒ“แƒแƒ•แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ— แƒแƒšแƒ‘แƒแƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒ—. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒ–แƒแƒœแƒ˜แƒ PVS-Studio-แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ“แƒ”แƒ›แƒแƒœแƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒ Travis CI-แƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒ“แƒ แƒแƒ แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ แƒแƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ’แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒ. แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒฃแƒคแƒ แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ“แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒฆแƒคแƒ แƒ—แƒแƒ•แƒแƒœแƒ“แƒ”แƒ— แƒ›แƒแƒ—แƒ˜แƒ— แƒแƒฅ :).

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒกแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒก แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ˜แƒžแƒแƒ•แƒแƒ— แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒกแƒ—แƒแƒœแƒแƒ•แƒ”. แƒ—แƒฃแƒ›แƒชแƒ, แƒ”แƒ แƒ—แƒ˜ แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ  แƒ˜แƒงแƒแƒก แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒ’แƒแƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒก.

แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—

แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ’แƒแƒฃแƒ–แƒ˜แƒแƒ แƒแƒ— แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒ˜แƒœแƒ’แƒšแƒ˜แƒกแƒฃแƒ แƒ”แƒœแƒแƒ•แƒแƒœ แƒแƒฃแƒ“แƒ˜แƒขแƒแƒ แƒ˜แƒแƒก, แƒ’แƒ—แƒฎแƒแƒ•แƒ—, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜แƒก แƒ‘แƒ›แƒฃแƒšแƒ˜: แƒ›แƒแƒฅแƒกแƒ˜แƒ› แƒ–แƒ•แƒ˜แƒแƒ’แƒ˜แƒœแƒชแƒ”แƒ•แƒ˜. แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— PVS-Studio Travis CI-แƒจแƒ˜ PSP แƒกแƒแƒ—แƒแƒ›แƒแƒจแƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒก แƒ”แƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ