C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
GitLab рд▓рд╛рдИ рдорд╛рдпрд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рд░ рдмрдЧрд╣рд░реВрд▓рд╛рдИ рдШреГрдгрд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ? рдЖрдлреНрдиреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЧреБрдгрд╕реНрддрд░ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ? рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрдВ рд╕рд╣реА рдард╛рдЙрдБрдорд╛ рдЖрдЙрдиреБрднрдПрдХреЛ рдЫред рдЖрдЬ рд╣рд╛рдореА рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди PVS-Studio C# рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╕рд░реА рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмрддрд╛рдЙрдиреЗрдЫреМрдВред рдПрдХ рдпреБрдирд┐рдХрд░реНрди рдореВрдб рд░ рд╕рдмреИрд▓рд╛рдИ рдЦреБрд╢реА рдкрдвреНрдиреБрд╣реЛрд╕реНред

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

рд╡реИрд╕реЗ, рд╣рд╛рдореАрд▓реЗ PVS-Studio 7.08 рдЬрд╛рд░реА рдЧрд░реНрдпреМрдВ, рдЬрд╕рдорд╛ рд╣рд╛рдореАрд▓реЗ рдзреЗрд░реИ рдЪреАрдЬрд╣рд░реВ рдЧрд░реНрдпреМрдВ рд░реЛрдЪрдХред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐:

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

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

рдкрд╣рд┐рд▓реЗ, рдХреЗрд╣рд┐ рдлрд╛рдЗрд▓рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдорд╛ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдХреЛ рд╕рд╛рде рдПрдХ .xml рдкрд╛рд╕ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛред рддрд░ рдпреЛ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирднрдПрдХреЛрд▓реЗ, рд╣рд╛рдореАрд▓реЗ .txt рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдердкреЗрдХрд╛ рдЫреМрдВ, рдЬрд╕рд▓реЗ рдЬреАрд╡рдирд▓рд╛рдИ рдзреЗрд░реИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫред

рд╡рд┐рд╢реЗрд╖ рдлрд╛рдЗрд▓рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдЭрдгреНрдбрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрдкрд░реНрдЫ -- рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВ (-f) рд░ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдХреЛ рд╕рд╛рде .txt рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпреЛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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

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

рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╕рд┐рджреНрдзрд╛рдиреНрдд

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

рдпреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

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

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╣рд╛рдореА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдЫреМрдВ рдкрд░рд┐рд╡рд░реНрддрди реи рд░, рдпрджрд┐ рдХреБрдиреИ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ, рд╣рд╛рдореА рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫреМрдВ, рдЕрдиреНрдпрдерд╛ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдЫреМрдВред

рд╡реИрд╕реЗ, рдпрджрд┐ рддрдкрд╛рдЗрдБ C/C++ рдХреЛ рд▓рд╛рдЧрд┐ рдХрдорд┐рдЯрд╣рд░реВ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБ.

GitLab

GitLab рдПрдЙрдЯрд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд DevOps рд▓рд╛рдЗрдлрд╕рд╛рдпрдХрд▓ рдЙрдкрдХрд░рдг рд╣реЛ рдЬрд╕рд▓реЗ Git рдХреЛ рдЖрдлреНрдиреИ рд╡рд┐рдХреА, рдореБрджреНрджрд╛ рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рдкреНрд░рдгрд╛рд▓реА, CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдХреЛ рд╕рд╛рде рдХреЛрдб рднрдгреНрдбрд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред

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

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

рдЕрдм рдХреЗ рд╣реБрдиреЗрдЫ рднрдиреЗрд░ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рдирд┐рдореНрди рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ рд╣реЗрд░реНрди рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫреБ:

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓рд╛рдИ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрди .NET Core SDK 3 рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБ рдЕрдШрд┐ рддрдкрд╛рдИрдВрд▓реЗ Microsoft рднрдгреНрдбрд╛рд░рд╣рд░реВ рдердкреНрдиреБ рдкрд░реНрдЫ рдЬрд╕рдмрд╛рдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рд╣реБрдиреЗрдЫрдиреНред рд╡рд┐рднрд┐рдиреНрди рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ Microsoft рднрдгреНрдбрд╛рд░рд╣рд░реВ рдердкреНрджреИ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ.

рдкреНрдпрд╛рдХреЗрдЬ рдкреНрд░рдмрдиреНрдзрдХ рдорд╛рд░реНрдлрдд PVS-Studio рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ PVS-Studio рднрдгреНрдбрд╛рд░рд╣рд░реВ рдкрдирд┐ рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рддрд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░рд╣рд░реВ рдердкреНрджреИ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд╛рдЧрдЬрд╛рддрдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЦрдгреНрдб.

рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓рд╛рдИ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрди рдЗрдЬрд╛рдЬрддрдкрддреНрд░ рдХреБрдЮреНрдЬреА рдЪрд╛рд╣рд┐рдиреНрдЫред рддрдкрд╛рдИрдВ рдорд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдбрд╛рдЙрдирд▓реЛрдб рдкреГрд╖реНрда.

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

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

рдЕрдм, рддрдкрд╛рдИрдВрдХреЛ рдЖрдБрдЦрд╛ рдЕрдЧрд╛рдбрд┐ рдХрд╛рдордХреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд░рд╛рдЦреЗрд░, рддрдкрд╛рдИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреНрди рдЕрдЧрд╛рдбрд┐ рдмрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдлрд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ gitlab-ci.yml рд╡рд╛, рдпрджрд┐ рдпреЛ рдЕрд╡рд╕реНрдерд┐рдд рдЫреИрди рднрдиреЗ, рдпрд╕рд▓рд╛рдИ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕рд▓рд╛рдИ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдирд╛рдордорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ -> CI/CD рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреБрд╣реЛрд╕реН.

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ 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

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рднрдгреНрдбрд╛рд░ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдердкреНрджреИ:

  - 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-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЦреБрд▓реНрдиреЗ рд╡рд┐рдиреНрдбреЛрдорд╛, рд╡рд╕реНрддреБ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреБрд╣реЛрд╕реН рдЪрд░рд╣рд░реВ, рджрд╛рдпрд╛рдБрдХреЛ рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡рд┐рд╕реНрддрд╛рд░ рд░ рдЪрд░ рдердкреНрдиреБрд╣реЛрд╕реНред рдкрд░рд┐рдгрд╛рдо рдпрд╕реНрддреЛ рд╣реБрдиреБрдкрд░реНрдЫ:

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ 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 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрдирдмрд╛рдЯ рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛ / MSBuild / .NET рдХреЛрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ".

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╣рд╛рдореА рд╕рдмреИ рд░рд┐рдЯрд░реНрди рдХреЛрдбрд╣рд░реВрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдЫреМрдВ рдЬрд╣рд╛рдБ 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-converter:

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

рдЙрдкрдпреЛрдЧрд┐рддрд╛ plog-converter рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ рдЬреБрди рдкрд╛рд░реНрд╕рд░ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВрд▓рд╛рдИ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкрд╣рд░реВрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЬрд╕реНрддреИ HTMLред рдЙрдкрдпреЛрдЧрд┐рддрд╛рдХреЛ рдердк рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЙрдкрдЦрдгреНрдб "рдкреНрд▓рдЧ рдХрдиреНрднрд░реНрдЯрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛" рдорд╛ рджрд┐рдЗрдПрдХреЛ рдЫред рдХрд╛рдЧрдЬрд╛рддрдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЦрдгреНрдб.

рд╡реИрд╕реЗ, рдпрджрд┐ рддрдкрд╛рдИрдВ 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

рдПрдХрдЪреЛрдЯрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдлрд╛рдЗрд▓рдорд╛ рд╕рдмреИ рдердкреЗрдкрдЫрд┐, рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкреНрд░рддрд┐рдмрджреНрдз рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рдЫ рднрдиреЗрд░ рд╣реЗрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЬрд╛рдиреБрд╣реЛрд╕реН CI / CD -> рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ -> рджреМрдбрдиреЗред рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди рд╡рд┐рдиреНрдбреЛ рдЦреБрд▓реНрдиреЗрдЫ, рдЬрд╕рдХреЛ рдЕрдиреНрддреНрдпрдорд╛ рдирд┐рдореНрди рд╣реБрдиреБрдкрд░реНрдЫ:

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

рдХрд╛рдо рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ

рдХрд╛рдордХреЛ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд▓рд╛рдЧрд┐, рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ (in рдорд╛рд╕реНрдЯрд░) рдЬрд╕рдорд╛ рдзреЗрд░реИ рдлрд╛рдЗрд▓рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреНред рддреНрдпрд╕ рдкрдЫрд┐, рдЕрд░реНрдХреЛ рд╢рд╛рдЦрд╛рдорд╛ рд╣рд╛рдореА рдХреЗрд╡рд▓ рдПрдЙрдЯрд╛ рдлрд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреМрдВред

рджреБрдИрд╡рдЯрд╛ рдХреЗрд╕рд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВ: рдЬрдм рдкрд░рд┐рдорд╛рд░реНрдЬрд┐рдд рдлрд╛рдЗрд▓рдорд╛ рддреНрд░реБрдЯрд┐ рд╣реБрдиреНрдЫ рд░ рдХрд╣рд┐рд▓реЗ рд╣реБрдБрджреИрдиред рдкрд╣рд┐рд▓реЛ, рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

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

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

рддреНрд░реБрдЯрд┐рдХреЛ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдирддрд┐рдЬрд╛ рд╣реЗрд░реМрдВред рд╕рд╛рдереИ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдлрд╛рдЗрд▓ рдкрд╛рд░реНрд╕ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди, рдореИрд▓реЗ рдЭрдгреНрдбрд╛ рдердкреЗ -r pvs-studio-dotnet рд▓рдиреНрдЪ рд▓рд╛рдЗрдирдорд╛:

C# рдХреЛ рд▓рд╛рдЧрд┐ PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ GitLab рдорд╛ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓реЗ рддреНрд░реБрдЯрд┐ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдпреЛ рд░ рд╢рд╛рдЦрд╛рд╣рд░реВ рдорд░реНрдЬ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдПрдиред

рддреНрд░реБрдЯрд┐ рдмрд┐рдирд╛ рдЙрджрд╛рд╣рд░рдг рдЬрд╛рдБрдЪ рдЧрд░реМрдВред рдХреЛрдб рд╕рдЪреНрдпрд╛рдЙрдБрджреИ:

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

рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░рд┐рдгрд╛рдо:

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

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

рд╢рд╛рдЦрд╛рд╣рд░реВ рдорд░реНрдЬ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдЦрд░рд╛рдм рдХреЛрдб рд╣рдЯрд╛рдЙрди рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░ рд░рдорд╛рдЗрд▓реЛ рдЫред рддреНрдпрд╕реИрд▓реЗ рдпрджрд┐ рддрдкрд╛рдЗрдБ CI/CD рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрдореНрдмреЗрдб рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпреЛ рдПрдХрджрдо рд╕рд░рд▓ рдЧрд░рд┐рдиреНрдЫред

рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рди рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рджред

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

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

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