αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP

αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP
Travis CI αž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αžŽαŸ’αžαžΆαž‰αž…αŸ‚αž€αž…αžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αŸ’αžšαžΎ GitHub αž‡αžΆαž”αŸ’αžšαž—αž–αž€αžΌαžŠαž”αž„αŸ’αž αŸ„αŸ‡αŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαžΆαž„αž›αžΎ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž’αžšαž‚αž»αžŽαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž…αŸ†αž–αŸ„αŸ‡αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Travis CI αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ PVS-Studio αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠ PPSSPP αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

Travis CI αž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ„αž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

PPSSPP - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž αŸ’αž‚αŸαž˜αžŽαžΆαž˜αž½αž™αž–αžΈαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Sony PSP αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž“αŸ…αžαŸ’αž„αŸƒαž‘αžΈ 1 αžαŸ‚αžœαž·αž…αŸ’αž†αž·αž€αžΆαž†αŸ’αž“αžΆαŸ† 2012 αŸ” PPSSPP αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαž€αŸ’αžšαŸ„αž˜ GPL v2. αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ‚αž›αž˜αŸ’αž’ αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž‚αž˜αŸ’αžšαŸ„αž„.

αž—αžΈαŸ” αž’αŸαžŸαŸ” αž’αŸαžŸαŸ” αžŸαŸ’αž‘αžΌαžŒαžΈαž™αŸ„ - αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž€αžΌαžŠαž‹αž·αžαž·αžœαž“αŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αŸ†αž αž»αžŸ αž“αž·αž„αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž€αžΎαžαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž™αžΎαž„αž“αžΉαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš PVS-Studio αž˜αž·αž“αž˜αŸ‚αž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€ αž αžΎαž™αžšαž€αž˜αžΎαž›αž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„ PPSSPPαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Travis CI

αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžƒαŸ’αž›αžΆαŸ†αž„αž˜αž½αž™αž“αŸ…αž›αžΎ GitHub αžŠαŸ‚αž›αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… αž€αŸαžŠαžΌαž…αž‡αžΆαž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PVS-Studio (αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“ αž‚αž“αŸ’αž›αžΉαŸ‡αžŸαžΆαž€αž›αŸ’αž”αž„ ឬ αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž ).

αžαŸ„αŸ‡αž‘αŸ…αž‚αŸαž αž‘αŸ†αž–αŸαžš Travis CI. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αžŽαž“αžΈ GitHub αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αž”αž‰αŸ’αž‡αžΈαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αŸ–

αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP
αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αžαŸαžŸαŸ’αžŠβ€‹αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αŸ†αž”αŸ‚αž€β€‹αž€αŸ’αžšαž»αž˜ PPSSPP αŸ”

αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžƒαŸ’αž›αžΆαŸ†αž„αžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αž”αŸ’αžšαž˜αžΌαž›αŸ–

αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP
αž“αŸ…αž–αŸαž›αž“αŸαŸ‡ Travis CI αž˜αž·αž“αž’αžΆαž…αžŸαžΆαž„αžŸαž„αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαž“αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αžŠαž›αŸ‹β€‹αž–αŸαž›β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž αžΎαž™αŸ”

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚ αž’αžαŸαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„ αž§αž‘αžΆαž αžšαžŽαŸ αž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PVS-Studio αžŠαŸ‚αž›αž˜αž·αž“αž…αž„αŸ‹αž”αžΆαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αžŸαžΌαž˜β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž’αžαŸαžšβ€‹αž”αžšαž·αžŸαŸ’αžαžΆαž“β€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αž€αžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αžŸαŸ’αžαžΆαž”αž“αžΆβ€‹αž€αŸ’αž“αž»αž„ Travis CIαŸ–

αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ 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

αž”αž“αŸ’αžαž·αž…αž‘αŸ€αžαž’αŸ†αž–αžΈαž•αŸ’αž“αŸ‚αž€ αž˜αŸ‰αžΆαž‘αŸ’αžšαžΈαžŸ. αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αž˜αžΆαž“αžœαž·αž’αžΈαž–αžΈαžšαž™αŸ‰αžΆαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž‡αž˜αŸ’αžšαžΎαžŸαžŸαžΆαž„αžŸαž„αŸ‹αŸ– αž‘αžΈαž˜αž½αž™αž‚αžΊαžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž”αž‰αŸ’αž‡αžΈαž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„ αž”αŸ’αžšαž—αŸαž‘αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ”αž›αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž˜αŸ‰αžΆαž‘αŸ’αžšαžΈαžŸαž“αŸƒαž”αž“αŸ’αžŸαŸ†αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ” αž‘αžΈαž–αžΈαžšαž‚αžΊαž‡αžΆαž€αžΆαžšαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αž“αŸƒαž˜αŸ‰αžΆαž‘αŸ’αžšαžΈαžŸαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αžšαžŽαžΈαž–αž·αžŸαŸαžŸαž˜αž½αž™ αž¬αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž˜αž·αž“αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž•αŸ’αž“αŸ‚αž€ αžŠαž€αž…αŸαž‰. αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžšαžΏαž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ αž―αž€αžŸαžΆαžš 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αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž›αžΎαŸ” αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ αžŸαŸ’αž‚αŸ’αžšαžΈαž”. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αŸ’αž’ αž“αŸ„αŸ‡αž™αžΎαž„αžšαž€αžƒαžΎαž‰αžαŸ’αž›αž½αž“αž―αž„ after_success (αžœαžΆαž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αž)αŸ” αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž€αŸ‚αž”αŸ’αžšαŸ‚αž”αžΆαž“αž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž› αž―αž€αžŸαžΆαžš Travis CI.

αžŠαžΎαž˜αŸ’αž”αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αžΆαž“ αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ .travis.shαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž“αŸ…αž«αžŸαž‚αž˜αŸ’αžšαŸ„αž„αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αž―αž€αžŸαžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ .travis.yml:

language: cpp
dist: xenial

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

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

before_install:
  - travis_retry bash .travis.sh travis_before_install

install:
  - travis_retry bash .travis.sh travis_install

script:
  - bash .travis.sh travis_script

after_success:
  - bash .travis.sh travis_after_success

αž˜αž»αž“αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž˜αŸ‰αžΌαžŒαž»αž›αžšαž„αŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αžŸαžΆαž„ PPSSPP αŸ” αžαŸ„αŸ‡αž”αž“αŸ’αžαŸ‚αž˜αž˜αž»αžαž„αžΆαžšαž‘αžΈαž˜αž½αž™αž‘αŸ… .travis.sh (αž…αŸ†αžŽαžΆαŸ†αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜)αŸ–

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

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αž€αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒ 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 αž€αŸ†αž‘αž»αž„αž–αŸαž›αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αŸ‰αžΆαž‘αŸ’αžšαžΈαžŸ) αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ pvs-studio. αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž“αŸαŸ‡ αž€αž‰αŸ’αž…αž”αŸ‹αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž•αž„αžŠαŸ‚αžšαŸ” libio-socket-ssl-perl ΠΈ libnet-ssleay-perlαž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αž‘αŸ’αž’αž•αž›αž•αŸ’αž‰αžΎαžαžΆαž˜αž”αŸ’αžšαŸƒαžŸαžŽαžΈαž™αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αž‚αŸαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž˜αž»αžαž„αžΆαžš αž‘αžΆαž‰αž™αž€_αžŠαž€αžŸαŸ’αžšαž„αŸ‹ скачиваСт ΠΈ распаковываСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ²:

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

αžœαžΆαžŠαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαŸ” αžœαžΆαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ αžŸαŸ’αž‚αŸ’αžšαžΈαž”:

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

αžαžΆαž˜αž–αž·αžαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αžŸαžΆαž˜αž‰αŸ’αž‰ αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ–

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

αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αžΌαžŠαž“αŸαŸ‡αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ ស៊ីខេ αž‘αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž“αžΆαŸ†αž…αŸαž‰αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αž„αž€αŸ’αžšαž„αŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž€αžΌαžŠαž‹αž·αžαž·αžœαž“αŸ’αžαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžšαžΏαž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘ "αžšαž”αŸ€αž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš PVS-Studio αž“αŸ…αž›αžΎ Linux αž“αž·αž„ macOS"αŸ”

αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž€αžΆαžšβ€‹αž‡αž½αž”β€‹αž‡αž»αŸ†β€‹αž“αŸαŸ‡β€‹αž”αžΆαž“β€‹αž‡αŸ„αž‚αž‡αŸαž™ αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž‘αŸ…β€‹αžŠαž›αŸ‹ after_successαžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαŸ–

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 αŸ”

αž‡αž½αžšαž‘αžΈαž–αžΈαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αŸ” αž‘αž„αŸ‹αž‡αžΆαžαž· -j αž€αŸ†αžŽαžαŸ‹αž…αŸ†αž“αž½αž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚ αž‘αž„αŸ‹ -l αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽ, αž‘αž„αŸ‹ -o αž€αŸ†αžŽαžαŸ‹β€‹αž―αž€αžŸαžΆαžšβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž›αž‘αŸ’αž’αž•αž›β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž αŸαžαž» αž“αž·αž„β€‹αž‘αž„αŸ‹ - αž”αž·αž‘αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽ αž‘αžΆαž˜αž‘αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αžŸαžΆαž€αž›αŸ’αž”αž„ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ pvs-studio-αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚ αž“αžΉαž„αž–αŸ’αžšαž˜αžΆαž“αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαžΆαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαž‡αž·αžαž•αž»αžαž€αŸ†αžŽαžαŸ‹αž αžΎαž™αŸ” αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž€αžΆαžšαž–αžΆαžšβ€‹αž€αž»αŸ†β€‹αž±αŸ’αž™β€‹αžœαžΆβ€‹αž€αžΎαžαž‘αžΎαž„ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž‘αž„αŸ‹αž‡αžΆαžαž·β€‹αž“αŸαŸ‡αŸ”

αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž˜αžΆαž“αž›αž‘αŸ’αž’αž•αž›αž†αŸ…αžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž’αŸ’αžœαžΎαž±αŸ’αž™αž―αž€αžŸαžΆαžšαž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αŸ” αžαŸ„αŸ‡αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž˜αŸ’αž›αŸ‚αž„ plogαž αžΎαž™αž›αž‘αŸ’αž’αž•αž›αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš 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 αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ Travis CI αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ” αž…αž»αž…αž›αžΎ "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' αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž›αž»αž”αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ 'αž•αž›αž”αžΌαž€' αŸ” αž’αž“αž»αž‚αž˜αž“αŸ RtlSecureZeroMemory() αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž›αž»αž”αž‘αž·αž“αŸ’αž“αž“αŸαž™αž―αž€αž‡αž“αŸ” sha1.cpp ៣្αŸ₯

αž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž€αžΌαžŠαž“αŸαŸ‡αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΌαžŒαž»αž› hashing αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž˜αžΆαž“αž€αŸ†αž αž»αžŸαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžš (CWE-14). Рассмотрим ассСмблСрный листинг, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гСнСрируСтся ΠΏΡ€ΠΈ компиляции Debug-вСрсии:

; 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 αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž αŸ… αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆ αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž™αŸ„αž„αž‘αŸ…αž›αžΎαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αŸ€αžαž‘αŸ 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 ៑្០

αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‘αŸ…αžŸαžΆαžαžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αž”αžΌαž„ if. αž›αŸαžαž€αžΌαžŠαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž˜αžΆαž“αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || αžŸαŸ’αžαžΆαŸ†αžœαŸ‰αž»αž› < 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. αžαžΎβ€‹αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αž‚αž·αžβ€‹αžαžΆβ€‹αžœαžΆβ€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αŸ‚αž€β€‹αž‘αŸβ€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž˜αžΎαž›β€‹αžαžΆβ€‹αžαžΎβ€‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“β€‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœβ€‹αž¬β€‹αž‘αŸ? αž‘αž·αž“αŸ’αž“αž“αŸαž™ psmfXNUMX αžŠαž„? αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž…αž˜αŸ’αž›αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†... αžαžΆαž˜αž–αž·αž αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαžœαžΆαž™αžαž»αžŸ αž αžΎαž™αž‚αŸ†αž“αž·αžαž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αž‰αŸ’αž…αžΌαž›αž‘αžΆαŸ†αž„αž–αžΈαžšαŸ”

αž‡αž˜αŸ’αžšαžΎαžŸαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ–

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 αž€αž“αŸ’αžŸαŸ„αž˜ 'size == 8' αžαŸ‚αž„αžαŸ‚αž˜αž·αž“αž–αž·αžαŸ” syn-att.c ៑៩αŸ₯

αž€αŸ†αž αž»αžŸαž“αŸαŸ‡αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš αž›αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž·αžαž‡αžΆαž˜αž·αž“αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž‘αŸ…αž“αžΉαž„αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰ αž˜αž»αž“αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžœαžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž‘αž»αž€αžœαžΆαž…αŸ„αž›αŸ” αž™αŸ‰αžΆαž„αžŽαžΆαž˜αž·αž‰ αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž€αŸ†αž αž»αžŸαž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ Travis CI αž αžΎαž™αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‘αŸαŸ”

ធថេរ αž‘αŸ†αž αŸ† αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αžαŸαžšαž˜αž½αž™ αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠ αžŸαž·αž‘αŸ’αž’αž·αž…αž»αŸ‡αž‘αŸ…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš ifαžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ αž˜αž·αž“αž–αž·αž αž–αŸαž›αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž›αž€αŸ’αžαžαžŽαŸ’αžŒ αž–αŸ’αžšαŸ„αŸ‡αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž…αž„αž…αžΆαŸ† αž‘αŸ†αž αŸ† αžŸαŸ’αž˜αžΎαž“αžΉαž„αžŸαžΌαž“αŸ’αž™αŸ” αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž€αŸαž‚αŸ’αž˜αžΆαž“αž“αŸαž™αžŠαŸ‚αžšαŸ”

αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž“αŸƒαž”αŸ†αžŽαŸ‚αž€αž€αžΌαžŠαž—αŸ’αž›αŸαž…αžŸαžšαžŸαŸαžšαž‡αžΆαž“αŸ‹αž›αžΎαž’αžαŸαžš αž‘αŸ†αž αŸ† αž˜αž»αž“β€‹αž–αŸαž›αž“αŸ„αŸ‡αŸ”

αž”αž‰αŸ’αžˆαž”αŸ‹

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž“αžΉαž„αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αŸ†αž αž»αžŸαŸ” αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹ PVS-Studio αžšαž½αž˜αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ Travis CI αž“αž·αž„αž˜αž·αž“αžœαž·αž—αžΆαž‚αž‚αž˜αŸ’αžšαŸ„αž„αž±αŸ’αž™αž”αžΆαž“αž αŸ’αž˜αžαŸ‹αž…αžαŸ‹αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“αž€αŸ†αž αž»αžŸαž’αŸ† αž“αž·αž„αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαž‡αžΆαž„αž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ‚αž„αžαŸ‚αž’αžΆαž…αžŸαžšαžŸαžΎαžšαž–αž½αž€αž‚αŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ :) αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αž“αŸ’αžαŸ‚αž˜αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αž‰αŸ’αž αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠαŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αž½αž™αž’αžΆαž…αž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžšαž½αž˜αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαž“αžΉαž„αž’αŸ’αžœαžΎαž’αŸ„αž™αž‚αž»αžŽαž—αžΆαž–αž“αŸƒαž€αžΌαžŠαž˜αžΆαž“αž—αžΆαž–αž”αŸ’αžšαžŸαžΎαžšαž‘αžΎαž„αŸ”

αžαŸ†αžŽαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ

αžšαž”αŸ€αž”αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž‘αžŸαŸ’αžŸαž“αž·αž€αž‡αž“αžŠαŸ‚αž›αž“αž·αž™αžΆαž™αž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ αžŸαžΌαž˜αž”αŸ’αžšαžΎαžαŸ†αžŽαž”αž€αž”αŸ’αžšαŸ‚αŸ– Maxim Zvyagintsev αŸ” αžšαž”αŸ€αž”αžŠαŸ†αž‘αžΎαž„ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αž»αž„αžŸαžΌαž›αž αŸ’αž‚αŸαž˜ PSP.

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹