рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

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

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

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

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

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

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

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рджреА рдЬрд╛рддреА рд╣реИ -S:

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

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

рдЕрдм, рдЗрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирдП рдХреЛрдб рдХрд╛ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд▓реЙрдЧ-рдХрдиреНрд╡рд░реНрдЯрд░ рдЭрдВрдбрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ --рд╕рдВрдХреЗрдд-рдЪреЗрддрд╛рд╡рдиреА:

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

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

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

рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ .travis.yml. рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдПрдХ рдЕрд▓рдЧ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд░рдЦреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ .travis.yml (рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдирд╛рдо.рд╢ рдлрд╝рдВрдХреНрд╢рди_рдирд╛рдо).

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

install:
  - bash .travis.sh travis_install

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рд╛рдЗрдлрд╝рди рд╣рдЯрд╛рдХрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рдлрд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ .travis.sh рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реЗрдЯрдЕрдк рдЬреЛрдбрд╝реЗрдВ рдЯреНрд░реИрд╡рд┐рд╕_рдЗрдВрд╕реНрдЯреЙрд▓():

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
}

рдпрд╣ рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реАрдПрдордХреЗ рдмрд┐рд▓реНрдб рд╣реИ:

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_BRANCH. рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  • $рдЯреНрд░реИрд╡рд┐рд╕_рдкреБрд▓_рдЕрдиреБрд░реЛрдз рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЕрд╕рддреНрдпрдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рд╛рдЦрд╛ рд╣реИ;
  • $TRAVIS_REPO_SLUG рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдирд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗрд╡рд╛ рдХреЛ рдХрдорд┐рдЯ рдХреЛ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧреАред

рдЖрдЗрдП рдХреЛрдб рдХреА рдЗрд╕ рдкрдВрдХреНрддрд┐ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

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

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

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ A4рдФрд░ рдирд╣реАрдВ рдмреА3->рдП3. рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ A3, рдЬреЛ рдХрд┐ рд╢рд╛рдЦрд╛ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╢реАрд░реНрд╖ рд╣реИ рдореВрд▓.

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

cache:
  directories:
    - .PVS-Studio/

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

рджреЛрд╕реНрдд

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

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

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЙрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдВрдЯреЗрдирд░ рд╣реИ:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдЗрдП рдЕрдм рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

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

рдЕрдм рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ, рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ .рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдмрдбреА рдмрд╛рдж рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рдмрдЪреА рд╣реИ рд╡рд╣ рд╣реИ рдмрдбреА рдореЗрдВ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╕реЗрд╡ рдХрд░рдирд╛ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рд╣рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рдФрд░ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

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

рдРрдкрд╡реЗрдпреЛрд░

AppVeyor рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдмрдбреА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ *.yml рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╡рд▓реЛрдХрди рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдЗрдП рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ рдФрд░ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рд╕реЗрд╡рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:

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

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрдврд╝реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рджреЛ рдЪрд░реЛрдВ рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ - рдкреАрд╡реАрдПрд╕_рдХреБрдВрдЬреА ╨╕ PVS_USERNAME. рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдпреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЙрдирд╕реЗ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд┐рд░ рдорд┐рд▓реЗрдВрдЧреЗред

рдиреАрдЪреЗ рдЙрд╕реА рдкреГрд╖реНрда рдкрд░, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:

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

рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ рдЯреИрдм рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреБрдиреЗрдВ:

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЗрд╕ рдлреЙрд░реНрдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЪрд┐рдкрдХрд╛рдПрдБ:

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 - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАред

рдирд┐рд╖реНрдХрд░реНрд╖

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

рдХрд╣реАрдВ-рдХрд╣реАрдВ, рдЯреНрд░реИрд╡рд┐рд╕-рд╕реАрдЖрдИ рдХреА рддрд░рд╣, рдХреЛрдб рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ; рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рдЬреИрд╕реЗ AppVeyor рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЖрдкрдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЖрдкрдХреЛ рдХреИрд╢реНрдб рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рд╕рддрдд рдПрдХреАрдХрд░рдг рд╕реЗрд╡рд╛ рдкрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЖрдкрдХреЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЕрдЧрд░ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдЦреЗрдВ рд╕рдорд░реНрдерди. рд╣рдо рд╕рд▓рд╛рд╣ рджреЗрдВрдЧреЗ рдФрд░ рдорджрдж рдХрд░реЗрдВрдЧреЗ.

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖реА рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдореИрдХреНрд╕рд┐рдо рдЬрд╝рд┐рд╡рд╛рдЧрд┐рдиреНрддреНрд╕реЗрд╡ред рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ, рдмрдбреА рдФрд░ рдРрдкрд╡реЗрдпреЛрд░ рдореЗрдВ рдХрдорд┐рдЯ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ