PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
Linux рдЖрдгрд┐ macOS рд╡рд░реАрд▓ C рдЖрдгрд┐ C++ рднрд╛рд╖рд╛рдВрд╕рд╛рдареА PVS-Studio рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдордзреНрдпреЗ, рдЖрд╡реГрддреНрддреА 7.04 рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдКрди, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЪрд╛рдЪрдгреА рдкрд░реНрдпрд╛рдп рджрд┐рд╕реВрди рдЖрд▓рд╛ рдЖрд╣реЗ. рдирд╡реАрди рдореЛрдб рд╡рд╛рдкрд░реВрди, рддреБрдореНрд╣реА рдХрдорд┐рдЯ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд┐рдирдВрддреНрдпрд╛ рдЦреЗрдЪрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛. рд╣рд╛ рд▓реЗрдЦ рддреБрдореНрд╣рд╛рд▓рд╛ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп, рдмрдбреА рдЖрдгрд┐ рдЕреЕрдкрд╡реНрд╣реЗрдпрд░ рд╕рд╛рд░рдЦреНрдпрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реАрдЖрдп (рдХрдВрдЯрд┐рдиреНрдпреБрдЕрд╕ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди) рд╕рд┐рд╕реНрдЯреАрдордордзреНрдпреЗ рдЧрд┐рдЯрд╣рдм рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рдХрд╢реА рддрдкрд╛рд╕рд╛рдпрдЪреА рддреЗ рд╕рд╛рдВрдЧреЗрд▓.

рдлрд╛рдЗрд▓ рд╕реВрдЪреА рддрдкрд╛рд╕рдгреА рдореЛрдб

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ C, C++, C# рдЖрдгрд┐ Java рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреАрд▓ рддреНрд░реБрдЯреА рдЖрдгрд┐ рд╕рдВрднрд╛рд╡реНрдп рднреЗрджреНрдпрддрд╛ рдУрд│рдЦрдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди рдЖрд╣реЗ. Windows, Linux рдЖрдгрд┐ macOS рд╡рд░реАрд▓ 64-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдорд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ.

Linux рдЖрдгрд┐ macOS рд╕рд╛рдареА PVS-Studio 7.04 рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рд╕реНрддреНрд░реЛрдд рдлрд╛рдпрд▓реАрдВрдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдореЛрдб рджрд┐рд╕реВрди рдЖрд▓рд╛ рдЖрд╣реЗ. рд╣реЗ рдЕрд╢рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЬреНрдпрд╛рдВрдЪреА рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рддреБрдореНрд╣рд╛рд▓рд╛ рдлрд╛рдЗрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ compile_commands.json. рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕рдВрдХрд▓рдирд╛рд╡рд┐рд╖рдпреА рдорд╛рд╣рд┐рддреА рдХрд╛рдврдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреБрдордЪреА рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯреАрдо compile_commands.json рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╡рд╛рдкрд░реВрди рдЕрд╢реА рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддрд╛. рдЕрд╕реНрд╡рд▓.

рддрд╕реЗрдЪ, рдлрд╛рдЗрд▓ рд╕реВрдЪреА рддрдкрд╛рд╕рдгреА рдореЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд╛рдБрдЪ (pvs-studio-analyzer рдЯреНрд░реЗрд╕) рдЪреНрдпрд╛ рд╕реНрдЯреНрд░реЗрд╕ рдЯреНрд░реЗрд╕ рд▓реЙрдЧрд╕рд╣ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рд╕рдВрдкреВрд░реНрдг рд░рдЪрдирд╛ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреНрдпрд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓ рдЬреЗрдгреЗрдХрд░реБрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рддрдкрд╛рд╕рд▓реНрдпрд╛ рдЬрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдлрд╛рдИрд▓реНрд╕рдЪреНрдпрд╛ рд╕рдВрдХрд▓рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдмрджреНрджрд▓ рд╕рдВрдкреВрд░реНрдг рдорд╛рд╣рд┐рддреА рдЧреЛрд│рд╛ рдХрд░реЗрд▓.

рддрдерд╛рдкрд┐, рдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рдордзреНрдпреЗ рдПрдХ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХрдорддрд░рддрд╛ рдЖрд╣реЗ - рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЖрдкрдг рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдк рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХрддрд░ рд╕рдВрдкреВрд░реНрдг рдмрд┐рд▓реНрдб рдЯреНрд░реЗрд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗ рд╕реНрд╡рддрдГрдЪ рдХрдорд┐рдЯ рддреНрд╡рд░реАрдд рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдХрд▓реНрдкрдиреЗрд▓рд╛ рд╡рд┐рд░реЛрдз рдХрд░рддреЗ. рдХрд┐рдВрд╡рд╛, рддреБрдореНрд╣реА рдЯреНрд░реЗрд╕ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рддрдГрдЪ рдХреЕрд╢реЗ рдХреЗрд▓реНрдпрд╛рд╕, рдЯреНрд░реЗрд╕рдирдВрддрд░ рд╕реНрддреНрд░реЛрдд рдлрд╛рдЗрд▓реНрд╕рдЪреА рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд░рдЪрдирд╛ рдмрджрд▓рд▓реНрдпрд╛рд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреЗ рддреНрдпрд╛рдирдВрддрд░рдЪреЗ рд░рди рдЕрдкреВрд░реНрдг рдЕрд╕реВ рд╢рдХрддрд╛рдд (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕реНрддреНрд░реЛрдд рдлрд╛рдЗрд▓реНрд╕рдкреИрдХреА рдПрдХрд╛рдордзреНрдпреЗ рдирд╡реАрди #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++ рдлрд╛рдпрд▓реАрдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ. рднрд╡рд┐рд╖реНрдпрд╛рдд, рдЕрд╡рд▓рдВрдмрди рдлрд╛рдЗрд▓ рдХреЕрд╢реЗ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЖрдгрд┐ рддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рджреНрд╡рд╛рд░реЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓. рдЗрдиреНрдХреНрд░рд┐рдореЗрдВрдЯрд▓ рдЕреЕрдирд╛рд▓рд┐рд╕рд┐рд╕ рдореЛрдб рд╡рд╛рдкрд░реВрди рдлрд╛рдЗрд▓ рд▓рд┐рд╕реНрдЯ рдЪреЗрдХрд┐рдВрдЧ рдореЛрдб рд╡рд╛рдкрд░рддрд╛рдирд╛ рдХрдорд┐рдЯ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рддреА рдлрд╛рдЗрд▓ рдХреЕрд╢реЗ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕рдЪреА рдирд╛рд╣реА.

рдкреБрд▓ рд╡рд┐рдирдВрддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреА рд╕рд╛рдорд╛рдиреНрдп рддрддреНрддреНрд╡реЗ

рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ, рддреНрдпрд╛рдореБрд│реЗ рддреНрдпрд╛рддреАрд▓ рдХрд╛рд╣реА рднрд╛рдЧ рддрдкрд╛рд╕рдгреНрдпрд╛рдд рдЕрд░реНрде рдЖрд╣реЗ. рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдлрд╛рдЗрд▓реНрд╕ рдЙрд░реНрд╡рд░рд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рджреЛрди рдлрд╛рдВрджреНрдпрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрдорд┐рдЯ рдЭрд╛рдбрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рддреНрдпрд╛ рдХрдорд┐рдЯрдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ A1 рдЖрдзреАрдкрд╛рд╕реВрди рддрдкрд╛рд╕рд▓реЗ рдЧреЗрд▓реЗрд▓реЗ рдХреЛрдб рдмрд▒реНрдпрд╛рдкреИрдХреА рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдЖрд╣реЗ. рдереЛрдбреНрдпрд╛ рдЖрдзреА рдЖрдореНрд╣реА рдХрдорд┐рдЯрдордзреВрди рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╡рд▓реА A1 рдЖрдгрд┐ рдХрд╛рд╣реА рдлрд╛рдИрд▓реНрд╕ рдмрджрд▓рд▓реНрдпрд╛.

рдЖрдкрдг, рдЕрд░реНрдерд╛рддрдЪ, рдирдВрддрд░ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ A1 рдЖрдгрдЦреА рджреЛрди рдХрдорд┐рдЯ рдЭрд╛рд▓реЗ, рдкрд░рдВрддреБ рд╣реЗ рдЗрддрд░ рд╢рд╛рдЦрд╛рдВрдЪреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдг рджреЗрдЦреАрд▓ рд╣реЛрддреЗ, рдХрд╛рд░рдг рдЖрдореНрд╣реА рд╡рдЪрдирдмрджреНрдз рдирд╛рд╣реА рдорд╛рд╕реНрдЯрд░. рдЖрдгрд┐ рдЖрддрд╛ рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ рдЬреЗрд╡реНрд╣рд╛ рд╣реЙрдЯрдлрд┐рдХреНрд╕ рддрдпрд╛рд░. рдореНрд╣рдгреВрдирдЪ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рд╕рд╛рдареА рдПрдХ рдкреБрд▓ рд╡рд┐рдирдВрддреА рджрд┐рд╕реВрди рдЖрд▓реА B3 ╨╕ A3.

рдЕрд░реНрдерд╛рдд, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪрд╛ рд╕рдВрдкреВрд░реНрдг рдкрд░рд┐рдгрд╛рдо рддрдкрд╛рд╕рдгреЗ рд╢рдХреНрдп рд╣реЛрдИрд▓, рдкрд░рдВрддреБ рд╣реЗ рдЦреВрдк рд╡реЗрд│рдЦрд╛рдК рдЖрдгрд┐ рдЕрдиреНрдпрд╛рдпрдХрд╛рд░рдХ рдЕрд╕реЗрд▓, рдХрд╛рд░рдг рдлрдХреНрдд рдХрд╛рд╣реА рдлрд╛рдпрд▓реА рдмрджрд▓рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдореНрд╣рдгреВрди, рдХреЗрд╡рд│ рдмрджрд▓рд▓реЗрд▓реНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЖрд╣реЗ.

рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЬреНрдпрд╛ рд╢рд╛рдЦреЗрддреВрди рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдорд╛рд╕реНрдЯрд░рдордзреНрдпреЗ рд╡рд┐рд▓реАрди рд╡реНрд╣рд╛рдпрдЪреЗ рдЖрд╣реЗ рддреНрдпрд╛ рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдкреНрд░рдореБрдЦрд╛рдордзреНрдпреЗ рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╢рд╛рдЦрд╛рдВрдордзреАрд▓ рдлрд░рдХ рдорд┐рд│рддреЛ:

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

$MERGE_BASE рдЖрдореНрд╣реА рдирдВрддрд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдЖрдп рд╕реЗрд╡рд╛ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рд╕рд╛рдареА рдбреЗрдЯрд╛рдмреЗрд╕рдмрджреНрджрд▓ рдЖрд╡рд╢реНрдпрдХ рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд╛рди рдХрд░рдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╣рд╛ рдбреЗрдЯрд╛ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдирд╡реАрди рдорд╛рд░реНрдЧ рд╢реЛрдзреВрди рдХрд╛рдврд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓. рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдм рд╕реЗрд╡рд╛рдВрдордзреНрдпреЗ рд╣реЗ рдЦрд╛рд▓реА рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

рддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рд╢рд╛рдЦрд╛рдВрдордзреАрд▓ рдлрд░рдХ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдРрд╡рдЬреА рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓ рдирд╛рд╡рд╛рдВрдЪреА рдпрд╛рджреА рдорд┐рд│рд╛рд▓реА. рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрд╛рдИрд▓ рджреНрдпрд╛рдпрдЪреА рдЖрд╣реЗ .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.yml. рд╕реЛрдпреАрд╕рд╛рдареА, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрд╛рдЗрд▓рдордзреВрди рдХреЙрд▓ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╣ рд╕рд░реНрд╡рдХрд╛рд╣реА рд╡реЗрдЧрд│реНрдпрд╛ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдареЗрд╡рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджреЗрддреЛ. .travis.yml (bash script_name.sh function_name).

рдпреЗрдереЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдЬреЛрдбреВ рдмрд╛рд╢, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд┐рд│реЗрд▓. рд╡рд┐рднрд╛рдЧрд╛рдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ рдЪрд▓рд╛ рдЦрд╛рд▓реАрд▓ рд▓рд┐рд╣реВ:

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

рдЖрдгрд┐ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ:

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_PULL_REQUEST рдкреБрд▓ рд╡рд┐рдирдВрддреА рдХреНрд░рдорд╛рдВрдХ рд╕рдВрдЪрдпрд┐рдд рдХрд░рддреЗ рдХрд┐рдВрд╡рд╛ рдЦреЛрдЯреЗ, рд╣реА рдирд┐рдпрдорд┐рдд рд╢рд╛рдЦрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕;
  • $TRAVIS_REPO_SLUG рдкреНрд░рдХрд▓реНрдк рднрд╛рдВрдбрд╛рд░рд╛рдЪреЗ рдирд╛рд╡ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ.

рдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд░рд┐рдЯрд░реНрди рдХреЛрдбрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдЪреЗрддрд╛рд╡рдгреАрдЪреА рдЙрдкрд╕реНрдерд┐рддреА рд╕реЗрд╡реЗрд▓рд╛ рдХрдорд┐рдЯрдордзреНрдпреЗ рддреНрд░реБрдЯреА рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧреЗрд▓.

рдЖрддрд╛ рдХреЛрдбрдЪреНрдпрд╛ рдпрд╛ рдУрд│реАрд╡рд░ рдмрд╛рд░рдХрд╛рдИрдиреЗ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛:

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

рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдкреБрд▓ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛рдирд╛ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдЖрдкреЛрдЖрдк рд╢рд╛рдЦрд╛ рд╡рд┐рд▓реАрди рдХрд░рддреЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ A4рдкрдг рдирд╛рд╣реА B3->A3. рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛рд╕рд╣ рдлрд░рдХ рдореЛрдЬрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдП 3, рдЬреЗ рддрдВрддреЛрддрдВрдд рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдЖрд╣реЗ рдореВрд│.

рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рддрдкрд╢реАрд▓ рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ - рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдВрддрд░ рдпреБрдирд┐рдЯреНрд╕ (*.c, *.cc, *.cpp, рдЗ.) рд╡рд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╛рдпрд▓реАрдВрдЪреЗ рдЕрд╡рд▓рдВрдмрди рдХреЕрд╢ рдХрд░рдгреЗ. рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╛ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреА рдЧрдгрдирд╛ рдХрд░рддреЛ рдЬреЗрд╡реНрд╣рд╛ рддреЗ рдкреНрд░рдердо рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдореЛрдбрдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рддреНрдпрд╛рдВрдирд╛ .PVS-Studio рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рд╕реЗрд╡реНрд╣ рдХрд░рддреЗ. рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рддреБрдореНрд╣рд╛рд▓рд╛ рдлреЛрд▓реНрдбрд░реНрд╕ рдХреЕрд╢реЗ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдбреЗрдЯрд╛ рдЬрддрди рдХрд░реВ .PVS-рд╕реНрдЯреБрдбрд┐рдУ/:

cache:
  directories:
    - .PVS-Studio/

рд╣рд╛ рдХреЛрдб рдлрд╛рдИрд▓рдордзреНрдпреЗ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ .travis.yml. рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдирдВрддрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рд╡рд┐рд╡рд┐рдз рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдлрд╛рдЗрд▓ рд╕реВрдЪреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдВрд╡рд╛ рд╡рд╛рдвреАрд╡ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдзрд╛рд╡рд╛рдВрдирд╛ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдЧрддреА рдорд┐рд│реЗрд▓. рд╣реЗ рдкреВрд░реНрдг рди рдХреЗрд▓реНрдпрд╛рд╕, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рд░реНрд╡ рдлрд╛рдпрд▓реАрдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрд▓.

рдмрдбреА

рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдкреНрд░рдорд╛рдгреЗ, рдмрдбреА GitHub рд╡рд░ рд╕рдВрдЪрдпрд┐рдд рдХреЗрд▓реЗрд▓реЗ рдкреНрд░рдХрд▓реНрдк рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдпрдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рд╣реЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ (рдмреЕрд╢ рд╕рдорд░реНрдерди рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ), рддреНрдпрд╛рдореБрд│реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рд╕рд░реНрд╡ рдкреНрд░рдердо, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рд▓рд╛рдЗрдирдордзреНрдпреЗ рдПрдХ рдирд╡реАрди рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджрд░реНрд╢рд╡реВ. рдпрд╛ рдХреГрддреАрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдХрдбреЗ рд▓рдХреНрд╖ рджреНрдпрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, GCC рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдВрдЯреЗрдирд░ рдЖрд╣реЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ PVS-Studio рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЬ рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХрд░реВрдпрд╛:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЪрд▓рд╛ рдЦрд╛рд▓реАрд▓ рдУрд│реА рд╕рдВрдкрд╛рджрдХрд╛рдд рдЬреЛрдбреВрдпрд╛:

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

рдЖрдкрдг рдЯреНрд░реЕрд╡реНрд╣рд╕-рд╕реАрдЖрдп рд╡рд░реАрд▓ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрд▓реНрдпрд╛рд╕, рд╣рд╛ рдХреЛрдб рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдЖрдзреАрдЪ рдкрд░рд┐рдЪрд┐рдд рдЖрд╣реЗ, рддрдерд╛рдкрд┐, рдЖрддрд╛ рдПрдХ рдирд╡реАрди рдЯрдкреНрдкрд╛ рдЖрд╣реЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдЖрддрд╛ рдЖрдореНрд╣реА рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдд рдирд╛рд╣реА, рддрд░ рдЬреНрдпрд╛ рд╢рд╛рдЦреЗрддреВрди рдкреБрд▓ рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЖрд╣реЗ рддреНрдпрд╛ рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдкреНрд░рдореБрдЦрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рддреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣реА рд╕рд╢рд░реНрдд рд╡рдЪрдирдмрджреНрдз рдЖрд╣реЛрдд 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 тАФ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрдгрд┐ рднрд╛рдВрдбрд╛рд░ рдпрд╛рдВрдЪреЗ рд╕рдВрдпреЛрдЬрди (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдХрдорд╛рд▓/рдЪрд╛рдЪрдгреА).

рдЖрддрд╛ рдЦрд╛рд▓реАрд▓ рдмрдЯрдг рд╡рд╛рдкрд░реВрди рдмрджрд▓ рдЬрддрди рдХрд░реВ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдХреНрд╖рдо рдХрд░реВ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
Travis CI рдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА .pvs-рд╕реНрдЯреБрдбрд┐рдУ рдХреЕрд╢рд┐рдВрдЧрд╕рд╛рдареА, рдХрд╛рд░рдг рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд▓рд╛рдБрдЪрд╕рд╛рдареА рдмрдбреА рдЖрдкреЛрдЖрдк рд╕рд░реНрд╡ рдлрд╛рдЗрд▓реНрд╕ рдХреЕрд╢ рдХрд░рддреЗ. рддреНрдпрд╛рдореБрд│реЗ, PVS-Studio in Buddy рд╕рд╛рдареА рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрд╡реНрд╣ рдХрд░рдгреЗ рд╣реА рд╢реЗрд╡рдЯрдЪреА рдЧреЛрд╖реНрдЯ рд░рд╛рд╣рд┐рд▓реА рдЖрд╣реЗ. рдмрджрд▓ рдЬрддрди рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдкрд░рдд рдиреЗрд▓реЗ рдЬрд╛рдИрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдУрд╕рд╛рдареА рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдХреА рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдвреЗ рдЬрд╛рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрд╛рдирдВрддрд░, рдирд╡реАрди рдкреБрд▓ рд╡рд┐рдирдВрддреА рдХрд┐рдВрд╡рд╛ рдХрдорд┐рдЯ рджрд┐рд╕рд▓реНрдпрд╛рдиреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдИрд▓. рдХрдорд┐рдЯрдордзреНрдпреЗ рддреНрд░реБрдЯреА рдЕрд╕рд▓реНрдпрд╛рд╕, рдмрдбреА рд╣реЗ рдкреБрд▓ рд╡рд┐рдирдВрддреА рдкреГрд╖реНрдард╛рд╡рд░ рд╕реВрдЪрд┐рдд рдХрд░реЗрд▓.

AppVeyor

AppVeyor рд╕реЗрдЯ рдХрд░рдгреЗ рд╣реЗ Buddy рд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ, рдХрд╛рд░рдг рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдШрдбрддреЗ рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ *.yml рдлрд╛рдЗрд▓ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдордзреАрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдЯреЕрдмрд╡рд░ рдЬрд╛рдКрдпрд╛:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЪрд▓рд╛ рд╣реЗ рдкреГрд╖реНрда рдЦрд╛рд▓реА рд╕реНрдХреНрд░реЛрд▓ рдХрд░реВ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЕрд╢реЗ рдмрдЪрдд рд╕рдХреНрд╖рдо рдХрд░реВ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ рдЖрдкрдг рдкрд░реНрдпрд╛рд╡рд░рдг рдЯреЕрдмрд╡рд░ рдЬрд╛рдК рдпрд╛, рдЬрд┐рдереЗ рдЖрдкрдг рдЕрд╕реЗрдВрдмрд▓реАрд╕рд╛рдареА рдкреНрд░рддрд┐рдорд╛ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЬрд░ рддреБрдореНрд╣реА рдорд╛рдЧреАрд▓ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрд▓реЗ рдЕрд╕рддреАрд▓, рддрд░ рддреБрдореНрд╣реА рдпрд╛ рджреЛрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╢реА рдкрд░рд┐рдЪрд┐рдд рдЖрд╣рд╛рдд тИТ PVS_KEY ╨╕ PVS_USERNAME. рдирд╕рд▓реНрдпрд╛рд╕, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ рдХреА рддреЗ PVS-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдЪреА рдкрдбрддрд╛рд│рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. рднрд╡рд┐рд╖реНрдпрд╛рдд рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рдкрд╛рд╣реВ.

рдЦрд╛рд▓реА рддреНрдпрд╛рдЪ рдкреГрд╖реНрдард╛рд╡рд░ рдЖрдореНрд╣реА рдХреЕрд╢рд┐рдВрдЧрд╕рд╛рдареА рдлреЛрд▓реНрдбрд░ рд╕реВрдЪрд┐рдд рдХрд░рддреЛ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдореНрд╣реА рдЕрд╕реЗ рди рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдХрд╛рд╣реА рдлрд╛рдпрд▓реАрдВрдРрд╡рдЬреА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВ, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╛рдЗрд▓реНрд╕рдордзреВрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд│реЗрд▓. рдореНрд╣рдгреВрди, рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдЪреЗ рдирд╛рд╡ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдЖрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ. рдЪрд╛рдЪрдгреА рдЯреЕрдм рдЙрдШрдбрд╛ рдЖрдгрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╡рдбрд╛:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

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 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдереЛрдбреЗ рдЦреЛрдЯреЗ рдЖрд╣реЗ. рдпрд╛ рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рдореА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреНрдпрд╛рдЪреЗ рдореВрд▓реНрдп рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ.

рдЖрдгрд┐ рдордЧ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкреВрд░реНрд╡реАрд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ:

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ рдЦрд╛рд▓реАрд▓ рддреБрдХрдбреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛:

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 рдкреНрд░рдорд╛рдгреЗ, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ рдлреЛрд▓реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ; рдкрд░рдВрддреБ рдХреБрдареЗрддрд░реА рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдирдиреНрдп рдХреА рддрдпрд╛рд░ рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЕрд╢реЗ рдХреЗрд▓реЗрд▓рд╛ рддреБрдХрдбрд╛ рдУрд╡реНрд╣рд░рд░рд╛рдЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рдкрдЯрд╡реВрди рджреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛. рдореНрд╣рдгреВрди, рд╡рд░ рдЪрд░реНрдЪрд╛ рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рддрдд рдПрдХреАрдХрд░рдг рд╕реЗрд╡реЗрд╡рд░ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рдердо рдЦрд╛рддреНрд░реА рдХрд░рд╛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЕрд╢рд┐рдВрдЧрдордзреНрдпреЗ рд╕рдорд╕реНрдпрд╛ рдпреЗрдгрд╛рд░ рдирд╛рд╣реАрдд.

рдЖрдкрдг рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж. рдХрд╛рд╣реАрддрд░реА рдХрд╛рд░реНрдп рдХрд░рдд рдирд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдореЛрдХрд│реНрдпрд╛ рдордирд╛рдиреЗ рд▓рд┐рд╣рд╛ рд╕рдорд░реНрдерди. рдЖрдореНрд╣реА рд╕рд▓реНрд▓рд╛ рдЖрдгрд┐ рдорджрдд рдХрд░реВ.

PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: Maxim Zvyagintsev. PVS-Studio рд╡рд╛рдкрд░реВрди Travis CI, Buddy рдЖрдгрд┐ AppVeyor рдордзреАрд▓ рдХрдорд┐рдЯ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛