C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
GitLab рдЖрд╡рдбрддреЗ рдЖрдгрд┐ рдмрдЧреНрд╕рдЪрд╛ рддрд┐рд░рд╕реНрдХрд╛рд░ рдХрд░рддрд╛рдд? рддреБрдордЪреНрдпрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдбрдЪреА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реБрдзрд╛рд░реВ рдЗрдЪреНрдЫрд┐рддрд╛? рдордЧ рддреБрдореНрд╣реА рдпреЛрдЧреНрдп рдард┐рдХрд╛рдгреА рдЖрд▓рд╛ рдЖрд╣рд╛рдд. рдЖрдЬ рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рдорд░реНрдЬ рд╡рд┐рдирдВрддреНрдпрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА PVS-Studio C# рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╕реЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╕рд╛рдВрдЧреВ. рдпреБрдирд┐рдХреЙрд░реНрди рдореВрдб рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдЖрдирдВрджреА рд╡рд╛рдЪрди рдХрд░рд╛.

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

рддрд╕реЗ, рдЖрдореНрд╣реА PVS-Studio 7.08 рд░рд┐рд▓реАрдЭ рдХреЗрд▓реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдмрд░реНтАНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдХреЗрд▓реНрдпрд╛ рдордиреЛрд░рдВрдЬрдХ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрдердГ

  • Linux рдЖрдгрд┐ macOS рд╕рд╛рдареА C# рд╡рд┐рд╢реНрд▓реЗрд╖рдХ;
  • рд░рд╛рдпрдбрд░рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрди;
  • рдирд╡реАрди рдлрд╛рдЗрд▓ рд╕реВрдЪреА рддрдкрд╛рд╕рдгреА рдореЛрдб.

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

рдкреВрд░реНрд╡реА, рдХрд╛рд╣реА рдлрд╛рдЗрд▓реНрд╕ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдХрдбреЗ рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╣ .xml рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ. рдкрд░рдВрддреБ рд╣реЗ рдлрд╛рд░ рд╕реЛрдпреАрдЪреЗ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣реА .txt рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд▓реА рдЖрд╣реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдЬреАрд╡рди рдЦреВрдк рд╕реЛрдкреЗ рд╣реЛрддреЗ.

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╛рдпрд▓реА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдзреНрд╡рдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ --sourceFiles (-f) рдЖрдгрд┐ рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╣ .txt рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рд╛. рд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

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

рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреЗ рддрддреНрддреНрд╡

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

рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдХрд╢реА рджрд┐рд╕рддреЗ:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдореНрд╣рдгрдЬреЗрдЪ рд╢рд╛рдЦреЗрдд рдЬреНрдпрд╛ рддреНрд░реБрдЯреА рд╣реЛрддреНрдпрд╛ рдмрджрд▓, рдореБрдЦреНрдп рд╢рд╛рдЦреЗрдд рдЬрд╛рдИрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдирдХреЛ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛрдбрддреЛ рдЖрдгрд┐ рдЖрддрд╛ рдЖрдХреГрддреА рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ рдмрджрд▓ реи рдЖрдгрд┐, рдХрд╛рд╣реА рддреНрд░реБрдЯреА рдирд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рд╕реНрд╡реАрдХрд╛рд░рддреЛ, рдЕрдиреНрдпрдерд╛ рдЖрдореНрд╣реА рддреА рдирд╛рдХрд╛рд░рддреЛ.

рддрд╕реЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдорд┐рдЯрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ C/C++ рд╕рд╛рдареА рд╡рд┐рдирдВрддреНрдпрд╛ рдкреБрд▓ рдХрд░рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рддреНрдпрд╛рдмрджреНрджрд▓ рд╡рд╛рдЪреВ рд╢рдХрддрд╛. рдпреЗрдереЗ.

рдЧрд┐рдЯреЕрдм

рдЧрд┐рдЯреЕрдм рд╣реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд DevOps рд▓рд╛рдЗрдлрд╕рд╛рдпрдХрд▓ рдЯреВрд▓ рдЖрд╣реЗ рдЬреЗ Git рд╕рд╛рдареА рдХреЛрдб рд░рд┐рдкреЙрдЭрд┐рдЯрд░реА рдореЕрдиреЗрдЬрдореЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡рд┐рдХреА, рдЗрд╢реНрдпреВ рдЯреНрд░реЕрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрдгрд┐ рдЗрддрд░ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрд╕рд╣ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рддреБрдореНрд╣реА рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рдиреЛрдВрджрдгреА рдХрд░рдгреЗ рдЖрдгрд┐ рдЕрдкрд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╕рд▓реНрдпрд╛рд╕, рдореА рд╕реБрдЪрд╡рд┐рддреЛ рдПрдХ рд▓реЗрдЦ рдорд╛рдЭреЗ рд╕рд╣рдХрд╛рд░реА.

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

рдЖрддрд╛ рдХрд╛рдп рд╣реЛрдИрд▓ рд╣реЗ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреАрдХрдбреЗ рдкрд╛рд╣рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджреЗрддреЛ:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рд▓рд╛ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА .NET Core SDK 3 рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреБрдореНрд╣рд╛рд▓рд╛ Microsoft рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреВрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓. рд╡рд┐рд╡рд┐рдз рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгрд╛рдВрд╕рд╛рдареА рдорд╛рдпрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ рдЬреЛрдбрдгреЗ рд╕рдВрдмрдВрдзрд┐рдд рджрд╕реНрддрдРрд╡рдЬрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ.

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рд▓рд╛ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░рд╡рд╛рдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпреЗрдереЗ рддреБрдореНрд╣реА рдЪрд╛рдЪрдгреА рдкрд░рд╡рд╛рдирд╛ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдбрд╛рдЙрдирд▓реЛрдб рдкреГрд╖реНрда.

рд╢реЗрд░рд╛. рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдСрдкрд░реЗрд╢рди рдореЛрдбрд╕рд╛рдареА (рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг) рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рдкрд░рд╡рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдСрдкрд░реЗрд╢рдирдЪрд╛ рд╣рд╛ рдореЛрдб рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЭ рдкрд░рд╡рд╛рдиреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рд╣реЗ "рд╕рдВрджреЗрд╢" рдлреАрд▓реНрдбрдордзреНрдпреЗ рд╕реВрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛.

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

рдЖрддрд╛, рддреБрдордЪреНрдпрд╛ рдбреЛрд│реНрдпрд╛рдВрд╕рдореЛрд░ рдХрд╛рдорд╛рдЪрд╛ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрд╕рд▓реНрдпрд╛рдиреЗ рддреБрдореНрд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рдкреБрдвреЗ рдЬрд╛рдК рд╢рдХрддрд╛. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрд╛рдЗрд▓ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ .gitlab-ci.yml рдХрд┐рдВрд╡рд╛, рддреЗ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рд▓реНрдпрд╛рд╕, рддреЗ рддрдпрд╛рд░ рдХрд░рд╛. рддреЗ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ -> CI/CD рд╕реЗрдЯ рдХрд░рд╛.

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ рдЖрдореНрд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдЖрд╣реЛрдд. рдЪрд▓рд╛ рдкреНрд░рдердо рдХреЛрдб рд▓рд┐рд╣реВ рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рдкрд░рд╡рд╛рдирд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реЗрд▓:

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - 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-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рддрдпрд╛рд░реА рдХрд░рдд рдЖрд╣реЗ:

  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update

рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЬреЛрдбрдгреЗ:

  - 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-dotnet

рдкрд░рд╡рд╛рдирд╛ рд╕рдХреНрд░рд┐рдп рдХрд░рдгреЗ:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡.

$PVS_KEY - рдЙрддреНрдкрд╛рджрди рдХреА.

рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреА рдкреНрд░рдХрд▓реНрдк рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЬреЗрдереЗ $CI_PROJECT_DIR - рдкреНрд░рдХрд▓реНрдк рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдЪрд╛ рдкреВрд░реНрдг рдорд╛рд░реНрдЧ:

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

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

рддреБрдореНрд╣реА рдХреНрд▓рд┐рдХ рдХрд░реВрди рдкрд░рд╡рд╛рдирд╛ рдорд╛рд╣рд┐рддреА рдЕрд╕рд▓реЗрд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд▓ рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛ рд╕реЗрдЯрд┐рдВрдЧ, рдЖрдгрд┐ рдирдВрддрд░ - рдЪрд╛рд▓реВ CI/CD.

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЙрдШрдбрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдВрдбреЛрдордзреНрдпреЗ, рдЖрдпрдЯрдо рд╢реЛрдзрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕, рдЙрдЬрд╡реАрдХрдбреАрд▓ рдмрдЯрдгрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рд╡рд┐рд╕реНрддреГрдд рдХрд░рд╛ рдЖрдгрд┐ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЬреЛрдбрд╛. рдкрд░рд┐рдгрд╛рдо рдЕрд╕реЗ рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрддрд╛ рддреБрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдХрдбреЗ рдЬрд╛рдК рд╢рдХрддрд╛. рдкреНрд░рдердо, рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбреВрдпрд╛. рдзреНрд╡рдЬрд╛рд▓рд╛ -t рдЖрдореНрд╣реА рдзреНрд╡рдЬрд╛рдЪреНрдпрд╛ рдирд┐рд░рд╛рдХрд░рдгрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдкрд╛рд╕ рдХрд░рддреЛ -o рдлрд╛рдЗрд▓рдЪрд╛ рдорд╛рд░реНрдЧ рд▓рд┐рд╣рд╛ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░рд┐рдгрд╛рдо рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреАрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдбрдордзреНрдпреЗ рджреЗрдЦреАрд▓ рд░рд╕ рдЖрд╣реЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЬреЗрд╡реНрд╣рд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдбрдордзреНрдпреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рдЗрд╢рд╛рд░реЗ рдЬрд╛рд░реА рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реНрдпрд╛рдЪреА рдорд╛рд╣рд┐рддреА рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдСрдкрд░реЗрд╢рди рдерд╛рдВрдмрд╡рд┐рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ. рд╣рд╛ рддреБрдХрдбрд╛ рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕рддреЛ:

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

рд░рд┐рдЯрд░реНрди рдХреЛрдб рдмрд┐рдЯ рдорд╛рд╕реНрдХрдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рдЪреЗрддрд╛рд╡рдгреА рдЬрд╛рд░реА рдХреЗрд▓реА рдЧреЗрд▓реА, рддрд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб 8 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪрд╛ рдЕрд╕реЗрд▓. рдЬрд░ рдкрд░рд╡рд╛рдирд╛ рдПрдХрд╛ рдорд╣рд┐рдиреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЭрд╛рд▓рд╛, рддрд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб 4 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪрд╛ рдЕрд╕реЗрд▓. рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛рд╕, рдЖрдгрд┐ рдкрд░рд╡рд╛рдирд╛ рдПрдХрд╛ рдорд╣рд┐рдиреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд рдХрд╛рд▓рдмрд╛рд╣реНрдп рд╣реЛрдИрд▓, рдХреЛрдб рдкрд░рддрд╛рд╡рд╛, рджреЛрдиреНрд╣реА рдореВрд▓реНрдпреЗ рд▓рд┐рд╣рд┐рд▓реА рдЬрд╛рддреАрд▓: рд╕рдВрдЦреНрдпрд╛ рдПрдХрддреНрд░ рдЬреЛрдбрд╛ рдЖрдгрд┐ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдХреЛрдб рдорд┐рд│рд╡рд╛ - 8+4=12. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдЯреНрд╕ рддрдкрд╛рд╕реВрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рд╡рд┐рд╡рд┐рдз рд░рд╛рдЬреНрдпрд╛рдВрдЪреА рдорд╛рд╣рд┐рддреА рдорд┐рд│рд╡рддрд╛ рдпреЗрддреЗ. рджрд╕реНрддрдРрд╡рдЬрд╛рдЪреНрдпрд╛ "pvs-studio-dotnet (Linux / macOS) рд░рд┐рдЯрд░реНрди рдХреЛрдб" рд╡рд┐рднрд╛рдЧрд╛рдд рд░рд┐рдЯрд░реНрди рдХреЛрдбрдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ.PVS-Studio рд╡рд╛рдкрд░реВрди рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реВрди рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдУ / рдПрдордПрд╕рдмрд┐рд▓реНрдб / .рдиреЗрдЯ рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдкрд╛рд╕рдд рдЖрд╣реЗ".

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рд░рд┐рдЯрд░реНрди рдХреЛрдбрдордзреНрдпреЗ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ рдЬреЗрдереЗ 8 рджрд┐рд╕рддреЛ.

  - exit_code=$((($exit_code & 8)/8))

рд░рд┐рдЯрд░реНрди рдХреЛрдбрдордзреНрдпреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреНрд░рдорд╛рдВрдХрд╛рдЪрд╛ рдереЛрдбрд╛рд╕рд╛ рднрд╛рдЧ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ 1 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓, рдЕрдиреНрдпрдерд╛ рдЖрдореНрд╣рд╛рд▓рд╛ 0 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓.

рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ. рдЖрдкрдг рд╣реЗ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╕рд╛рдареА рдПрдХ рдЬрд╛рдЧрд╛ рддрдпрд╛рд░ рдХрд░реВрдпрд╛. рдЬреЗрд╡реНрд╣рд╛ рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рдпреЗрддреЗ рддреЗрд╡реНрд╣рд╛рдЪ рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

merge:
  script:
  only:
  - merge_requests

рдЪрд▓рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╡рд░рдЪ рдкреБрдвреЗ рдЬрд╛рдКрдпрд╛. рдорд▓рд╛ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛ рдХреА рдЖрднрд╛рд╕реА рдорд╢реАрдирд▓рд╛ рдХрд╛рд╣реАрд╣реА рдорд╛рд╣рд┐рддреА рдирд╛рд╣реА рдореВрд│/рдорд╛рд╕реНрдЯрд░. рдЪрд▓рд╛ рддрд░ рдордЧ рддрд┐рд▓рд╛ рдереЛрдбреА рдорджрдд рдХрд░реВрдпрд╛:

  - git fetch origin

рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╢рд╛рдЦрд╛рдВрдордзреАрд▓ рдлрд░рдХ рдорд┐рд│рддреЛ рдЖрдгрд┐ рдирд┐рдХрд╛рд▓ рдЬрддрди рдХрд░рддреЛ txt рдлрд╛рдЗрд▓:

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

рдХреБрдареЗ $CI_COMMIT_SHA - рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдХрдорд┐рдЯрдЪрд╛ рд╣реЕрд╢.

рдкреБрдвреЗ, рдЖрдореНрд╣реА рдзреНрд╡рдЬ рд╡рд╛рдкрд░реВрди рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕реВрдЪреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рддреЛ -f. рдЖрдореНрд╣реА рдкреВрд░реНрд╡реА рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗрд▓реА .txt рдлрд╛рдИрд▓ рддреНрдпрд╛рдд рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ. рдмрд░рдВ, рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪреНрдпрд╛ рд╕рд╛рджреГрд╢реНрдпрд╛рдиреЗ, рдЖрдореНрд╣реА рд░рд┐рдЯрд░реНрди рдХреЛрдб рдкрд╛рд╣рддреЛ:

  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi

рд╡рд┐рд▓реАрдиреАрдХрд░рдг рд╡рд┐рдирдВрддреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕реЗрд▓:

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

рд╕рд░реНрд╡ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд▓реЙрдЧ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рдЖрдореНрд╣реА рд▓реЗрдмрд▓ рд╡рд╛рдкрд░рддреЛ after_script рдЖрдгрд┐ рдЙрдкрдпреБрдХреНрддрддрд╛ plog-рдХрдиреНрд╡реНрд╣рд░реНрдЯрд░:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

рдЙрдкрдпреБрдХреНрддрддрд╛ plog-рдХрдиреНрд╡реНрд╣рд░реНрдЯрд░ рд╣рд╛ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдкрд╛рд░реНрд╕рд░ рдПрд░рд░ рд░рд┐рдкреЛрд░реНрдЯреНрд╕рдЪреЗ рдПрдЪрдЯреАрдПрдордПрд▓ рд╕рд╛рд░рдЦреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рд╕реНрд╡рд░реВрдкрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдЙрдкрд╡рд┐рднрд╛рдЧ "рдкреНрд▓реЙрдЧ рдХрдиреНрд╡реНрд╣рд░реНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА" рдордзреНрдпреЗ рджрд┐рд▓реЗ рдЖрд╣реЗ. рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд╛рдЧ.

рддрд╕реЗ, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ IDE рд╡рд░реВрди рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ .json рдЕрд╣рд╡рд╛рд▓рд╛рдВрд╕рд╣ рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рдЕрд╕реЗрд▓, рддрд░ рдореА рдЖрдордЪреНрдпрд╛ рдкреНрд▓рдЧрдЗрди IDE рд░рд╛рдпрдбрд░рд╕рд╛рдареА. рдордзреНрдпреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдЪреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ рд╕рдВрдмрдВрдзрд┐рдд рджрд╕реНрддрдРрд╡рдЬ.

рд╕реЛрдпреАрд╕рд╛рдареА, рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ .gitlab-ci.yml рдкреВрд░реНрдг:

image: debian

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - 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-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  
after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

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

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкрд╛рд╣рд┐рд▓реЗ рдиреЛрдХрд░реА рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реА - рдпрд╢, рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЖрд╣реЗ. рдЖрддрд╛ рддреБрдореНрд╣реА рдХрд╛рдп рдХреЗрд▓реЗ рдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдК рд╢рдХрддрд╛.

рдХрд╛рдорд╛рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ

рдХрд╛рдорд╛рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА, рдПрдХ рд╕рд╛рдзрд╛ рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░реВрдпрд╛ (рдордзреНрдпреЗ рдорд╛рд╕реНрдЯрд░) рдЬреНрдпрд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рдлрд╛рдИрд▓реНрд╕ рдЕрд╕рддреАрд▓. рддреНрдпрд╛рдирдВрддрд░, рджреБрд╕рд░реНтАНрдпрд╛ рд╢рд╛рдЦреЗрдд рдЖрдореНрд╣реА рдлрдХреНрдд рдПрдХ рдлрд╛рдИрд▓ рдмрджрд▓реВ рдЖрдгрд┐ рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ.

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

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

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

рддреНрд░реБрдЯреАрд╕рд╣ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реНрдпрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╣реВ. рддрд╕реЗрдЪ рдлрдХреНрдд рдПрдХ рдлрд╛рдИрд▓ рдкрд╛рд░реНрд╕ рдХреЗрд▓реА рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдзреНрд╡рдЬ рдЬреЛрдбрд▓рд╛ -r pvs-studio-dotnet рд▓рд╛рдБрдЪ рд▓рд╛рдЗрдирд╡рд░:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдореНрд╣реА рдкрд╛рд╣рддреЛ рдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рд▓рд╛ рдПрдХ рддреНрд░реБрдЯреА рдЖрдврд│рд▓реА рдЖрдгрд┐ рддреНрдпрд╛рдиреЗ рд╢рд╛рдЦрд╛ рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджрд┐рд▓реА рдирд╛рд╣реА.

рддреНрд░реБрдЯреАрд╢рд┐рд╡рд╛рдп рдЙрджрд╛рд╣рд░рдг рддрдкрд╛рд╕реВрдпрд╛. рдХреЛрдб рджреБрд░реБрд╕реНрдд рдХрд░рдгреЗ:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

рд╡рд┐рд▓реАрди рд╡рд┐рдирдВрддреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░рд┐рдгрд╛рдо:

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддреЛ, рдХреЛрдгрддреНрдпрд╛рд╣реА рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛ рдирд╛рд╣реАрдд рдЖрдгрд┐ рдХрд╛рд░реНрдп рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реА, рдЬреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рддрдкрд╛рд╕рд╛рдпрдЪреЗ рд╣реЛрддреЗ.

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

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

рдЖрдкрд▓реНрдпрд╛ рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж.

C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЖрдкрдг рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: рдирд┐рдХреЛрд▓реЗ рдорд┐рд░реЛрдиреЛрд╡. C# рд╕рд╛рдареА PVS-Studio рд╡рд╛рдкрд░реВрди GitLab рдордзреНрдпреЗ рд╡рд┐рд▓реАрдиреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.

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

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