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

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

рдлрд╛рдЗрд▓ рд╕реВрдЪреА рдЬрд╛рдБрдЪ рдореЛрдб

PVS- рд╕реНрдЯреВрдбрд┐рдпреЛ C, C++, C# рд░ Java рдорд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░ рд╕рдореНрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░реАрд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрдиреЗ рдПрдЙрдЯрд╛ рдЙрдкрдХрд░рдг рд╣реЛред рд╡рд┐рдиреНрдбреЛрдЬ, рд▓рд┐рдирдХреНрд╕ рд░ macOS рдорд╛ 64-рдмрд┐рдЯ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред

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

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

рдЬреЗ рд╣реЛрд╕реН, рдпреЛ рд╡рд┐рдХрд▓реНрдкрдорд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХрдореА рдЫ - рддрдкрд╛рдИрдВрд▓реЗ рдпрд╛ рдд рд╕рдореНрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдкреВрд░реНрдг рдирд┐рд░реНрдорд╛рдг рдЯреНрд░реЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬрдм рддрдкрд╛рдИрдВ рдпрд╕рд▓рд╛рдИ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ, рдЬреБрди рдЖрдлреИрдорд╛ рджреНрд░реБрдд рд░реВрдкрдорд╛ рдХрдорд┐рдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░рдХреЛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд╣реЛред рд╡рд╛, рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЯреНрд░реЗрд╕ рдкрд░рд┐рдгрд╛рдорд▓рд╛рдИ рдХреНрдпрд╛рд╕ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рдЯреНрд░реЗрд╕ рдкрдЫрд┐ рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рдкрдЫрд┐рд▓реНрд▓рд╛ рд░рдирд╣рд░реВ рдЕрдкреВрд░реНрдг рд╣реБрди рд╕рдХреНрдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛рдорд╛ рдирдпрд╛рдБ # рд╕рдорд╛рд╡реЗрд╢ рдердкрд┐рдПрдХреЛ рдЫ)ред

рддреНрдпрд╕рдХрд╛рд░рдг, рд╣рд╛рдореА рдХрдорд┐рдЯрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╡рд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рддрд╛рдиреНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЯреНрд░реЗрд╕ рд▓рдЧрд╕рдБрдЧ рдлрд╛рдЗрд▓ рд╕реВрдЪреА рдЬрд╛рдБрдЪ рдореЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджреИрдиреМрдВред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдХрдорд┐рдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрджрд╛ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдореЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкрд╛рда рдлрд╛рдЗрд▓рдорд╛ рдмрдЪрдд рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдорд╛ рдкрдард╛рдЗрдиреНрдЫред -S:

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

рдпреЛ рдлрд╛рдЗрд▓рд▓реЗ рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд╛ рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рд░реНрдЧрд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫ, рд░ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдлрд╛рдЗрд▓ рдирдпрд╛рдБ рд▓рд╛рдЗрдирдорд╛ рд╣реБрдиреБрдкрд░реНрдЫред рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рдирд╛рдорд╣рд░реВ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рдард╣рд░реВ рдкрдирд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЫред рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓реЗ рджреЗрдЦреНрдиреЗрдЫ рдХрд┐ рдпреЛ рдлрд╛рдЗрд▓ рд╣реЛрдЗрди рд░ рд░реЗрдЦрд╛рд▓рд╛рдИ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреЗрдЫред рдпрджрд┐ рдлрд╛рдЗрд▓рд╣рд░реВ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ рдпреЛ рдЯрд┐рдкреНрдкрдгреАрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫред рдпрджреНрдпрдкрд┐, рдкреНрд░рд╛рдпрдГ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕реВрдЪреА рд╕реАрдЖрдИрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдХреНрд░рдордорд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреЗрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпреА рдХрдорд┐рдЯ рд╡рд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдмрд╛рдЯ рдлрд╛рдЗрд▓рд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреНред

рдЕрдм, рдпреЛ рдореЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдИрдВрд▓реЗ рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рд╢рд╛рдЦрд╛рдорд╛ рдЬрд╛рдиреБ рдЕрдШрд┐ рдирдпрд╛рдБ рдХреЛрдб рджреНрд░реБрдд рд░реВрдкрдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рд╕реНрдХреНрдпрд╛рдирд┐рдЩ рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреНрдЫ рднрдиреЗрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди, рдЙрдкрдпреЛрдЧрд┐рддрд╛ plog-converter рдЭрдгреНрдбрд╛ рдердкрд┐рдпреЛ --рд╕реВрдЪрдирд╛-рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВ:

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 рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдкрдЫрд┐ рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ CI рд╕реЗрд╡рд╛рд▓реЗ рдорд░реНрдЬрдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрди, рддреНрдпрд╕реИрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдирдпрд╛рдБ рддрд░рд┐рдХрд╛рд╣рд░реВ рд▓рд┐рдПрд░ рдЖрдЙрдиреБ рдкрд░реНрдЫред рдпреЛ рддрд▓ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдм рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдиреЗрдЫред

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореАрд▓реЗ рд╢рд╛рдЦрд╛рд╣рд░реВ рдмреАрдЪрдХреЛ рднрд┐рдиреНрдирддрд╛ рдкрд╛рдпреМрдВ, рд╡рд╛ рдмрд░реБ, рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХрд╛ рдлрд╛рдЗрд▓ рдирд╛рдорд╣рд░реВрдХреЛ рд╕реВрдЪреАред рдЕрдм рд╣рд╛рдореАрд▓реЗ рдлрд╛рдЗрд▓ рджрд┐рдиреБ рдкрд░реНрдЫ pvs-pr.list (рд╣рд╛рдореАрд▓реЗ рдорд╛рдерд┐рдХреЛ рдЖрдЙрдЯрдкреБрдЯрд▓рд╛рдИ рдпрд╕рдорд╛ рд░рд┐рдбрд┐рд░реЗрдХреНрдЯ рдЧрд░реНрдпреМрдВ) рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдорд╛:

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ рд▓рдЧ рдлрд╛рдЗрд▓ (PVS-Studio.log) рд▓рд╛рдИ рдкрдвреНрди рд╕рдЬрд┐рд▓реЛ рдврд╛рдБрдЪрд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

рдпреЛ рдЖрджреЗрд╢рд▓реЗ рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕реВрдЪреАрдмрджреНрдз рдЧрд░реНрдиреЗрдЫ stderr (рдорд╛рдирдХ рддреНрд░реБрдЯрд┐ рд╕рдиреНрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ)ред

рдЕрдм рдорд╛рддреНрд░ рд╣рд╛рдореАрд▓реЗ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдорд╛рддреНрд░ рджреЗрдЦрд╛рдЙрдиреБ рдкрд░реНрджреИрди, рддрд░ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореНрд░реЛ рд╕реЗрд╡рд╛рд▓рд╛рдИ рдкрдирд┐ рд╕реВрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рдХрдиреНрднрд░реНрдЯрд░рдорд╛ рдЭрдгреНрдбрд╛ рдердкрд┐рдпреЛ -W (--рд╕реВрдЪрдирд╛-рдЪреЗрддрд╛рд╡рдиреАрд╣рд░реВ)ред рдпрджрд┐ рдХрдореНрддрд┐рдорд╛ рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдиреА рдЫ рднрдиреЗ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд┐рд░реНрддрд╛ рдХреЛрдб plog-converter 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

рд░ 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 рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░рдХреЛ рдирд╛рдо рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫред

рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:

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

рдЕрдм рдХреЛрдбрдХреЛ рдпреЛ рд▓рд╛рдЗрдирд▓рд╛рдИ рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реМрдВ:

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

рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рдЯреНрд░рд╛рднрд┐рд╕ рд╕реАрдЖрдИрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрджрд╛ рд╢рд╛рдЦрд╛рд╣рд░реВрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдорд░реНрдЬ рдЧрд░реНрджрдЫ:

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

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

cache:
  directories:
    - .PVS-Studio/

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

рдмрдбреА

Travis CI рдЬрд╕реНрддреИ, рдмрдбреА GitHub рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред Travis CI рдХреЛ рд╡рд┐рдкрд░реАрдд, рдпреЛ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ (bash рд╕рдорд░реНрдерди рдЙрдкрд▓рдмреНрдз рдЫ), рддреНрдпрд╕реИрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓рд╛рдЗрдирдорд╛ рдирдпрд╛рдБ рдХрд╛рд░реНрдп рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

PVS-Studio рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Travis CI, Buddy рд░ AppVeyor рдорд╛ рдХрдорд┐рдЯрд╣рд░реВ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рднрдПрдХреЛ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реМрдВред рдпрд╕ рдХрд╛рд░реНрдпрдорд╛ рд╕реНрдерд╛рдкрдирд╛ рднрдПрдХреЛ рдбрдХрд░ рдХрдиреНрдЯреЗрдирд░рд▓рд╛рдИ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реНред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, GCC рдХреЛ рд▓рд╛рдЧреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдиреНрдЯреЗрдирд░ рдЫ:

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

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

рдпрджрд┐ рддрдкрд╛рдЗрдБ Travs-CI рдорд╛ рдЦрдгреНрдб рдкрдвреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдпреЛ рдХреЛрдб рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрд░рд┐рдЪрд┐рдд рдЫ, рддрдерд╛рдкрд┐, рдЕрдм рддреНрдпрд╣рд╛рдБ рдирдпрд╛рдБ рдЪрд░рдг рдЫ:

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_EXECUTION_PULL_REQEUST_NO - рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирдореНрдмрд░;
  • $BUDDY_REPO_SLUG тАФ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рд░ рднрдгреНрдбрд╛рд░рдХреЛ рд╕рдВрдпреЛрдЬрди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрддрдо/рдкрд░реАрдХреНрд╖рдг)ред

рдЕрдм рддрд▓рдХреЛ рдмрдЯрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдмрдЪрдд рдЧрд░реМрдВ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдХреНрд╖рдо рдЧрд░реМрдВ:

PVS-Studio рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Travis CI, Buddy рд░ AppVeyor рдорд╛ рдХрдорд┐рдЯрд╣рд░реВ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
Travis CI рдХреЛ рд╡рд┐рдкрд░реАрдд, рд╣рд╛рдореАрд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди .pvs-studio рдХреНрдпрд╛рд╕рд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐, рдмрдбреАрд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдкрдЫрд┐рдХреЛ рд╕реБрд░реБрд╡рд╛рддрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдлрд╛рдЗрд▓рд╣рд░реВ рдХреНрдпрд╛рд╕ рдЧрд░реНрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рдЕрдиреНрддрд┐рдо рдХреБрд░рд╛ рдмрд╛рдБрдХреА рдЫ 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-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рдЗрдЬрд╛рдЬрддрдкрддреНрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫрдиреНред рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рднрд╡рд┐рд╖реНрдпрдорд╛ Bash рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВрдорд╛ рдлреЗрд░рд┐ рджреЗрдЦреНрдиреЗрдЫреМрдВред

рддрд▓ рдЙрд╣реА рдкреГрд╖реНрдардорд╛ рд╣рд╛рдореА рдХреНрдпрд╛рд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдлреЛрд▓реНрдбрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрдЫреМрдВ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди