αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#

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

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

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™ PVS-Studio 7.08 αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαžšαžΏαž„αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸˆ

  • αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚ C# αž“αŸ…αž€αŸ’αžšαŸ„αž˜ Linux ΠΈ macOS;
  • αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Rider;
  • αžšαž”αŸ€αž”αž–αž·αž“αž·αžαŸ’αž™αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαžαŸ’αž˜αžΈαŸ”

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

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

αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž―αž€αžŸαžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‘αž„αŸ‹ --sourceFiles (-f) αž“αž·αž„αž•αŸ’αž‘αŸαžš .txt αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αž‰αŸ’αž‡αžΈαž―αž€αžŸαžΆαžšαŸ” αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

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

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αŸƒαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ

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

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž“αŸ„αŸ‡αž‚αžΊαž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αžΉαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ…αžŸαžΆαžαžΆαž˜αŸαŸ” αžŠαŸ„αž™β€‹αžŸαžΆαžšβ€‹αž™αžΎαž„β€‹αž˜αž·αž“β€‹αž…αž„αŸ‹β€‹αž”αžΆαž“β€‹αžœαžΆ αž™αžΎαž„β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž€αžΆαžšβ€‹αžœαž·αž—αžΆαž‚ αž αžΎαž™β€‹αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜β€‹αž˜αžΎαž›β€‹αž‘αŸ…β€‹αžŠαžΌαž…β€‹αž“αŸαŸ‡αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž€αžΆαžšαžœαž·αž—αžΆαž‚ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš 2 αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž‘αŸ αž™αžΎαž„αž‘αž‘αž½αž›αž™αž€αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž™αžΎαž„αž”αžŠαž·αžŸαŸαž’αžœαžΆαŸ”

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΆαžšαžŸαž“αŸ’αž™αžΆ αž“αž·αž„αž‘αžΆαž‰αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C/C++ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž’αŸ†αž–αžΈαžœαžΆ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

GitLab

GitLab αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž‡αžΈαžœαž·αž DevOps αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž”αžΎαž€αž…αŸ†αž  αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžƒαŸ’αž›αžΆαŸ†αž„αž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Git αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαž·αž‚αžΈαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαžΆαž˜αžŠαžΆαž“αž”αž‰αŸ’αž αžΆ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžš CI/CD αž“αž·αž„αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

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

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

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“ .NET Core SDK 3 αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž˜αž»αž“αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžƒαŸ’αž›αžΆαŸ†αž„ Microsoft αžŠαŸ‚αž›αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αŸ” αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžƒαŸ’αž›αžΆαŸ†αž„ Microsoft αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž•αŸ’αžŸαŸαž„αŸ—αŸ” Linux αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ”.

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

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

αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹. αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαžšαž”αŸ€αž”αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆ (αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ) αž‘αžΆαž˜αž‘αžΆαžšαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαžŸαž αž‚αŸ’αžšαžΆαžŸαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„αžšαž”αŸ€αž”αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡ αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› "សអរ" αžαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαžŸαž αž‚αŸ’αžšαžΆαžŸαŸ”

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

αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αžŠαŸ„αž™β€‹αž˜αžΆαž“β€‹αž€αŸ’αž”αž½αž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž€αžΆαžšαž„αžΆαžšβ€‹αž“αŸ…β€‹αž…αŸ†αž–αŸ„αŸ‡β€‹αž˜αž»αžβ€‹αž’αŸ’αž“αž€ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αž“αŸ’αžβ€‹αž‘αŸ…β€‹αžŸαžšαžŸαŸαžšβ€‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”β€‹αž”αžΆαž“αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž―αž€αžŸαžΆαžš .gitlab-ci.yml αž¬αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž˜αž·αž“αž˜αžΆαž“αž‘αŸ αž”αž„αŸ’αž€αžΎαžαžœαžΆαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžœαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž»αž…αž›αžΎαžˆαŸ’αž˜αŸ„αŸ‡αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ -> αžŠαŸ†αž‘αžΎαž„ CI/CD.

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

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - 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-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

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

αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αŸ–

  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžƒαŸ’αž›αžΆαŸ†αž„ PVS-Studio αž“αž·αž„αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αŸ–

  - 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-dotnet

αž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαŸ–

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

$PVS_KEY - αž›αŸαžβ€‹αž€αžΌβ€‹αžβ€‹αž‘αŸ†αž“αž·αž‰αŸ”

αž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž› $CI_PROJECT_DIR - αž•αŸ’αž›αžΌαžœαž–αŸαž‰αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž‚αž˜αŸ’αžšαŸ„αž„αŸ–

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž αžΎαž™αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰ (αž§αž‘αžΆαž αžšαžŽαŸ αž€αž‰αŸ’αž…αž”αŸ‹ NuGet αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž‘αžΆαž‰αž™αž€)αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαžŠαŸ„αž™αž…αž»αž… αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹, αž“αž·αž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ - αž“αŸ…αž›αžΎ CI/CD.

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžœαž·αž—αžΆαž‚αŸ” αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž…αžΌαžšαž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž–αŸαž‰αž›αŸαž‰αŸ” αžŠαž›αŸ‹αž‘αž„αŸ‹αž‡αžΆαžαž· -t αž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αŸ…αž‘αž„αŸ‹ -o αžŸαžšαžŸαŸαžšαž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαŸ” αž™αžΎαž„αž€αŸαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αžΉαž„αž›αŸαžαž€αžΌαžŠαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αžŠαŸ‚αžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž™αžΎαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαž€αžΆαžšαž”αž‰αŸ’αžˆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž›αŸαžαž€αžΌαžŠαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž€αžΆαžšαž–αŸ’αžšαž˜αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž€αŸ†αž‘αž»αž„αž–αŸαž›αžœαž·αž—αžΆαž‚αŸ” αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αŸ†αžŽαŸ‚αž€αž“αŸαŸ‡αž˜αžΎαž›αž‘αŸ…αŸ–

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž›αžΎβ€‹αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ bitmaskαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž€αžΆαžšαžœαž·αž—αžΆαž‚β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž–αžΈβ€‹αž€αžΆαžšαž–αŸ’αžšαž˜αžΆαž“ αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž“αžΉαž„β€‹αž˜αžΆαž“ 8αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽβ€‹αž•αž»αžαž€αŸ†αžŽαžαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αžšαž™αŸˆαž–αŸαž›β€‹αž˜αž½αž™αžαŸ‚ αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž“αžΉαž„β€‹αž˜αžΆαž“ 4αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž€αžΆαžšαžœαž·αž—αžΆαž‚β€‹αžšαž€αžƒαžΎαž‰β€‹αž€αŸ†αž αž»αžŸ αž αžΎαž™β€‹αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽβ€‹αž•αž»αžαž€αŸ†αžŽαžαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αžšαž™αŸˆαž–αŸαž›β€‹αž˜αž½αž™αžαŸ‚ αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž“αžΉαž„β€‹αž˜αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž‘αžΆαŸ†αž„αž–αžΈαžšαŸ– αž”αžΌαž€β€‹αž›αŸαžβ€‹αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‘αž‘αž½αž›αž”αžΆαž“β€‹αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™β€”8 + 4 = 12αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŠαŸ„αž™β€‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™β€‹αž”αŸŠαžΈαžβ€‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆ αž’αŸ’αž“αž€αž’αžΆαž…β€‹αž‘αž‘αž½αž›αž”αžΆαž“β€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αž’αŸ†αž–αžΈβ€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αž•αŸ’αžŸαŸαž„αŸ—β€‹αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›β€‹αžœαž·αž—αžΆαž‚αŸ” αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αžαŸ’αžšαžΌαžœαž”αžΆαž“β€‹αž–αž·αž–αžŽαŸŒαž“αžΆβ€‹αž›αž˜αŸ’αž’αž·αžβ€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž“αŸ…αž€αŸ’αž“αž»αž„β€‹αž•αŸ’αž“αŸ‚αž€ "αž€αžΌαžŠβ€‹αžαŸ’αžšαž‘αž”αŸ‹ pvs-studio-dotnet"αŸ”Linux / macOS) "αž―αž€αžŸαžΆαžš"αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‚αž˜αŸ’αžšαŸ„αž„ Visual Studio / MSBuild / .NET Core αž–αžΈαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio".

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

  - exit_code=$((($exit_code & 8)/8))

αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“ 1 αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž›αŸαžαž€αžΌαžŠαžαŸ’αžšαž‘αž”αŸ‹αž˜αžΆαž“αž”αŸŠαžΈαžαž“αŸƒαž›αŸαžαžŠαŸ‚αž›αž™αžΎαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“ 0 αŸ”

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

merge:
  script:
  only:
  - merge_requests

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

  - git fetch origin

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αžŸαžΆαžαžΆαž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αž‘αŸ’αž’αž•αž›αž“αŸ…αž€αŸ’αž“αž»αž„ txt αž―αž€αžŸαžΆαžšαŸ–

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆ $CI_COMMIT_SHA - αžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

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

  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

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

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž”αž˜αŸ’αž›αŸ‚αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž™αžΎαž„αž”αŸ’αžšαžΎαžŸαŸ’αž›αžΆαž€ after_script αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž˜αŸ’αž›αŸ‚αž„ plog:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž˜αŸ’αž›αŸ‚αž„ plog αž‚αžΊαž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ†αž”αŸ’αž›αŸ‚αž„αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž€αŸ†αž αž»αžŸαž‰αŸ‚αž€αž‘αŸ…αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹αž•αŸ’αžŸαŸαž„αŸ—αžŠαžΌαž…αž‡αžΆ HTML αž‡αžΆαžŠαžΎαž˜αŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžšαž„ "αž§αž”αž€αžšαžŽαŸαž”αŸ†αž”αŸ’αž›αŸ‚αž„ Plog" αž•αŸ’αž“αŸ‚αž€αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αŸƒαž―αž€αžŸαžΆαžš.

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

αžŠαžΎαž˜αŸ’αž”αžΈαž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‚αžΊαž“αŸ…αž‘αžΈαž“αŸαŸ‡ .gitlab-ci.yml αž–αŸαž‰αŸ–

image: debian

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - 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-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  
after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‘αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžŸαžΌαž˜αž…αž»αž…αž›αžΎ αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš. αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž˜αžΎαž›β€‹αžαžΆβ€‹αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αž‚αžΊβ€‹αžαŸ’αžšαžΌαžœβ€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹ αžŸαŸŠαžΈαž’αžΆαž™ / ស៊ីឌី -> αž”αŸ†αž–αž„αŸ‹ -> αž€αžΆαžšαžšαžαŸ‹. αž”αž„αŸ’αž’αž½αž…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž“αžΉαž„αž”αžΎαž€ αžŠαŸ‚αž›αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
ស αž€αžΆαžšαž„αžΆαžšαž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™ - αž‡αŸ„αž‚αž‡αŸαž™αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž›αŸ’αž’αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžΆαž€αž›αŸ’αž”αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΆαž“αž’αŸ’αžœαžΎαŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž„αžΆαžš

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

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

αž…αžΌαžšαž“αž·αž™αžΆαž™αžαžΆαž˜αžΆαž“αž―αž€αžŸαžΆαžšαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž˜αŸ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ.csαžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž€αžΌαžŠαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž αžΎαž™αž…αž„αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ” αžαžΎβ€‹αž€αŸ†αž αž»αžŸβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž‚αžΆαžαŸ‹β€‹αž’αŸ’αžœαžΎβ€‹αž˜αž·αž“β€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αž“αŸ„αŸ‡β€‹αž‘αŸ αžšαžΏαž„β€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αž‚αžΊβ€‹αžœαžΆβ€‹αž˜αžΆαž“αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαž—αŸ’αž›αŸαž… αž”αŸ„αŸ‡ (αž”αžΆαž‘! ខុស):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž™αžΎαž„αžƒαžΎαž‰αžαžΆαž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž€αŸ†αž αž»αžŸαž˜αž½αž™ αž“αž·αž„αž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαžŸαžΆαžαžΆαŸ”

αžαŸ„αŸ‡αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ” αž€αžΆαžšαž€αŸ‚αž€αžΌαžŠαŸ–

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

αž”αž‰αŸ’αž…αžΌαž›αž›αž‘αŸ’αž’αž•αž›αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŸαŸ†αžŽαžΎαŸ–

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

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

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

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

αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#
αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž‘αžŸαŸ’αžŸαž“αž·αž€αž‡αž“αžŠαŸ‚αž›αž“αž·αž™αžΆαž™αž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ αžŸαžΌαž˜αž”αŸ’αžšαžΎαžαŸ†αžŽαž”αž€αž”αŸ’αžšαŸ‚αŸ– Nikolay Mironov αŸ” αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŠαŸ„αž™αž”αŸ’αžšαžΎ PVS-Studio αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ C#.

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

αž‘αž·αž‰αž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž€αžΆαžšαž–αžΆαžš DDoS, αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ VPS VDS πŸ”₯ αž‘αž·αž‰αžŸαŸαžœαžΆαž”αž„αŸ’αž αŸ„αŸ‡αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αžΆαžšαž–αžΆαžš DDoS αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ VPS VDS | ProHoster