Π Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π½Π° PVS-Studio Π·Π° Π΅Π·ΠΈΡΠΈ C ΠΈ C++ Π½Π° Linux ΠΈ macOS, Π·Π°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΡ 7.04, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΡΡΠΎΠ²Π° ΠΎΠΏΡΠΈΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½ΠΎΠ²ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈΡΠ΅ ΠΈ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅. Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° GitHub ΠΏΡΠΎΠ΅ΠΊΡ Π² ΡΠ°ΠΊΠΈΠ²Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ CI (Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ) ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΊΠ°ΡΠΎ Travis CI, Buddy ΠΈ AppVeyor.
Π Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
ΠΡΠ² Π²Π΅ΡΡΠΈΡ PVS-Studio 7.04 Π·Π° Linux ΠΈ macOS ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΡΠΈΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ΠΆΠΈΠΌΡΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π½Π° ΡΡΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° strace Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° (ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° pvs-studio-analyzer). ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΏΡΡΠ²ΠΎ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΠΏΡΠ»Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ ΠΏΡΠ»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
Π’Π°Π·ΠΈ ΠΎΠΏΡΠΈΡ ΠΎΠ±Π°ΡΠ΅ ΠΈΠΌΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π΅Π½ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ - ΠΈΠ»ΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ»Π½ΠΎ ΡΡΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈ Π½Π° ΠΈΠ΄Π΅ΡΡΠ° Π·Π° Π±ΡΡΠ·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ. ΠΠ»ΠΈ, Π°ΠΊΠΎ ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ, ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ° Π½Π΅ΠΏΡΠ»Π½ΠΈ, Π°ΠΊΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΡΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ Π½ΠΎΠ² #include).
ΠΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΆΡΡΠ½Π°Π»Π° Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅, Π·Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΡΠ΅ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈ ΠΈΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ, ΠΏΠΎΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ°
Π‘ΠΏΠΈΡΡΠΊΡΡ Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π° Π² ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΈ ΠΏΡΡΠΈΡΠ° ΠΊΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΠΈ Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΠ² ΡΠ°ΠΉΠ» ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π½Π° Π½ΠΎΠ² ΡΠ΅Π΄. ΠΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π½Π΅ ΡΠ°ΠΌΠΎ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·, Π½ΠΎ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ. ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ΅ Π²ΠΈΠ΄ΠΈ, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΡΠ°ΠΉΠ» ΠΈ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ° ΡΠ΅Π΄Π°. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅, Π°ΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ ΡΡΡΠ½ΠΎ. Π§Π΅ΡΡΠΎ ΠΎΠ±Π°ΡΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ· Π² CI, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ Π·Π°ΡΠ²ΠΊΠ° Π·Π° Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅.
Π‘Π΅Π³Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π½ΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΡΠ΅Π°Π³ΠΈΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° plog-ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ --indicate-warnings:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Π‘ ΡΠΎΠ·ΠΈ ΡΠ»Π°Π³ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΡΡ ΡΠ΅ Π²ΡΡΠ½Π΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΎΡ Π½ΡΠ»Π° ΠΊΠΎΠ΄, Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π² ΠΎΡΡΠ΅ΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π° Π·Π° Π²ΡΡΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅ ΠΊΡΠΊΠ° Π·Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π°Π²Π°Π½Π΅, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡΡ ΠΎΡΡΠ΅Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½, ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅ΠΉΠ».
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΠΎΠ³Π°ΡΠΎ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ΅Π»ΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½, Π·Π°ΡΠΎΡΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ°ΠΉΠ» ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΡ Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° C ΠΈ C++ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°ΠΉΠ»ΡΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ ΠΈ ΡΠ΅ ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠΈΡΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ», Π° Π½Π΅ ΠΎΠ±Π΅ΠΊΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ±ΡΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅
ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΎΡΠ½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΠ°ΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠ΄Π΅Π»ΠΈΡΠ΅ Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π΄ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠΌΠΈΡΠΈ Ρ Π΄Π²Π° ΠΊΠ»ΠΎΠ½Π°:
ΠΠ΅ΠΊΠ° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠΎΠ·ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ A1 ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΡΠ΅ΡΡΠ²Π°Π½. ΠΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΠΊΠ»ΠΎΠ½ ΠΎΡ ΠΊΠΎΠΌΠΈΡΠ° A1 ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½ΡΠΊΠΎΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠΈΠ΅, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ ΡΠ΅ ΡΠΎΠ²Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° A1 Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π° ΠΎΡΠ΅ Π΄Π²Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠ°, Π½ΠΎ ΡΠΎΠ²Π° ΡΡΡΠΎ Π±ΡΡ Π° ΡΠ»ΠΈΠ²Π°Π½ΠΈΡ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π·Π°ΡΠΎΡΠΎ Π½ΠΈΠ΅ Π½Π΅ ΡΠ΅ Π°Π½Π³Π°ΠΆΠΈΡΠ°ΠΌΠ΅ Ρ ΠΌΠ°ΠΉΡΡΠΎΡ. Π ΡΠ΅Π³Π° Π΄ΠΎΠΉΠ΄Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π³ΠΎΡΠΎΠ². ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΡΠ» Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ΡΠΎ 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
Π‘Π»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ· ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π»ΠΎΠ³ ΡΠ°ΠΉΠ»Π° (PVS-Studio.log) Π² Π»Π΅ΡΠ΅Π½ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΡΠΎΡΠΌΠ°Ρ:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΡΠΎΠΈ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ Π²
Π‘Π°ΠΌΠΎ ΡΠ΅Π³Π° ΡΡΡΠ±Π²Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠΈ, Π½ΠΎ ΠΈ Π΄Π° ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΠ»ΡΠΆΠ±Π° Π·Π° ΠΌΠΎΠ½ΡΠ°ΠΆ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ° ΡΠ°Π·ΠΈ ΡΠ΅Π» ΠΊΡΠΌ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠ° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΡΠ»Π°Π³ -W (--indicate-warnings). ΠΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ½Π΅ Π΅Π΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΊΠΎΠ΄ΡΡ Π·Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° plog-ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π° 2, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ° CI ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π·Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅.
Π’ΡΠ°Π²ΠΈΡ CI
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ» .travis.yml. ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π²ΠΈ ΡΡΠ²Π΅ΡΠ²Π°ΠΌ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ bash ΡΠΊΡΠΈΠΏΡ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈ ΠΎΡ ΡΠ°ΠΉΠ»Π° .travis.yml (bash ΠΈΠΌΠ΅_Π½Π°_ΡΠΊΡΠΈΠΏΡ.sh ΠΈΠΌΠ΅_Π½Π°_ΡΡΠ½ΠΊΡΠΈΡ).
Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΊΠΎΠ΄ ΠΊΡΠΌ ΡΠΊΡΠΈΠΏΡΠ° Π½Π° ΡΡΡΡΠΊΠ°ΠΌ, ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. Π ΡΠ°Π·Π΄Π΅Π» ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ Π½Π΅ΠΊΠ° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
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 ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΄Π° ΠΌΠ°ΡΠΊΠΈΡΠ° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π³ΡΠ΅ΡΠΊΠΈ.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡΠ±Π»ΠΈΠ·ΠΎ ΡΠΎΠ·ΠΈ ΡΠ΅Π΄ ΠΊΠΎΠ΄:
git diff --name-only origin/HEAD > .pvs-pr.list
Π€Π°ΠΊΡ Π΅, ΡΠ΅ Travis CI Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅, Π΄ΠΎΠΊΠ°ΡΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
ΠΠ°ΡΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ A4Π Π½Π΅ B3->A3. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Ρ A3, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΡΡΡ
Π° Π½Π° ΠΊΠ»ΠΎΠ½Π° ΠΎΡ ΠΏΡΠΎΠΈΠ·Ρ
ΠΎΠ΄.
ΠΡΡΠ°Π²Π° Π΅Π΄Π½Π° Π²Π°ΠΆΠ½Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡ - ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈ ΠΏΡΠ΅Π²ΠΎΠ΄Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ (*.c, *.cc, *.cpp ΠΈ Π΄Ρ.). ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΡΠ΅Π·ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΈ Π·Π°ΠΏΠΈΡΠ²Π° Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° .PVS-Studio. Travis CI Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΏΠΊΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΊΡΠΌ ΡΠ°ΠΉΠ»Π° .travis.yml. Π’Π°Π·ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΡΠ±ΡΠ°Π½ΠΈ ΡΠ»Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·, ΠΊΠΎΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΡΠΊΠΎΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈΠ»ΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ Π°Π½Π°Π»ΠΈΠ·. ΠΠΊΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ, ΡΠΎΠ³Π°Π²Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ.
ΠΡΠΈΡΡΠ΅Π»Ρ
ΠΠ°ΡΠΎ Travis CI,
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΊΡΠΌ ΠΏΠΎΡΠΎΡΠ½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡ:
ΠΠ΅ΠΊΠ° ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π² ΡΠΎΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π·Π° 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 Π½Π° ΠΊΠ»ΠΎΠ½Π°, ΠΎΡ ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
Π’Π°ΠΊΠ° ΡΠ΅ Π½ΠΈΠ΅ ΡΠΌΠ΅ Π² ΡΡΠ»ΠΎΠ²Π΅Π½ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ 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 β ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ max/test).
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±ΡΡΠΎΠ½Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Travis CI, Π½ΠΈΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ .pvs-ΡΡΡΠ΄ΠΈΠΎ Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Buddy Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠ΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Π°, Π΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° Π²Ρ
ΠΎΠ΄ ΠΈ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° PVS-Studio Π² Buddy. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅, ΡΠ΅ Π±ΡΠ΄Π΅ΠΌ Π²ΡΡΠ½Π°ΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊΡΠΌ Pipeline. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΊΠ»ΡΡ Π·Π° PVS-Studio:
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° Π½ΠΎΠ²Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΠΈΠ»ΠΈ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°. ΠΠΊΠΎ Π΄Π°Π΄Π΅Π½ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ ΡΡΠ΄ΡΡΠΆΠ° Π³ΡΠ΅ΡΠΊΠΈ, Buddy ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ ΡΠΎΠ²Π° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΡΡΡ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅.
AppVeyor
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ Π½Π° AppVeyor Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Buddy, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ *.yml ΡΠ°ΠΉΠ» ΠΊΡΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ΅ΠΊΠ° ΠΎΡΠΈΠ΄Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π° ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π² ΠΏΡΠ΅Π³Π»Π΅Π΄Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ΅ΠΊΠ° ΠΏΡΠ΅Π²ΡΡΡΠΈΠΌ Π½Π°Π΄ΠΎΠ»Ρ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅:
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΎΡΠΈΠ΄Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π° ΠΠΊΠΎΠ»Π½Π° ΡΡΠ΅Π΄Π°, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:
ΠΠΊΠΎ ΡΡΠ΅ ΡΠ΅Π»ΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ, Π²ΠΈΠ΅ ΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ β PVS_KEY ΠΈ PVS_USERNAME. ΠΠΊΠΎ Π½Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»Π΅ΡΠ΅ ΠΌΠΈ Π΄Π° Π²ΠΈ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΠ΅ ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π»ΠΈΡΠ΅Π½Π·Π° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° PVS-Studio. Π©Π΅ Π³ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎ Π² Bash ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠ° ΡΡΡΠ°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅:
ΠΠΊΠΎ Π½Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΠΌΠ΅ΡΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π°, Π½ΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ°ΡΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°.
Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°. ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Π° Π’Π΅ΡΡΠΎΠ²Π΅ ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ Π‘ΠΊΡΠΈΠΏΡ:
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π² ΡΠΎΠ·ΠΈ ΡΠΎΡΠΌΡΠ»ΡΡ:
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"`
Π Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ΡΠ΅, Π½Π°Π΄ ΠΊΠΎΠΈΡΠΎ Π΅ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:
- $APPVEYOR_PULL_REQUEST_NUMBER β Π½ΠΎΠΌΠ΅Ρ Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅;
- $APPVEYOR_REPO_NAME - ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ ΡΠΌΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡ ΠΎΠ΄Π½ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠ° Π΅Π΄Π½Π° Ρ Π΄ΡΡΠ³Π°. Π‘ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ, Π²ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΏΡΠ°Π²ΠΈ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ βΠ²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄β, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ.
ΠΡΠΊΡΠ΄Π΅, ΠΊΠ°ΡΠΎ Π² Travis-CI, Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΊΠΎΠ΄ ΠΈ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Π±Π΅Π·ΡΠΏΡΠ΅ΡΠ½ΠΎ; Π½ΡΠΊΡΠ΄Π΅, ΠΊΠ°ΡΠΎ Π² AppVeyor, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅; Π½ΠΎ Π½ΡΠΊΡΠ΄Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ±Π΅Π΄ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° Π²ΠΈ Π΄Π°Π΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π° Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ Π±Π΅ΡΠ΅ ΠΎΠ±ΡΡΠ΄Π΅Π½Π° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ. ΠΠΊΠΎ Π½Π΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ, Π½Π΅ ΡΠ΅ ΠΊΠΎΠ»Π΅Π±Π°ΠΉΡΠ΅ Π΄Π° Π½ΠΈ ΠΏΠΈΡΠ΅ΡΠ΅ Π½Π°
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄: ΠΠ°ΠΊΡΠΈΠΌ ΠΠ²ΡΠ³ΠΈΠ½ΡΠ΅Π².
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com