
ΠΠΈΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° PVS-Studio ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π½ΠΎ. Π‘Π΅Π³Π° Π½Π°ΡΠΈΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½ Π² Chocolatey, ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Windows. Π‘ΠΌΡΡΠ°ΠΌΠ΅, ΡΠ΅ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»Π΅ΡΠ½ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° PVS-Studio, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π² ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ. ΠΠ° Π΄Π° Π½Π΅ Ρ
ΠΎΠ΄ΠΈΠΌ Π΄Π°Π»Π΅Ρ, Π½Π΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΡΡΠΈΡ Chocolatey. ΠΠ°ΡΠΎ CI ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Azure DevOps.
ΠΡΠΎ ΡΠΏΠΈΡΡΠΊ Ρ Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠΈ ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠ΅ΠΌΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ:
ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΡΠ²Π°ΡΠ° ΡΡΠ°ΡΠΈΡ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Azure DevOps, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½ΡΠΊΠΎΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΡΠ° ΠΏΡΠΎΠΏΡΡΠ½Π°ΡΠΈ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°Ρ.
Π ΡΠ°ΠΊΠ°, Π³Π΅ΡΠΎΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ:
β ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π·ΠΈΡΠΈ C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡΠΈ Π² 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° Windows, Linux ΠΈ macOS ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΊΠΎΠ΄, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° 32-Π±ΠΈΡΠΎΠ²ΠΈ, 64-Π±ΠΈΡΠΎΠ²ΠΈ ΠΈ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ARM ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ. ΠΠΊΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ ΠΊΠ°ΠΊΠΎ Π±ΡΡΠ·ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΡΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° PVS-Studio ΠΈ Π΄Π° ΠΎΡΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ.
β Π½Π°Π±ΠΎΡ ΠΎΡ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, ΠΎΠ±Ρ Π²Π°ΡΠ°ΡΠΈ ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. Π ΡΡΡΡΠ°Π²Π° Π½Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π²Π»ΠΈΠ·Π°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΊΠ°ΡΠΎ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΡΠ΅ ΡΡΠΊΠΎΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΡΡΡΠ΅Ρ ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ.
β ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Windows Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄. Π¦Π΅Π»ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ° ΡΠ΅Π»ΠΈΡ ΠΆΠΈΠ·Π½Π΅Π½ ΡΠΈΠΊΡΠ» Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° ΠΎΡ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π΄ΠΎ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Windows.
ΠΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Chocolatey
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΏΠΎ ΡΠ°Π·ΠΈ . ΠΡΠ»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΅ Π½Π°Π»ΠΈΡΠ½Π° ΠΏΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π° βΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Chocolateyβ. ΠΠ΅ΠΊΠ° ΠΎΠ±ΠΎΠ±ΡΡ Π½ΡΠΊΠΎΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΡΠ°ΠΌ.
ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°:
choco install pvs-studioΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° PVS-Studio:
choco install pvs-studio --version=7.05.35617.2075ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΄ΡΠΎΡΠΎ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° - ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Core. ΠΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅ (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ ΡΡΠ΅Π· βpackage-parameters.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Ρ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Visual Studio 2019:
choco install pvs-studio --package-parameters="'\/MSVS2019'"Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΏΠΎΠ΄ Azure DevOps.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌ, ΡΠ΅ Π·Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΊΠ°ΡΠΎ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½Π° Π°ΠΊΠ°ΡΠ½Ρ, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Build Pipeline ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π°ΠΊΠ°ΡΠ½ΡΠ° Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub, ΠΈΠΌΠ° ΠΎΡΠ΄Π΅Π»Π½Π° . ΠΠ°ΡΠ°ΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ Π½Π°ΠΏΡΠ°Π²ΠΎ Ρ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ».
ΠΡΡΠ²ΠΎ, Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΡΠΈΠ³Π³Π΅Ρ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΏΠΎΡΠΎΡΠ²Π°ΠΉΠΊΠΈ, ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² master ΠΊΠ»ΠΎΠ½:
trigger:
- masterΠ‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ Microsoft-hosted Π°Π³Π΅Π½Ρ Ρ Windows Server 2019 ΠΈ Visual Studio 2019:
pool:
vmImage: 'windows-latest'ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΡΡΠ»ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» (Π±Π»ΠΎΠΊ steps). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠΎΡΡΡΠ΅Ρ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Chocolatey ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ Π·Π° Azure DevOps. ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΠΎ . ΠΠ°ΡΠΈΡΠ½Π΅ΡΠ΅ Get it free. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, Π°ΠΊΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅ Π°Π²ΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ, ΠΏΡΠΎΡΡΠΎ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡ Π°ΠΊΠ°ΡΠ½Ρ, Π° Π°ΠΊΠΎ Π½Π΅, Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΡΡΡΠΎΡΠΎ ΡΠ»Π΅Π΄ Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡ.

Π’ΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΠΊΡΠ΄Π΅ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° Π½Π°ΡΠΈΡΠ½Π΅ΠΌ Π±ΡΡΠΎΠ½Π° ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅.

Π‘Π»Π΅Π΄ ΡΡΠΏΠ΅ΡΠ½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Proceed to organization:

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ Π·Π° Π·Π°Π΄Π°ΡΠ° Chocolatey Π² ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ° tasks ΠΏΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» azure-pipelines.yml:

ΠΠ°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π½Π° Chocolatey ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊ Ρ ΠΏΠΎΠ»Π΅ΡΠ°:

Π’ΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π² ΠΏΠΎΠ»Π΅ΡΠΎ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. Π Nuspec File Name ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ β pvs-studio. ΠΠΊΠΎ Π½Π΅ ΠΏΠΎΡΠΎΡΠΈΠΌ Π²Π΅ΡΡΠΈΡ, ΡΠ΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ Π½ΠΈ ΡΡΡΡΠΎΠΉΠ²Π° Π½Π°ΠΏΡΠ»Π½ΠΎ. ΠΠ°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π±ΡΡΠΎΠ½Π° add ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ».
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'Π‘Π»Π΅Π΄Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° Π½Π°ΡΠΈΡ ΡΠ°ΠΉΠ»:
- task: CmdLine@2
inputs:
script: Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΠ» Ρ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. Π’ΡΠΊ PVSNAME ΠΈ PVSKEY β ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΡΠΈΠΉΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅. Π’Π΅ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π»ΠΎΠ³ΠΈΠ½ ΠΈ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΎΠ½Π΅Π½ ΠΊΠ»ΡΡ PVS-Studio. ΠΠ° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΠΈΠΌ, ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈΠΌ ΠΌΠ΅Π½ΡΡΠΎ Variables->New variable. Π©Π΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ PVSNAME Π·Π° Π»ΠΎΠ³ΠΈΠ½Π° ΠΈ PVSKEY Π·Π° ΠΊΠ»ΡΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠ΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΎΡΠΌΠ΅ΡΠΊΠ° ΠΡΡΠΆΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² ΡΠ°ΠΉΠ½Π° Π·Π° PVSKEY. ΠΠΎΠ΄ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
Ρall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials
βu $(PVSNAME) βn $(PVSKEY)Π©Π΅ ΡΡΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° bat ΡΠ°ΠΉΠ», Π½Π°ΠΌΠΈΡΠ°Ρ ΡΠ΅ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ:
Ρall build.batΠΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΠ°ΠΏΠΊΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°:
Ρall mkdir PVSTestResultsΠ©Π΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
Ρall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
βt .srcchocolatey.sln βo .PVSTestResultsChoco.plog ΠΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΎΡΡΠ΅Ρ Π² HTML ΡΠΎΡΠΌΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠΈΠ»ΠΈΡΠ° PlogConverter:
Ρall "C:Program Files (x86)PVS-StudioPlogConverter.exe"
βt html βo PVSTestResults .PVSTestResultsChoco.plogΠ‘Π΅Π³Π° Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π·Π°Π΄Π°ΡΠ°, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΡΡΠ΅ΡΠ°.
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
trigger:
- master
pool:
vmImage: 'windows-latest'
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
- task: CmdLine@2
inputs:
script: |
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
credentials βu $(PVSNAME) βn $(PVSKEY)
call build.bat
call mkdir PVSTestResults
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
βt .srcchocolatey.sln βo .PVSTestResultsChoco.plog
call "C:Program Files (x86)PVS-StudioPlogConverter.exe"
βt html βo .PVSTestResults .PVSTestResultsChoco.plog
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()ΠΠ°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΠ°ΠΏΠ°Π·ΠΈ->ΠΠ°ΠΏΠ°Π·ΠΈ->Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΠΊΡΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡΡΠ΅ΡΠ°, ΠΊΠ°ΡΠΎ Π²Π»Π΅Π·Π΅ΡΠ΅ Π² ΡΠ°Π±Π° Π·Π° Π·Π°Π΄Π°ΡΠΈ.
ΠΡΠΎΠ΅ΠΊΡΡΡ Chocolatey ΡΡΠ΄ΡΡΠΆΠ° ΠΎΠ±ΡΠΎ 37615 ΡΠ΅Π΄Π° C# ΠΊΠΎΠ΄. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N1
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° βProviderβ Π΅ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Π° ΡΠ°ΠΌΠ° Π½Π° ΡΠ΅Π±Π΅ ΡΠΈ. CrytpoHashProviderSpecs.cs 38
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ Π΅ ΠΎΡΠΊΡΠΈΠ» ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠ°ΠΌΠ° Π½Π° ΡΠ΅Π±Π΅ ΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΌΠ° ΡΠΌΠΈΡΡΠ». ΠΠ΅ΡΠΎΡΡΠ½ΠΎ Π½Π° ΠΌΡΡΡΠΎΡΠΎ Π½Π° Π΅Π΄Π½Π° ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠΎΠΈ Π΄ΡΡΠ³Π°. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΅ ΠΏΡΠ°Π²ΠΎΠΏΠΈΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ° ΠΈ ΠΈΠ·Π»ΠΈΡΠ½ΠΎΡΠΎ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ ΠΌΠΎΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N2
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-480] ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ β&β ΠΎΡΠ΅Π½ΡΠ²Π° ΠΈ Π΄Π²Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π·Π° ΠΊΡΠ°ΡΠΊΠΎ ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ β&&β Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π°. Platform.cs 64
public static PlatformType get_platform()
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.MacOSX:
{
....
}
case PlatformID.Unix:
if(file_system.directory_exists("/Applications")
& file_system.directory_exists("/System")
& file_system.directory_exists("/Users")
& file_system.directory_exists("/Volumes"))
{
return PlatformType.Mac;
}
else
return PlatformType.Linux;
default:
return PlatformType.Windows;
}
}Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° & ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° && ΡΡΡΡΠΎΠΈ ΡΠ΅ Π² ΡΠΎΠ²Π°, ΡΠ΅ Π°ΠΊΠΎ Π»ΡΠ²Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΠΈΠ·ΡΠ°Π·Π° β Π½Π΅Π²Π΅ΡΠ½ΠΎ, Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π° Π΄ΡΡΠ½Π°ΡΠ° ΡΠ°ΡΡ, ΠΊΠΎΠ΅ΡΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΠΈΠ·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° system.directory_exists.
Π ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΡΠΎΠ²Π° Π΅ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π΅Π½ ΠΏΡΠΎΠΏΡΡΠΊ. ΠΠ°, ΡΠΎΠ²Π° ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°, Π·Π°ΠΌΠ΅Π½ΡΠΉΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° & Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° &&, Π½ΠΎ ΠΎΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°, ΡΠΎΠ²Π° Π½Π΅ ΠΎΠΊΠ°Π·Π²Π° Π²Π»ΠΈΡΠ½ΠΈΠ΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π² Π΄ΡΡΠ³ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΎΠ±ΡΡΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ & ΠΈ && ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ Π΄ΡΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΠΈΠ·ΡΠ°Π·Π° ΡΠ°Π±ΠΎΡΠΈ Ρ Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈ/Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ Π³ΡΠ΅ΡΠΊΠΈ, , ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ:
if ((k < nct) & (s[k] != 0.0))ΠΠΎΡΠΈ Π°ΠΊΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡΡ k Π΅ Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ΅Π½, ΡΠΎΠΉ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ²Π°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ IndexOutOfRangeException.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ N3, N4
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-571] ΠΠ·ΡΠ°Π·ΡΡ βshortPromptβ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π²Π΅ΡΠ΅Π½. InteractivePrompt.cs 101
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-571] ΠΠ·ΡΠ°Π·ΡΡ βshortPromptβ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π²Π΅ΡΠ΅Π½. InteractivePrompt.cs 105
public static string
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
....
if (shortPrompt)
{
var choicePrompt = choice.is_equal_to(defaultChoice) //1
?
shortPrompt //2
?
"[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
choice.Substring(1,choice.Length - 1))
:
"[{0}]".format_with(choice.ToUpperInvariant()) //0
:
shortPrompt //4
?
"[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
choice.Substring(1,choice.Length - 1))
:
choice; //0
....
}
....
}Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π½Π°Π»ΠΈΡΠ΅ Π΅ ΡΡΡΠ°Π½Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ΅ΡΠ½Π°ΡΠ½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ: Π°ΠΊΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ, ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ΠΎ Ρ ΡΠΈΡΡΠ° 1, Π΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΎ, ΡΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ 2, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΈΡΡΠΈΠ½Π½ΠΎ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠ΅Π΄ 3. ΠΠΊΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ 1 ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ Π½Π΅Π²ΡΡΠ½ΠΎ, ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π° ΡΠ΅Π΄Π°, ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ Ρ ΡΠΈΡΡΠ° 4, ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ Π² ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΈΡΡΠΈΠ½Π½ΠΎ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠ΅Π΄ 5. Π’Π°ΠΊΠ° ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°, ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ΠΈ Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ 0, Π½ΠΈΠΊΠΎΠ³Π° Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ ΡΠΎΡΠ½ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ Π΅ Π½Π°Π΄ΡΠ²Π°Π» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N5
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-783] ΠΠΎΠΆΠ΅ Π±ΠΈ β?:β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ ΠΎΡ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡ. ΠΠ΅Π³ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π΅ ΠΏΠΎ-Π½ΠΈΡΡΠΊ ΠΎΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ Π² ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΡΠΎ ΠΌΡ. Options.cs 1019
private static string GetArgumentName (...., string description)
{
string[] nameStart;
if (maxIndex == 1)
{
nameStart = new string[]{"{0:", "{"};
}
else
{
nameStart = new string[]{"{" + index + ":"};
}
for (int i = 0; i = 0 && j != 0 ? description [j++ - 1] == '{' : false);
....
return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
}
}ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ Π½Π° ΡΠ΅Π΄:
while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° j Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Ρ Π½ΡΠ»Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ΅ΡΠ½Π°ΡΠ½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΡΠ΅ Π²ΡΡΠ½Π΅ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π΅Π²Π΅ΡΠ½ΠΎ. ΠΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΡΡΠ»ΠΎΡΠΎ Π½Π° ΡΠΈΠΊΡΠ»Π° ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠ°ΠΌΠΎ Π²Π΅Π΄Π½ΡΠΆ. Π‘ΠΌΡΡΠ°ΠΌ, ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΎΡ ΠΊΠΎΠ΄Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π΅ Π·Π°ΠΌΠΈΡΠ»ΠΈΠ».
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N6
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-571] ΠΠ·ΡΠ°Π·ΡΡ βinstalledPackageVersions.Count != 1β Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π²Π΅ΡΠ΅Π½. NugetService.cs 1405
private void remove_nuget_cache_for_package(....)
{
if (!config.AllVersions && installedPackageVersions.Count > 1)
{
const string allVersionsChoice = "ΠΡΠΈΡΠΊΠΈ Π²Π΅ΡΡΠΈΠΈ";
if (installedPackageVersions.Count != 1)
{
choices.Add(allVersionsChoice);
}
....
}
....
}Π’ΡΠΊ ΠΈΠΌΠ° ΡΡΡΠ°Π½Π½ΠΎ Π²Π»ΠΎΠΆΠ΅Π½ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅: installedPackageVersions.Count != 1, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΡΡΠΈΠ½Π½ΠΎ. Π§Π΅ΡΡΠΎ ΡΠ°ΠΊΠΎΠ²Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ° Π³ΡΠ΅ΡΠΊΠ° Π² ΠΊΠΎΠ΄Π°, Π° Π² ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·Π»ΠΈΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N7
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: ΠΠΌΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄ΠΈΠ·ΡΠ°Π·ΠΈ βcommandArguments.contains("-apikey")β ΠΎΡΠ»ΡΠ²ΠΎ ΠΈ ΠΎΡΠ΄ΡΡΠ½ΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° β||β. ArgumentsUtility.cs 42
public static bool arguments_contain_sensitive_information(string
commandArguments)
{
return commandArguments.contains("-install-arguments-sensitive")
|| commandArguments.contains("-package-parameters-sensitive")
|| commandArguments.contains("apikey ")
|| commandArguments.contains("config ")
|| commandArguments.contains("push ")
|| commandArguments.contains("-p ")
|| commandArguments.contains("-p=")
|| commandArguments.contains("-password")
|| commandArguments.contains("-cp ")
|| commandArguments.contains("-cp=")
|| commandArguments.contains("-certpassword")
|| commandArguments.contains("-k ")
|| commandArguments.contains("-k=")
|| commandArguments.contains("-key ")
|| commandArguments.contains("-key=")
|| commandArguments.contains("-apikey")
|| commandArguments.contains("-api-key")
|| commandArguments.contains("-apikey")
|| commandArguments.contains("-api-key");
}ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ, ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠ°Π·ΠΈ ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ΄Π°, Π΅ ΠΊΠΎΠΏΠΈΡΠ°Π» ΠΈ ΠΏΠ΅ΠΉΡΡΠ²Π°Π» ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π° ΡΠ΅Π΄Π° ΠΈ Π΅ Π·Π°Π±ΡΠ°Π²ΠΈΠ» Π΄Π° Π³ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°. ΠΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Chocolatey ΡΠ° Π»ΠΈΡΠ΅Π½ΠΈ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° apikey ΠΏΠΎ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π°. ΠΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ Ρ Π³ΠΎΡΠ΅ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠΎΠ³Π° Π΄Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΠΈ:
commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");ΠΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΏΡΠΈ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈΠΌΠ°Ρ Π³ΠΎΠ»ΡΠΌ ΡΠ°Π½Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΡ ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΡΡΠ½ΠΎ Π² ΠΊΠΎΠΉΡΠΎ ΠΈ Π΄Π° Π΅ ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π³ΠΎΠ»ΡΠΌ ΠΎΠ±Π΅ΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄, Π° Π΅Π΄Π½ΠΎ ΠΎΡ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΡΡΡ Π΅ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ·.
P.S. Π ΠΊΠ°ΠΊΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, ΡΠ°Π·ΠΈ Π³ΡΠ΅ΡΠΊΠ° ΠΈΠΌΠ° ΡΠΊΠ»ΠΎΠ½Π½ΠΎΡΡ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π° Π² ΠΊΡΠ°Ρ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠ΅Π΄ΠΎΠ²ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ :). ΠΠΈΠΆΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ° "".
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N8
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°: [CWE-476] ΠΠ±Π΅ΠΊΡΡΡ βinstalledPackageβ Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ Π·Π° null. ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅: 910, 917. NugetService.cs 910
ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ ConcurrentDictionary<Π½ΠΈΠ·, PackageResult> get_outdated(....)
{
....
var pinnedPackageResult = outdatedPackages.GetOrAdd(
packageName,
Π½ΠΎΠ² PackageResult(installedPackage,
_fileSystem.combine_paths(
ApplicationParameters.PackagesLocation,
installedPackage.Id));
....
if ( installedPackage != null
&& !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion)
&& !config.UpgradeCommand.ExcludePrerelease)
{
....
}
....
}ΠΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠ° Π³ΡΠ΅ΡΠΊΠ°: ΠΏΡΡΠ²ΠΎ ΠΎΠ±Π΅ΠΊΡΡΡ installedPackage ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π·Π° null. Π’Π°Π·ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Π΅Π΄Π½ΠΎ ΠΎΡ Π΄Π²Π΅ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°: ΠΈΠ»ΠΈ installedPackage Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π΅ ΡΠ°Π²Π΅Π½ Π½Π° null, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΡΡΠΌΠ½ΠΈΡΠ΅Π»Π½ΠΎ, ΠΈ ΡΠΎΠ³Π°Π²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π΅ ΠΈΠ·Π»ΠΈΡΠ½Π°, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΡΠΈΠΎΠ·Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΠΊΠΎΠ΄Π° β ΠΎΠΏΠΈΡ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΡΡΠ΅Π· Π½ΡΠ»Π΅Π²Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΎ, Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΠΎΡΠ΅ Π΅Π΄Π½Π° ΠΌΠ°Π»ΠΊΠ° ΡΡΡΠΏΠΊΠ° β ΡΠ΅Π³Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° PVS-Studio ΡΡΠ°Π½Π° ΠΎΡΠ΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ. Π‘ΡΡΠΎ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠΌΠ΅Π½Π°, ΡΠ΅ Chocolatey Π΅ Π΄ΠΎΠ±ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Ρ ΠΌΠ°Π»ΠΊΠΎ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΈΡΠΎ Π±ΠΈΡ Π° ΠΌΠΎΠ³Π»ΠΈ Π΄Π° Π½Π°ΠΌΠ°Π»ΡΡ ΠΎΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° PVS-Studio.
ΠΠΎΠΊΠ°Π½Π²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΡΠ΅ PVS-Studio. Π Π΅Π΄ΠΎΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ΅Π½ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΎΡ Π²Π°ΡΠΈΡ Π΅ΠΊΠΈΠΏ, ΠΈ ΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ .
P.S.
ΠΡΠ΅Π΄ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ΡΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠΈΡ ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Chocolatey ΠΈ ΡΠ΅ Ρ ΠΏΡΠΈΠ΅Ρ Π° Π΄ΠΎΠ±ΡΠ΅. ΠΠΈΡΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π½Π΅ Π±Π΅ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΎΡ Π½Π°ΡΠ° ΡΡΡΠ°Π½Π°, Π½ΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌ Ρ Π°ΡΠ΅ΡΠ° ΠΎΡΠΊΡΠΈΡΠ°ΡΠ° ΠΎΡ Π½Π°Ρ Π³ΡΠ΅ΡΠΊΠ°, ΡΠ²ΡΡΠ·Π°Π½Π° Ρ ΠΊΠ»ΡΡΠ° βapi-key.β
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Ρ Π°Π½Π³Π»ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΠ°ΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΡ, ΠΌΠΎΠ»Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΏΡΠ΅Π²ΠΎΠ΄Π°: ΠΠ»Π°Π΄ΠΈΡΠ»Π°Π² Π‘ΡΠΎΠ»ΡΡΠΎΠ². .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
