
Π Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° PVS-Studio Π·Π° Π΅Π·ΠΈΡΠΈ C ΠΈ C++ Π½Π° Linux ΠΈ macOS, ΠΎΡ Π²Π΅ΡΡΠΈΡ 7.04, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΡΡΠΎΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠΏΠΈΡΡΠΊΡΡ Π½Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½ΠΎΠ²ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΈ pull request-ΠΎΠ²Π΅. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² GitHub Π² ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ CI (Continuous Integration) ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΊΠ°ΡΠΎ Travis CI, Buddy ΠΈ AppVeyor.
Π Π΅ΠΆΠΈΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΡΠΈ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
β ΡΠΎΠ²Π° Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π·ΠΈΡΠΈΡΠ΅ C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡΠΈ Π² 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° Windows, Linux ΠΈ macOS.
Π Π²Π΅ΡΡΠΈΡ PVS-Studio 7.04 Π·Π° Linux ΠΈ macOS ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠΈΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ» . Π’ΠΎΠΉ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠΊΠΎ Π²Π°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ» compile_commands.json, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° .
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ΠΆΠΈΠΌΡΡ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Ρ Π»ΠΎΠ³ Π½Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ strace Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° (pvs-studio-analyzer trace). ΠΠ° ΡΠ΅Π»ΡΠ° ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠ»Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° Ρ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΠ΅, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ ΠΏΡΠ»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ±Π°ΡΠ΅, ΡΠΎΠ·ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΠΌΠ° ΡΡΡΠ΅ΡΡΠ²Π΅Π½ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ β ΡΠ΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ»Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ° Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈ Π½Π° ΠΈΠ΄Π΅ΡΡΠ° Π·Π° Π±ΡΡΠ·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡ. ΠΠ»ΠΈ, Π°ΠΊΠΎ ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°ΡΠ°, ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π΅ΠΏΡΠ»Π½ΠΈ, Π°ΠΊΠΎ ΡΠ»Π΅Π΄ ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ Π² Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π±ΡΠ΄Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π½ΠΎΠ² #include).
ΠΠ°ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ Π»ΠΎΠ³ Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ ΠΈΠ»ΠΈ pull request-ΠΎΠ²Π΅. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠ°, ΠΎΠ±ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° .
Π‘ΠΏΠΈΡΡΠΊΡΡ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π° Π² ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txtΠ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΈ ΠΏΡΡΠΈΡΠ° ΠΊΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΡΠ°ΠΉΠ» ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π½Π° Π½ΠΎΠ² ΡΠ΅Π΄. ΠΠΎΠΏΡΡΡΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ Π½Π΅ ΡΠ°ΠΌΠΎ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, Π½ΠΎ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ. ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ΅ Π²ΠΈΠ΄ΠΈ, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ° ΡΠ΅Π΄Π°. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, Π°ΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ ΡΡΡΠ½ΠΎ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ΅ΡΡΠΎ ΡΠΏΠΈΡΡΠΊΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π² CI, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠΌΠΈΡ ΠΈΠ»ΠΈ pull request.
Π‘Π΅Π³Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π½ΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠ»ΠΎΠ½ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π° ΡΠ΅Π°Π³ΠΈΡΠ° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, Π² ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° plog-converter Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ βindicate-warnings:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...Π‘ ΡΠΎΠ·ΠΈ ΡΠ»Π°Π³ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΡΡ ΡΠ΅ Π²ΡΡΠ½Π΅ Π½Π΅Π½ΡΠ»Π΅Π² ΠΊΠΎΠ΄, Π°ΠΊΠΎ Π² ΠΎΡΡΠ΅ΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΏΡΠΈΡΡΡΡΠ²Π°Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ. ΠΠΎ ΠΊΠΎΠ΄Π° Π½Π° Π²ΡΡΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ ΠΏΡΠ΅ΠΊΠΎΠΌΠΈΡΠΈΠ²Π½ΠΈΡ Ρ ΡΠΊ, ΠΊΠΎΠΌΠΈΡ ΠΈΠ»ΠΈ pull request, Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΡ ΠΎΡΡΠ΅Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° Π΅ΠΊΡΠ°Π½Π°, ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅ΠΉΠ».
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° ΡΠΏΠΈΡΡΠΊΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ°ΠΉΠ» ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΡ Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° C ΠΈ C++ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ°ΠΉΠ»ΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ ΠΈ ΡΠΎΠΉ ΡΠ΅ ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΈΡΠΈΡΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ», Π° Π½Π΅ ΠΎΠ±Π΅ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ±ΡΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request
ΠΠ½Π°Π»ΠΈΠ·ΡΡ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΡΠ½Π΅ΠΌΠ° Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅, Π·Π°ΡΠΎΠ²Π° ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠ΅ ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠ΄Π΅Π»ΠΈΡΠ΅ Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° Π΄ΡΡΠ²ΠΎ ΠΎΡ ΠΊΠΎΠΌΠΈΡΠΈ Ρ Π΄Π²Π΅ ΠΊΠ»ΠΎΠ½Π°:

ΠΠ΅ΠΊΠ° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΠ΅ ΠΊΠΎΠΌΠΈΡΡΡ A1 ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½. ΠΠ°Π»ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ ΠΎΡ ΠΊΠΎΠΌΠΈΡΠ° A1 ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΌΠ΅ Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ ΡΠ΅, ΡΠ΅ ΡΠ»Π΅Π΄ A1 ΡΠ΅ ΡΠ»ΡΡΠΈΡ Π° ΠΎΡΠ΅ Π΄Π²Π° ΠΊΠΎΠΌΠΈΡΠ°, Π½ΠΎ ΡΠΎΠ²Π° Π±ΡΡ Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π½Π°Π»ΠΈ Π½Π΅ ΠΊΠΎΠΌΠΈΡΠΈΠΌ Π² master. Π Π΅ΡΠΎ, Π²ΡΠ΅ΠΌΠ΅ Π΅, ΠΊΠΎΠ³Π°ΡΠΎ hotfix Π³ΠΎΡΠΎΠ²ΠΎ. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ pull request Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ B3 ΠΈ A3.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠ΅Π»ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΡΡΡ Π½ΠΎΡΠΎ ΡΠ»ΠΈΠ²Π°Π½Π΅, Π½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π΄Π° Π½Π΅ Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡΠ΅.
ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, ΠΊΠ°ΡΠΎ ΡΠΌΠ΅ Π² HEAD ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ»Π΅Π΅ΠΌ Π² master:
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Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΉΠ»a Ρ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ (PVS-Studio.log) Π² ΡΠ΄ΠΎΠ±Π΅Π½ Π·Π° Π²ΡΠ·ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ ΡΠΎΡΠΌΠ°Ρ:
plog-converter -t errorfile PVS-Studio.log --cerr -wΠ’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ ΡΠΏΠΈΡΡΠΊ Ρ Π³ΡΠ΅ΡΠΊΠΈ Π² (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊ Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ).
ΠΠΎ Π½ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅, Π½ΠΎ ΠΈ Π΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΠΈΠΌ Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ°ΡΠΎΠ²Π° Π² ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠ° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ -W (βindicate-warnings). ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄ΠΎΡΠΈ Π½Π° Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΊΠΎΠ΄ΡΡ Π·Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° plog-converter ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π° 2, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠΈ CI ΡΠ΅ΡΠ²ΠΈΡΠ° Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° pull request.
Travis CI
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½Π° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΠ» .travis.yml. ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π²ΡΠΈΡΠΊΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·Π½Π΅ΡΠ΅Π½ΠΎ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ bash-ΡΠΊΡΠΈΠΏΡ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈ ΠΎΡ ΡΠ°ΠΉΠ»Π° .travis.yml (bash ΠΈΠΌΠ΅_ΡΠΊΡΠΈΠΏΡΠ°.sh ΠΈΠΌΠ΅_ΡΡΠ½ΠΊΡΠΈΡ).
Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΊΠΎΠ΄ Π² ΡΠΊΡΠΈΠΏΡΠ° Π½Π° bash, ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. Π ΡΠ΅ΠΊΡΠΈΡΡΠ° install ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
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 ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°:
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 ΡΡΠ΄ΡΡΠΆΠ° Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° pull request-Π° ΠΈΠ»ΠΈ false, Π°ΠΊΠΎ ΡΠΎΠ²Π° Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° ΠΊΠ»ΠΎΠ½ΠΊΠ°;
- $TRAVIS_REPO_SLUG ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ»Π³ΠΎΡΠΈΡΡΠΌΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ:

Travis CI ΡΠ΅Π°Π³ΠΈΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ Π½Π°ΠΊΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ° ΠΊΠΎΠΌΠΈΡΠ° ΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π³ΡΠ΅ΡΠΊΠΈ.
Π ΡΠ΅Π³Π°, Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·ΠΈ ΡΠ΅Π΄ΠΈΡΠ° ΠΊΠΎΠ΄:
git diff --name-only origin/HEAD > .pvs-pr.listΠ€Π°ΠΊΡ Π΅, ΡΠ΅ Travis CI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

ΠΠ°ΡΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ A4, Π° Π½Π΅ B3->A3. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Ρ A3, ΠΊΠΎΠΉΡΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Π²ΡΡΡ
Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ origin.
ΠΡΡΠ°Π½Π° Π΅Π΄ΠΈΠ½ Π²Π°ΠΆΠ΅Π½ Π΄Π΅ΡΠ°ΠΉΠ» β ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π½Π° ΡΡΠ°Π½ΡΠ»Π°ΡΠΈΡ (*.c, *.cc, *.cpp ΠΈ Ρ.Π½.). Π’Π΅Π·ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΈ Π·Π°ΠΏΠ°Π·Π²Π° Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ .PVS-Studio. Travis CI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° .PVS-Studio/:
cache:
directories:
- .PVS-Studio/Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° .travis.yml. Π’Π°Π·ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΠ±ΡΠ°Π½ΠΈ ΡΠ»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΠΈΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΡΠΊΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈΠ»ΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·. ΠΠΊΠΎ Π½Π΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ.
Buddy
ΠΠ°ΠΊΡΠΎ ΠΈ Travis CI, ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½ΠΈ Π² GitHub. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Travis CI, ΡΠΎΠΉ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° ΠΏΡΠ΅Π· ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° bash), ΡΠ°ΠΊΠ° ΡΠ΅ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΡΡΠ²ΠΎ, Π½ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅:

Π©Π΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ Π±ΠΈΠ» ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π² ΡΠΎΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° GCC ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ:

Π‘Π΅Π³Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ 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Π‘Π΅Π³Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° ΡΠ°Π±Π° Run (ΠΏΡΡΠ²Π°ΡΠ° ΠΈΠΊΠΎΠ½Π°) ΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ ΠΏΠΎΠ»Π΅ Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄:
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, ΡΠΎ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π²Π΅ΡΠ΅ Π΅ ΠΏΠΎΠ·Π½Π°Ρ, ΠΎΠ±Π°ΡΠ΅ ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½ΠΎΠ² Π΅ΡΠ°ΠΏ:

Π Π°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΠ°ΠΌ, ΡΠ΅ ΡΠ΅Π³Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ, Π° HEAD Π½Π° ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ pull request:

ΠΠ°ΡΠΎΠ²Π° ΡΠΌΠ΅ Π² ΡΡΠ»ΠΎΠ²Π΅Π½ ΠΊΠΎΠΌΠΈΡ. 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 β Π½ΠΎΠΌΠ΅Ρ Π½Π° pull request-Π°;
- $BUDDY_REPO_SLUG β ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ max/test).
Π‘Π΅Π³Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π±ΡΡΠΎΠ½Π° Π΄ΠΎΠ»Ρ, ΠΈ ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request:

Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Travis CI, Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ .pvs-studio Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Buddy Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠ΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ. ΠΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ β Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° PVS-Studio Π² Buddy. Π‘Π»Π΅Π΄ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΡΠ΅ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² Pipeline. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΊΠ»ΡΡΠ° Π·Π° PVS-Studio:

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° Π½ΠΎΠ² pull request ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ°. ΠΠΊΠΎ ΠΊΠΎΠΌΠΌΠΈΡΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠΈ, Buddy ΡΠ΅ Π³ΠΈ ΠΏΠΎΡΠΎΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° pull request.
AppVeyor
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° AppVeyor Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° ΡΠ°Π·ΠΈ Π½Π° Buddy, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ°ΠΉΠ» *.yml Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π©Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° ΡΠ°Π±Π° Settings Π² ΠΏΡΠ΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:

Π©Π΅ ΠΏΡΠ΅Π²ΡΡΡΠΈΠΌ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π°Π΄ΠΎΠ»Ρ ΠΈ ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° pull request:

Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° ΡΠ°Π±Π° Environment, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°Π·Π° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:

ΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ, Π²ΠΈΠ΅ Π²Π΅ΡΠ΅ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β PVS_KEY ΠΈ PVS_USERNAME. ΠΠΊΠΎ Π½Π΅, ΡΠ΅ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΠ΅ ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π»ΠΈΡΠ΅Π½Π·Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° PVS-Studio. Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎ Ρ ΡΡΡ
Π² Bash ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅.
ΠΠ° ΡΡΡΠ°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π² Π΄ΠΎΠ»Π½Π°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠ° Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅:

ΠΠΊΠΎ Π½Π΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π½ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠΎ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ°ΡΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°.
Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°. ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ°Π±Π° Tests ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ Script:

Π’Π°Π·ΠΈ ΡΠΎΡΠΌΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄:
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 Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠΎΠ²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΡΠ°Π½Π½ΠΎ, Π½ΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Ρ.
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π² AppVeyor ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ Ρ ΠΊΡΠ°ΠΉΠ½ΠΎ ΡΡΡΠ°Π½Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡ Π΅Π΄Π½Π° ΡΡΡΠ°Π½Π°, Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΡΡ Π½Π΅ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅. ΠΡΠ΅ΠΊΠ°ΡΠ°Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π° Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΡΠΌΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° /home/appveyor/projects/testcalc/, Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π±Π΅ΡΠ΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΠ΅ ΡΠΌΠ΅ Π² /opt/appveyor/build-agent/. Π’ΠΎΠ³Π°Π²Π° ΠΎΡΡΠ·Π½Π°Ρ , ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° $PWD ΠΌΠ°Π»ΠΊΠΎ Π»ΡΠΆΠ΅. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΏΡΠΈΡΠΈΠ½Π° ΡΡΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Ρ ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° ΠΊΠ°ΠΊΡΠΎ ΠΏΡΠ΅Π΄ΠΈ:

Π‘Π΅Π³Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ:
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"`Π Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ Π΅ ΠΎΠ±ΡΠ²Π΅Π½ pull request. ΠΠ° ΡΠ΅Π»ΡΠ° Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:
- $APPVEYOR_PULL_REQUEST_NUMBER β Π½ΠΎΠΌΠ΅Ρ Π½Π° pull request;
- $APPVEYOR_REPO_NAME β ΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, Π½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡ ΡΡΡ ΠΈΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡ ΠΎΠ΄Π½Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°. Π‘ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ, Π²ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΡΠ²ΠΎΡ "Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄", ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ.
ΠΡΠΊΡΠ΄Π΅, ΠΊΠ°ΡΠΎ Π² Travis-CI, Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΊΠΎΠ΄ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ; Π΄ΡΡΠ³Π°Π΄Π΅, ΠΊΠ°ΡΠΎ Π² AppVeyor, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΏΠ°ΠΏΠΊΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅; Π½ΠΎ Π½Π° ΠΌΠ΅ΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ±Π΅Π΄ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ. ΠΠ°ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° pull request-ΠΈΡΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π° Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½Π° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅ ΠΏΡΡΠ²ΠΎ, ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ. ΠΠΊΠΎ Π½Π΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°, ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΠΈ ΡΠΌΠ΅Π»ΠΎ Π² . ΠΠΈΠ΅ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ ΠΈ Π½Π°ΡΠΎΡΠΈΠΌ.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π»ΠΈΠ½ΠΊΠ° ΠΊΡΠΌ ΠΏΡΠ΅Π²ΠΎΠ΄Π°: Maxim Zvyagintsev. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
