Linux рдЖрдгрд┐ macOS рд╡рд░реАрд▓ C рдЖрдгрд┐ C++ рднрд╛рд╖рд╛рдВрд╕рд╛рдареА PVS-Studio рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдордзреНрдпреЗ, рдЖрд╡реГрддреНрддреА 7.04 рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдКрди, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЪрд╛рдЪрдгреА рдкрд░реНрдпрд╛рдп рджрд┐рд╕реВрди рдЖрд▓рд╛ рдЖрд╣реЗ. рдирд╡реАрди рдореЛрдб рд╡рд╛рдкрд░реВрди, рддреБрдореНрд╣реА рдХрдорд┐рдЯ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд┐рдирдВрддреНрдпрд╛ рдЦреЗрдЪрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛. рд╣рд╛ рд▓реЗрдЦ рддреБрдореНрд╣рд╛рд▓рд╛ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп, рдмрдбреА рдЖрдгрд┐ рдЕреЕрдкрд╡реНрд╣реЗрдпрд░ рд╕рд╛рд░рдЦреНрдпрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реАрдЖрдп (рдХрдВрдЯрд┐рдиреНрдпреБрдЕрд╕ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди) рд╕рд┐рд╕реНрдЯреАрдордордзреНрдпреЗ рдЧрд┐рдЯрд╣рдм рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рдХрд╢реА рддрдкрд╛рд╕рд╛рдпрдЪреА рддреЗ рд╕рд╛рдВрдЧреЗрд▓.
рдлрд╛рдЗрд▓ рд╕реВрдЪреА рддрдкрд╛рд╕рдгреА рдореЛрдб
Linux рдЖрдгрд┐ macOS рд╕рд╛рдареА PVS-Studio 7.04 рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рд╕реНрддреНрд░реЛрдд рдлрд╛рдпрд▓реАрдВрдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдореЛрдб рджрд┐рд╕реВрди рдЖрд▓рд╛ рдЖрд╣реЗ. рд╣реЗ рдЕрд╢рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЬреНрдпрд╛рдВрдЪреА рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рддреБрдореНрд╣рд╛рд▓рд╛ рдлрд╛рдЗрд▓ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ
рддрд╕реЗрдЪ, рдлрд╛рдЗрд▓ рд╕реВрдЪреА рддрдкрд╛рд╕рдгреА рдореЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд╛рдБрдЪ (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++ рдлрд╛рдпрд▓реАрдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ. рднрд╡рд┐рд╖реНрдпрд╛рдд, рдЕрд╡рд▓рдВрдмрди рдлрд╛рдЗрд▓ рдХреЕрд╢реЗ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЖрдгрд┐ рддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рджреНрд╡рд╛рд░реЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓. рдЗрдиреНрдХреНрд░рд┐рдореЗрдВрдЯрд▓ рдЕреЕрдирд╛рд▓рд┐рд╕рд┐рд╕ рдореЛрдб рд╡рд╛рдкрд░реВрди рдлрд╛рдЗрд▓ рд▓рд┐рд╕реНрдЯ рдЪреЗрдХрд┐рдВрдЧ рдореЛрдб рд╡рд╛рдкрд░рддрд╛рдирд╛ рдХрдорд┐рдЯ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рддреА рдлрд╛рдЗрд▓ рдХреЕрд╢реЗ рдХрд░рд╛рдпрдЪреА рдЖрд╣реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕рдЪреА рдирд╛рд╣реА.
рдкреБрд▓ рд╡рд┐рдирдВрддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреА рд╕рд╛рдорд╛рдиреНрдп рддрддреНрддреНрд╡реЗ
рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ, рддреНрдпрд╛рдореБрд│реЗ рддреНрдпрд╛рддреАрд▓ рдХрд╛рд╣реА рднрд╛рдЧ рддрдкрд╛рд╕рдгреНрдпрд╛рдд рдЕрд░реНрде рдЖрд╣реЗ. рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдлрд╛рдЗрд▓реНрд╕ рдЙрд░реНрд╡рд░рд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рджреЛрди рдлрд╛рдВрджреНрдпрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрдорд┐рдЯ рдЭрд╛рдбрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ:
рддреНрдпрд╛ рдХрдорд┐рдЯрдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ 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
рд╣реА рдХрдорд╛рдВрдб рдордзреАрд▓ рддреНрд░реБрдЯреАрдВрдЪреА рдпрд╛рджреА рдХрд░реЗрд▓
рдлрдХреНрдд рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЗрд╡рд│ рддреНрд░реБрдЯреА рджрд╛рдЦрд╡рд┐рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рддрд░ рд╕рдорд╕реНрдпрд╛рдВрдЪреНрдпрд╛ рдЙрдкрд╕реНрдерд┐рддреАрдмрджреНрджрд▓ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдЖрдордЪреНрдпрд╛ рд╕реЗрд╡реЗрд▓рд╛ рд╕реВрдЪрд┐рдд рдХрд░рдгреЗ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдЙрджреНрджреЗрд╢рд╛рд╕рд╛рдареА, рдХрдиреНрд╡реНрд╣рд░реНрдЯрд░рдордзреНрдпреЗ рдПрдХ рдзреНрд╡рдЬ рдЬреЛрдбрд▓рд╛ рдЧреЗрд▓рд╛ -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 рдкреНрд░рдХрд▓реНрдк рднрд╛рдВрдбрд╛рд░рд╛рдЪреЗ рдирд╛рд╡ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ.
рдпрд╛ рдХрд╛рд░реНрдпрд╛рд╕рд╛рдареА рдЕрд▓реНрдЧреЛрд░рд┐рджрдо:
рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд░рд┐рдЯрд░реНрди рдХреЛрдбрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдЪреЗрддрд╛рд╡рдгреАрдЪреА рдЙрдкрд╕реНрдерд┐рддреА рд╕реЗрд╡реЗрд▓рд╛ рдХрдорд┐рдЯрдордзреНрдпреЗ рддреНрд░реБрдЯреА рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧреЗрд▓.
рдЖрддрд╛ рдХреЛрдбрдЪреНрдпрд╛ рдпрд╛ рдУрд│реАрд╡рд░ рдмрд╛рд░рдХрд╛рдИрдиреЗ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛:
git diff --name-only origin/HEAD > .pvs-pr.list
рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдкреБрд▓ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛рдирд╛ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдЖрдкреЛрдЖрдк рд╢рд╛рдЦрд╛ рд╡рд┐рд▓реАрди рдХрд░рддреЗ:
рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ A4рдкрдг рдирд╛рд╣реА B3->A3. рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛рд╕рд╣ рдлрд░рдХ рдореЛрдЬрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдП 3, рдЬреЗ рддрдВрддреЛрддрдВрдд рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдЖрд╣реЗ рдореВрд│.
рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рддрдкрд╢реАрд▓ рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ - рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдВрддрд░ рдпреБрдирд┐рдЯреНрд╕ (*.c, *.cc, *.cpp, рдЗ.) рд╡рд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╛рдпрд▓реАрдВрдЪреЗ рдЕрд╡рд▓рдВрдмрди рдХреЕрд╢ рдХрд░рдгреЗ. рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╛ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреА рдЧрдгрдирд╛ рдХрд░рддреЛ рдЬреЗрд╡реНрд╣рд╛ рддреЗ рдкреНрд░рдердо рдлрд╛рдЗрд▓реНрд╕рдЪреА рд╕реВрдЪреА рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдореЛрдбрдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рддреНрдпрд╛рдВрдирд╛ .PVS-Studio рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рд╕реЗрд╡реНрд╣ рдХрд░рддреЗ. рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рддреБрдореНрд╣рд╛рд▓рд╛ рдлреЛрд▓реНрдбрд░реНрд╕ рдХреЕрд╢реЗ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдбреЗрдЯрд╛ рдЬрддрди рдХрд░реВ .PVS-рд╕реНрдЯреБрдбрд┐рдУ/:
cache:
directories:
- .PVS-Studio/
рд╣рд╛ рдХреЛрдб рдлрд╛рдИрд▓рдордзреНрдпреЗ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ .travis.yml. рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдирдВрддрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рд╡рд┐рд╡рд┐рдз рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдлрд╛рдЗрд▓ рд╕реВрдЪреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдВрд╡рд╛ рд╡рд╛рдвреАрд╡ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдзрд╛рд╡рд╛рдВрдирд╛ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдЧрддреА рдорд┐рд│реЗрд▓. рд╣реЗ рдкреВрд░реНрдг рди рдХреЗрд▓реНрдпрд╛рд╕, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рд░реНрд╡ рдлрд╛рдпрд▓реАрдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрд▓.
рдмрдбреА
рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдкреНрд░рдорд╛рдгреЗ,
рд╕рд░реНрд╡ рдкреНрд░рдердо, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рд▓рд╛рдЗрдирдордзреНрдпреЗ рдПрдХ рдирд╡реАрди рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:
рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджрд░реНрд╢рд╡реВ. рдпрд╛ рдХреГрддреАрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдХрдбреЗ рд▓рдХреНрд╖ рджреНрдпрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, 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
рдЖрддрд╛ рд░рди рдЯреЕрдм (рдкреНрд░рдердо рдЪрд┐рдиреНрд╣) рд╡рд░ рдЬрд╛рдК рдЖрдгрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрд╛рджрдХ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдЬреЛрдбрд╛:
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
рдЖрдкрдг рдЯреНрд░реЕрд╡реНрд╣рд╕-рд╕реАрдЖрдп рд╡рд░реАрд▓ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрд▓реНрдпрд╛рд╕, рд╣рд╛ рдХреЛрдб рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдЖрдзреАрдЪ рдкрд░рд┐рдЪрд┐рдд рдЖрд╣реЗ, рддрдерд╛рдкрд┐, рдЖрддрд╛ рдПрдХ рдирд╡реАрди рдЯрдкреНрдкрд╛ рдЖрд╣реЗ:
рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдЖрддрд╛ рдЖрдореНрд╣реА рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдд рдирд╛рд╣реА, рддрд░ рдЬреНрдпрд╛ рд╢рд╛рдЦреЗрддреВрди рдкреБрд▓ рд╡рд┐рдирдВрддреА рдХреЗрд▓реА рдЖрд╣реЗ рддреНрдпрд╛ рд╢рд╛рдЦреЗрдЪреНрдпрд╛ рдкреНрд░рдореБрдЦрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ:
рддреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣реА рд╕рд╢рд░реНрдд рд╡рдЪрдирдмрджреНрдз рдЖрд╣реЛрдд 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 тАФ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрдгрд┐ рднрд╛рдВрдбрд╛рд░ рдпрд╛рдВрдЪреЗ рд╕рдВрдпреЛрдЬрди (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдХрдорд╛рд▓/рдЪрд╛рдЪрдгреА).
рдЖрддрд╛ рдЦрд╛рд▓реАрд▓ рдмрдЯрдг рд╡рд╛рдкрд░реВрди рдмрджрд▓ рдЬрддрди рдХрд░реВ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдХреНрд╖рдо рдХрд░реВ:
Travis CI рдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА .pvs-рд╕реНрдЯреБрдбрд┐рдУ рдХреЕрд╢рд┐рдВрдЧрд╕рд╛рдареА, рдХрд╛рд░рдг рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд▓рд╛рдБрдЪрд╕рд╛рдареА рдмрдбреА рдЖрдкреЛрдЖрдк рд╕рд░реНрд╡ рдлрд╛рдЗрд▓реНрд╕ рдХреЕрд╢ рдХрд░рддреЗ. рддреНрдпрд╛рдореБрд│реЗ, PVS-Studio in Buddy рд╕рд╛рдареА рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрд╡реНрд╣ рдХрд░рдгреЗ рд╣реА рд╢реЗрд╡рдЯрдЪреА рдЧреЛрд╖реНрдЯ рд░рд╛рд╣рд┐рд▓реА рдЖрд╣реЗ. рдмрджрд▓ рдЬрддрди рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдкрд░рдд рдиреЗрд▓реЗ рдЬрд╛рдИрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдУрд╕рд╛рдареА рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдХреА рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдвреЗ рдЬрд╛рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:
рдпрд╛рдирдВрддрд░, рдирд╡реАрди рдкреБрд▓ рд╡рд┐рдирдВрддреА рдХрд┐рдВрд╡рд╛ рдХрдорд┐рдЯ рджрд┐рд╕рд▓реНрдпрд╛рдиреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдИрд▓. рдХрдорд┐рдЯрдордзреНрдпреЗ рддреНрд░реБрдЯреА рдЕрд╕рд▓реНрдпрд╛рд╕, рдмрдбреА рд╣реЗ рдкреБрд▓ рд╡рд┐рдирдВрддреА рдкреГрд╖реНрдард╛рд╡рд░ рд╕реВрдЪрд┐рдд рдХрд░реЗрд▓.
AppVeyor
AppVeyor рд╕реЗрдЯ рдХрд░рдгреЗ рд╣реЗ Buddy рд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ, рдХрд╛рд░рдг рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдШрдбрддреЗ рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ *.yml рдлрд╛рдЗрд▓ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдордзреАрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдЯреЕрдмрд╡рд░ рдЬрд╛рдКрдпрд╛:
рдЪрд▓рд╛ рд╣реЗ рдкреГрд╖реНрда рдЦрд╛рд▓реА рд╕реНрдХреНрд░реЛрд▓ рдХрд░реВ рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЕрд╢реЗ рдмрдЪрдд рд╕рдХреНрд╖рдо рдХрд░реВ:
рдЖрддрд╛ рдЖрдкрдг рдкрд░реНрдпрд╛рд╡рд░рдг рдЯреЕрдмрд╡рд░ рдЬрд╛рдК рдпрд╛, рдЬрд┐рдереЗ рдЖрдкрдг рдЕрд╕реЗрдВрдмрд▓реАрд╕рд╛рдареА рдкреНрд░рддрд┐рдорд╛ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ:
рдЬрд░ рддреБрдореНрд╣реА рдорд╛рдЧреАрд▓ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрд▓реЗ рдЕрд╕рддреАрд▓, рддрд░ рддреБрдореНрд╣реА рдпрд╛ рджреЛрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рд╢реА рдкрд░рд┐рдЪрд┐рдд рдЖрд╣рд╛рдд тИТ PVS_KEY ╨╕ PVS_USERNAME. рдирд╕рд▓реНрдпрд╛рд╕, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ рдХреА рддреЗ PVS-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдЪреА рдкрдбрддрд╛рд│рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. рднрд╡рд┐рд╖реНрдпрд╛рдд рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рдкрд╛рд╣реВ.
рдЦрд╛рд▓реА рддреНрдпрд╛рдЪ рдкреГрд╖реНрдард╛рд╡рд░ рдЖрдореНрд╣реА рдХреЕрд╢рд┐рдВрдЧрд╕рд╛рдареА рдлреЛрд▓реНрдбрд░ рд╕реВрдЪрд┐рдд рдХрд░рддреЛ:
рдЖрдореНрд╣реА рдЕрд╕реЗ рди рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдХрд╛рд╣реА рдлрд╛рдпрд▓реАрдВрдРрд╡рдЬреА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВ, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╛рдЗрд▓реНрд╕рдордзреВрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд│реЗрд▓. рдореНрд╣рдгреВрди, рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдЪреЗ рдирд╛рд╡ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.
рдЖрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ. рдЪрд╛рдЪрдгреА рдЯреЕрдм рдЙрдШрдбрд╛ рдЖрдгрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╡рдбрд╛:
рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:
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 рдкреНрд░рдорд╛рдгреЗ, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ рдлреЛрд▓реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ; рдкрд░рдВрддреБ рдХреБрдареЗрддрд░реА рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдирдиреНрдп рдХреА рддрдпрд╛рд░ рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЕрд╢реЗ рдХреЗрд▓реЗрд▓рд╛ рддреБрдХрдбрд╛ рдУрд╡реНрд╣рд░рд░рд╛рдЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рдкрдЯрд╡реВрди рджреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛. рдореНрд╣рдгреВрди, рд╡рд░ рдЪрд░реНрдЪрд╛ рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рддрдд рдПрдХреАрдХрд░рдг рд╕реЗрд╡реЗрд╡рд░ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рдердо рдЦрд╛рддреНрд░реА рдХрд░рд╛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЕрд╢рд┐рдВрдЧрдордзреНрдпреЗ рд╕рдорд╕реНрдпрд╛ рдпреЗрдгрд╛рд░ рдирд╛рд╣реАрдд.
рдЖрдкрдг рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж. рдХрд╛рд╣реАрддрд░реА рдХрд╛рд░реНрдп рдХрд░рдд рдирд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдореЛрдХрд│реНрдпрд╛ рдордирд╛рдиреЗ рд▓рд┐рд╣рд╛
рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: Maxim Zvyagintsev.
рд╕реНрддреНрд░реЛрдд: www.habr.com