αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžœαž·αž—αžΆαž‚ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαžŸαžΆ C αž“αž·αž„ C++ αž“αŸ…αž›αžΎ Linux αž“αž·αž„ macOS αžŠαŸ„αž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈαž€αŸ†αžŽαŸ‚ 7.04 αž‡αž˜αŸ’αžšαžΎαžŸαžŸαžΆαž€αž›αŸ’αž”αž„αž˜αž½αž™αž”αžΆαž“αž›αŸαž…αž…αŸαž‰αž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαžšαž”αŸ€αž”αžαŸ’αž˜αžΈ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αž αž“αž·αž„αž‘αžΆαž‰αžŸαŸ†αžŽαžΎαŸ” αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„ GitHub αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ CI (Continuous Integration) αžŠαŸ‚αž›αž–αŸαž‰αž“αž·αž™αž˜αžŠαžΌαž…αž‡αžΆ Travis CI, Buddy αž“αž·αž„ AppVeyorαŸ”

αžšαž”αŸ€αž”αž–αž·αž“αž·αžαŸ’αž™αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžš

αž—αžΈαŸ” αž’αŸαžŸαŸ” αž’αŸαžŸαŸ” αžŸαŸ’αž‘αžΌαžŒαžΈαž™αŸ„ αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αŸ†αž αž»αžŸ αž“αž·αž„αž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž€αžΎαžαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„ C, C++, C# αž“αž·αž„ Java αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’ 64 αž”αŸŠαžΈαžαž“αŸ…αž›αžΎ Windows, Linux αž“αž·αž„ macOS αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚ PVS-Studio 7.04 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž… αž“αž·αž„ macOS αžšαž”αŸ€αž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαž”αŸ’αžšαž—αž–αž”αžΆαž“αž›αŸαž…αž…αŸαž‰αž˜αž€αŸ” αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαžΆαž„αžŸαž„αŸ‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš compile_commands.json. αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžαžΆαž”αž“αžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš compile_commands.json αž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž”αŸ‚αž”αž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αžαŸ’αž›αžΆαžƒαŸ’αž˜αž»αŸ†.

αž•αž„αžŠαŸ‚αžš αžšαž”αŸ€αž”αž–αž·αž“αž·αžαŸ’αž™αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžšαž½αž˜αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ αžŠαžΆαž“αžŠαžΆαž“αž“αŸƒαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„ (pvs-studio-analyzer trace)αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž–αŸαž‰αž›αŸαž‰αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž αžΎαž™αžαžΆαž˜αžŠαžΆαž“αžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž”αŸ’αžšαž˜αžΌαž›αž–αŸαžαŸŒαž˜αžΆαž“αž–αŸαž‰αž›αŸαž‰αž’αŸ†αž–αžΈαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž…αž„αž€αŸ’αžšαž„αž“αŸƒαž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αŸ”

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

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

αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš -S:

pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt

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

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

plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...

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

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

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αžŸαŸ†αžŽαžΎαž‘αžΆαž‰

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

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒ commit tree αžŠαŸ‚αž›αž˜αžΆαž“αž˜αŸ‚αž€αž–αžΈαžšαŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio

αž…αžΌαžšαž™αžΎαž„αžŸαŸ’αžšαž˜αŸƒαž˜αžΎαž›αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž“αŸ„αŸ‡αŸ” A1 αž˜αžΆαž“β€‹αž…αŸ†αž“αž½αž“β€‹αž…αŸ’αžšαžΎαž“β€‹αž‚αž½αžšαžŸαž˜β€‹αž“αŸƒβ€‹αž€αžΌαžŠβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αžšαž½αž…β€‹αž αžΎαž™αŸ” αž˜αž»αž“αž“αŸαŸ‡αž”αž“αŸ’αžαž·αž… αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžŸαžΆαžαžΆαž˜αž½αž™αž…αŸαž‰αž–αžΈαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž A1 αž“αž·αž„αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž―αž€αžŸαžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ”

αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αžαžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ A1 αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž–αžΈαžšαž‘αŸ€αžαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αŸαž‡αžΆαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαžŸαžΆαžαžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž•αž„αžŠαŸ‚αžš αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž™αžΎαž„αž˜αž·αž“αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆ មេ. αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž–αŸαž›αžœαŸαž›αžΆαž”αžΆαž“αž˜αž€αžŠαž›αŸ‹αž αžΎαž™αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ αžšαž½αž…αžšαžΆαž›αŸ‹αŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαž‘αžΆαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž”αžΆαž“αž›αŸαž…αž…αŸαž‰αž˜αž€ B3 ΠΈ A3.

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

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

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

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

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αžŸαžΆαžαžΆ αž¬αž‡αžΆαž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž₯αž‘αžΌαžœαž™αžΎαž„αžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αž―αž€αžŸαžΆαžš .pvs-pr.list (αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž›αž‘αŸ’αž’αž•αž›αžαžΆαž„αž›αžΎαž‘αŸ…αžœαžΆ) αž‘αŸ…αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αŸ–

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžœαž·αž—αžΆαž‚ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» (PVS-Studio.log) αž‘αŸ…αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αžΆαž“αŸ–

plog-converter -t errorfile PVS-Studio.log --cerr -w

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž“αžΉαž„αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„ stderr (αž›αž‘αŸ’αž’αž•αž›αžŸαžΆαžšαž€αŸ†αž αž»αžŸαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš) αŸ”

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

Travis CI

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αž‡αžΆαž―αž€αžŸαžΆαžš .travis.yml. αžŠαžΎαž˜αŸ’αž”αžΈαž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž› αžαŸ’αž‰αž»αŸ†αžŽαŸ‚αž“αžΆαŸ†αž’αŸ’αž“αž€αž±αŸ’αž™αžŠαžΆαž€αŸ‹αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŠαŸ‚αž›αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž…αŸαž‰αž–αžΈαž―αž€αžŸαžΆαžš .travis.yml (bash script_name.sh function_name).

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

install:
  - bash .travis.sh travis_install

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŽαžΆαž˜αž½αž™ αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‘αŸαžšαž–αž½αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” αžŠαŸ„αž™αžŠαž€αžŸαž αžŸαž‰αŸ’αž‰αžΆαž…αŸαž‰αŸ”

αžαŸ„αŸ‡αž”αžΎαž€αž―αž€αžŸαžΆαžš .travis.sh αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž‘αŸ…αž˜αž»αžαž„αžΆαžš travis_install():

travis_install() {
  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 
}

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž•αŸ’αž“αŸ‚αž€ αžŸαŸ’αž‚αŸ’αžšαžΈαž” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžœαž·αž—αžΆαž‚αŸ–

script:
  - bash .travis.sh travis_script

αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” bash:

travis_script() {
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

αž€αžΌαžŠαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„ αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αž“αŸ…αž›αžΎ CMakeαŸ–

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
}

αžœαžΆαž“αžΉαž„αž”αŸ’αžšαŸ‚αž‡αžΆαžŠαžΌαž…αž“αŸαŸ‡αŸ–

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
  
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžšαž½αž…αž αžΎαž™ $TRAVIS_PULL_REQUEST ΠΈ $TRAVIS_BRANCH. Travis CI αž”αŸ’αžšαž€αžΆαžŸαžŠαŸ„αž™αž―αž€αžšαžΆαž‡αŸ’αž™αŸ–

  • $TRAVIS_PULL_REQUEST αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αŸαžαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αžΆαž‰ ឬ αž˜αž·αž“αž–αž·αžαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸαŸ‡αž‡αžΆαžŸαžΆαžαžΆαž’αž˜αŸ’αž˜αžαžΆ;
  • $TRAVIS_REPO_SLUG αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
Travis CI αž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αž›αŸαžαž€αžΌαžŠαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαž€αžΆαžšαž–αŸ’αžšαž˜αžΆαž“αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž±αŸ’αž™αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ”

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž˜αžΎαž›β€‹αž²αŸ’αž™β€‹αžŠαž·αžβ€‹αžŠαž›αŸ‹β€‹αž’αŸ†αž–αžΈβ€‹αž”αž“αŸ’αž‘αžΆαžαŸ‹β€‹αž€αžΌαžŠβ€‹αž“αŸαŸ‡αŸ–

git diff --name-only origin/HEAD > .pvs-pr.list

αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆ Travis CI αž”αž‰αŸ’αž…αžΌαž›αžŸαžΆαžαžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž›αžΎαžŸαŸ†αžŽαžΎαž‘αžΆαž‰αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αžœαž·αž—αžΆαž‚ A4αž“αž·αž„αž˜αž·αž“ B3->A3. αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž‚αžŽαž“αžΆαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ A3 αŸ”αžŠαŸ‚αž›αž‡αžΆαž€αŸ†αž–αžΌαž›αž“αŸƒαžŸαžΆαžαžΆαž–αžΈ αž”αŸ’αžšαž—αž–αžŠαžΎαž˜.

αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹ - αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž“αŸƒαž―αž€αžŸαžΆαžšαž”αž‹αž˜αž€αžαžΆαž“αŸ…αž›αžΎαž―αž€αžαžΆαž”αž€αž”αŸ’αžšαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„ (*.c, *.cc, *.cpp αŸ”αž›αŸ”)αŸ” αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž‚αžŽαž“αžΆαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž–αž·αž“αž·αžαŸ’αž™αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžš αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš .PVS-Studio αŸ” Travis CI αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαžαž―αž€αžŸαžΆαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžαž―αž€αžŸαžΆαžš .PVS-Studio/:

cache:
  directories:
    - .PVS-Studio/

αž›αŸαžαž€αžΌαžŠαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš .travis.yml. αžαžαž―αž€αžŸαžΆαžšαž“αŸαŸ‡αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αŸ—αžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžœαž·αž—αžΆαž‚ αžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžš αž¬αž€αžΆαžšαžœαž·αž—αžΆαž‚αž”αž“αŸ’αžαŸ‚αž˜αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αŸαž“αŸ„αŸ‡ αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž–αž·αžαž‡αžΆαž“αžΉαž„αžœαž·αž—αžΆαž‚αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαžΆαž›αŸ‹αž–αŸαž›αŸ”

αž˜αž·αžαŸ’αž

αžŠαžΌαž… Travis CI αž˜αž·αžαŸ’αž αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž€αž“αŸ…αž›αžΎ GitHub αŸ” αž˜αž·αž“αžŠαžΌαž… Travis CI αž‘αŸ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžαžΆαž‰ (αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš bash αž˜αžΆαž“) αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸ„αŸ‡αž‘αŸαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžαŸ’αž˜αžΈαž‘αŸ…αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ†αž‘αžΎαž„αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž…αžΌαžšαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž„αžŸαž„αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αŸ” αžŸαžΌαž˜αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αž»αž„αžαžΊαž“αŸαžš docker αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸαŸ‡αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž˜αžΆαž“αž’αž»αž„αž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ GCCαŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αžŠαŸ†αž‘αžΎαž„ PVS-Studio αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αžαŸ„αŸ‡αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αž‘αžΆαžαŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’αŸ–

apt-get update && apt-get -y install wget gnupg jq

wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list

apt-get update && apt-get -y install pvs-studio

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž…αžΌαž›β€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹αž•αŸ’αž‘αžΆαŸ†αž„β€‹αžšαžαŸ‹ (αžšαžΌαž”β€‹αžαŸ†αžŽαžΆαž„β€‹αžŠαŸ†αž”αžΌαž„) αž αžΎαž™β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž€αžΌαžŠβ€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜β€‹αž‘αŸ…β€‹αžœαžΆαž›β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž“αž·αž–αž“αŸ’αž’β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž‚αŸ’αž“αžΆαŸ–

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
  PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžœαž·αž—αžΆαž‚αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαž’αžΆαž“αžŸαžΆαžαžΆαžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αžŸαŸ’αžαž·αžβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆβ€‹αž…αž·αžαŸ’αžβ€‹αžαžΆαž˜β€‹αž›αž€αŸ’αžαžαžŽαŸ’αžŒ B3 αž αžΎαž™αž™αžΎαž„αžαŸ’αžšαžΌαžœαž‘αž‘αž½αž›αž”αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαž–αžΈ A3:

PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹ A3 αžαŸ„αŸ‡αž”αŸ’αžšαžΎ GitHub APIαŸ–

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž’αžαŸαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŠαŸ‚αž› Buddy αž•αŸ’αžŠαž›αŸ‹αž±αŸ’αž™αŸ–

  • $BUDDY_EXECUTION_PULL_REQEUST_NO - αž‘αžΆαž‰αž›αŸαžαžŸαŸ’αž“αžΎαžŸαž»αŸ†;
  • $BUDDY_REPO_SLUG - αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αžƒαŸ’αž›αžΆαŸ†αž„ (αž§αž‘αžΆαž αžšαžŽαŸ αž’αžαž·αž”αžšαž˜αžΆ/αžαŸαžŸαŸ’αž)αŸ”

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž˜αž·αž“αžŠαžΌαž… Travis CI αž™αžΎαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‘αŸαŸ” .pvs-studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈ Buddy αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž…αžΌαž› αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PVS-Studio αž“αŸ…αž€αŸ’αž“αž»αž„ BuddyαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ… Pipeline αžœαž·αž‰αŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž’αžαŸαžš αž“αž·αž„αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž…αžΌαž› αž“αž·αž„αž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PVS-StudioαŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αž€αžΆαžšαž›αŸαž…αž…αŸαž‰αž“αžΌαžœαžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αžαŸ’αž˜αžΈ αž¬αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαž˜αžΆαž“αž€αŸ†αž αž»αžŸ Buddy αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αžœαžΆαž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαžŸαŸ†αžŽαžΎαž‘αžΆαž‰αŸ”

AppVeyor

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ AppVeyor αž‚αžΊαžŸαŸ’αžšαžŠαŸ€αž„αž‘αŸ…αž“αžΉαž„ Buddy αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰ αž αžΎαž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžš *.yml αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸ„αŸ‡αž‘αŸαŸ”

αžαŸ„αŸ‡αž‘αŸ…αž•αŸ’αž‘αžΆαŸ†αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αŸ–

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž…αžΌαž›β€‹αž‘αŸ…β€‹αž•αŸ’αž‘αžΆαŸ†αž„β€‹αž”αžšαž·αžŸαŸ’αžαžΆαž“ αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αžšαžΌαž”αž—αžΆαž–β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž‡αž½αž”β€‹αž”αŸ’αžšαž‡αž»αŸ† αž“αž·αž„β€‹αž’αžαŸαžšβ€‹αž”αžšαž·αžŸαŸ’αžαžΆαž“β€‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž’αžΆαž“αž•αŸ’αž“αŸ‚αž€αž˜αž»αž“αŸ— αž’αŸ’αž“αž€αž…αŸ’αž”αžΆαžŸαŸ‹αž‡αžΆαžŸαŸ’αž‚αžΆαž›αŸ‹αž’αžαŸαžšαž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡ βˆ’ PVS_KEY ΠΈ PVS_USERNAME. αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸαžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αžαžΆαž–αž½αž€αž‚αŸαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚ PVS-Studio αŸ” αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αž–αž½αž€αžœαžΆαž˜αŸ’αžαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ”

αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αžαžαž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αž·αž“αž’αŸ’αžœαžΎαž”αŸ‚αž”αž“αŸαŸ‡αž‘αŸ αž™αžΎαž„αž“αžΉαž„αžœαž·αž—αžΆαž‚αž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž―αž€αžŸαžΆαžšαž˜αž½αž™αž‚αžΌ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž›αž–αžΈαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αžˆαŸ’αž˜αŸ„αŸ‡αžαžαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž·αž‘αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸαŸ‡αŸ–

sudo apt-get update && sudo apt-get -y install jq

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 && sudo apt-get -y install pvs-studio

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

αž…αžΌαžšαž™αžΎαž„αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸƒαž€αžΌαžŠαŸ–

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
   https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
   | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

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

αž“αŸ…αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž€αŸ’αž“αž»αž„ AppVeyor αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž’αžΆαž€αž”αŸ’αž”αž€αž·αžšαž·αž™αžΆαž…αž˜αŸ’αž›αŸ‚αž€αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αŸ” αž“αŸ…αž›αžΎαžŠαŸƒαž˜αž½αž™αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαžœαž·αž—αžΆαž‚αž˜αž·αž“αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αŸαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž™αžΎαž„αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžαž /home/appveyor/projects/testcalc/ αž αžΎαž™αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž™αžΎαž„αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ /opt/appveyor/build-agent/αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆαž’αžαŸαžš $PWD αž“αž·αž™αžΆαž™αž€αž»αž αž€αž”αž“αŸ’αžαž·αž…αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αžœαžΆαžŠαŸ„αž™αžŠαŸƒ αž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžœαž·αž—αžΆαž‚αŸ”

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αžœαžΈαŸ—αž‚αžΊαžŠαžΌαž…αž–αžΈαž˜αž»αž“αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio
αž₯αž‘αžΌαžœαž–αž·αž…αžΆαžšαžŽαžΆαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO - 
  https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
  | jq -r ".base.ref"`

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

  • $APPVEYOR_PULL_REQUEST_NUMBER β€” αž‘αžΆαž‰β€‹αž›αŸαžβ€‹αžŸαŸ†αžŽαžΎ
  • $APPVEYOR_REPO_NAME - αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αžƒαŸ’αž›αžΆαŸ†αž„αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

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

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

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

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‘αžΆαž‰αžŸαŸ†αžŽαžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Travis CI, Buddy αž“αž·αž„ AppVeyor αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio

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

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

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