PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps
НиС ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° PVS-Studio ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Π‘Π΅Π³Π° Π½Π°ΡˆΠΈΡΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΅ Π½Π°Π»ΠΈΡ‡Π΅Π½ Π² Chocolatey, ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π° Windows. БмятамС, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ улСсни внСдряванСто Π½Π° PVS-Studio, особСно Π² ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ услуги. Π—Π° Π΄Π° Π½Π΅ Ρ…ΠΎΠ΄ΠΈΠΌ Π΄Π°Π»Π΅Ρ‡, Π½Π΅ΠΊΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ изходния ΠΊΠΎΠ΄ Π½Π° ΡΡŠΡ‰ΠΈΡ Chocolatey. ΠšΠ°Ρ‚ΠΎ CI систСма Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Azure DevOps.

Π•Ρ‚ΠΎ списък с Π΄Ρ€ΡƒΠ³ΠΈ наши статии Π½Π° Ρ‚Π΅ΠΌΠ° интСграция с ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ систСми:

ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡŠΡ€Π²Π°Ρ‚Π° статия Π·Π° интСграция с Azure DevOps, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ случай някои ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΈ са пропуснати, Π·Π° Π΄Π° Π½Π΅ сС Π΄ΡƒΠ±Π»ΠΈΡ€Π°Ρ‚.

И Ρ‚Π°ΠΊΠ°, Π³Π΅Ρ€ΠΎΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ статия:

PVS-Studio β€” инструмСнт Π·Π° статичСн Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ уязвимости Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, написани Π½Π° Π΅Π·ΠΈΡ†ΠΈ C, C++, C# ΠΈ Java. Π Π°Π±ΠΎΡ‚ΠΈ Π² 64-Π±ΠΈΡ‚ΠΎΠ²ΠΈ систСми Π½Π° Windows, Linux ΠΈ macOS ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° 32-Π±ΠΈΡ‚ΠΎΠ²ΠΈ, 64-Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ ARM ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ. Ако Ρ‰Π΅ ΠΎΠΏΠΈΡ‚Π²Π°Ρ‚Π΅ статичСн Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π·Π° ΠΏΡŠΡ€Π²ΠΈ ΠΏΡŠΡ‚, ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌΠ΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ с статия ΠΊΠ°ΠΊΠΎ Π±ΡŠΡ€Π·ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π°ΠΉ-интСрснитС прСдупрСТдСния Π½Π° PVS-Studio ΠΈ Π΄Π° ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ инструмСнт.

Azure DevOps β€” Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ услуги, ΠΎΠ±Ρ…Π²Π°Ρ‰Π°Ρ‰ΠΈ цСлия процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Π’ ΡΡŠΡΡ‚Π°Π²Π° Π½Π° Ρ‚Π°Π·ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π²Π»ΠΈΠ·Π°Ρ‚ инструмСнти ΠΊΠ°Ρ‚ΠΎ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, ΠΊΠΎΠΈΡ‚ΠΎ позволяват Π΄Π° сС ускори ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° създаванС Π½Π° софтуСр ΠΈ Π΄Π° сС повиши Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ качСство.

Chocolatey – ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π° 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. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ Π²Π΅Ρ‡Π΅ стС Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ, просто ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ своя Π°ΠΊΠ°ΡƒΠ½Ρ‚, Π° Π°ΠΊΠΎ Π½Π΅, Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎΡ‚ΠΎ слСд автСнтикация.

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

Π’ΡƒΠΊ трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ къдС Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° натиснСм Π±ΡƒΡ‚ΠΎΠ½Π° Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅.

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

Π‘Π»Π΅Π΄ ΡƒΡΠΏΠ΅ΡˆΠ½Π° инсталация натискамС Proceed to organization:

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ шаблон Π·Π° Π·Π°Π΄Π°Ρ‡Π° Chocolatey Π² ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†Π° tasks ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурационния Ρ„Π°ΠΉΠ» azure-pipelines.yml:

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

НатискамС Π½Π° Chocolatey ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ списък с ΠΏΠΎΠ»Π΅Ρ‚Π°:

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

Π’ΡƒΠΊ трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ инсталиранС Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. Π’ 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()

НатиснСтС Π—Π°ΠΏΠ°Π·ΠΈ->Π—Π°ΠΏΠ°Π·ΠΈ->Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π·Π° стартиранС Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°. ЕкспортирайтС ΠΎΡ‚Ρ‡Π΅Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ Π²Π»Π΅Π·Π΅Ρ‚Π΅ Π² Ρ‚Π°Π±Π° Π·Π° Π·Π°Π΄Π°Ρ‡ΠΈ.

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Chocolatey ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΎΠ±Ρ‰ΠΎ 37615 Ρ€Π΅Π΄Π° C# ΠΊΠΎΠ΄. НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ някои ΠΎΡ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ·Π°

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N1

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3005 ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° β€˜Provider’ Π΅ присвоСна сама Π½Π° сСбС си. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

ΠΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΠ» присвояванС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° сама Π½Π° сСбС си, ΠΊΠΎΠ΅Ρ‚ΠΎ няма смисъл. ВСроятно Π½Π° мястото Π½Π° Π΅Π΄Π½Π° ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ трябва Π΄Π° стои Π΄Ρ€ΡƒΠ³Π°. Или ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΅ правописна Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΎΡ‚ΠΎ присвояванС ΠΌΠΎΠΆΠ΅ просто Π΄Π° сС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅.

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ N2

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3093 [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.

Π’ разглСТдания Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π΅Π½ пропуск. Π”Π°, Ρ‚ΠΎΠ²Π° условиС ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°, замСняйки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° & Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° &&, Π½ΠΎ ΠΎΡ‚ практичСска Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, Ρ‚ΠΎΠ²Π° Π½Π΅ ΠΎΠΊΠ°Π·Π²Π° влияниС. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π² Π΄Ρ€ΡƒΠ³ΠΈ случаи ΠΎΠ±ΡŠΡ€ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ & ΠΈ && ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° сСриозни ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ дясната част Π½Π° ΠΈΠ·Ρ€Π°Π·Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π½Π΅ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½ΠΈ/нСдопустими стойности. НапримСр, Π² Π½Π°ΡˆΠ°Ρ‚Π° колСкция ΠΎΡ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° диагностика V3093, ΠΈΠΌΠ°ΠΌΠ΅ слСдния случай:

if ((k < nct) & (s[k] != 0.0))

Π”ΠΎΡ€ΠΈ Π°ΠΊΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚ k Π΅ Π½Π΅ΠΊΠΎΡ€Π΅ΠΊΡ‚Π΅Π½, Ρ‚ΠΎΠΉ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π½Π° масива. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‰Π΅ бъдС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ IndexOutOfRangeException.

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ N3, N4

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [CWE-571] Π˜Π·Ρ€Π°Π·ΡŠΡ‚ β€˜shortPrompt’ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π²Π΅Ρ€Π΅Π½. InteractivePrompt.cs 101
ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3123 [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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3001 Има ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ΄ΠΈΠ·Ρ€Π°Π·ΠΈ β€˜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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3095 [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.β€œ

PVS-Studio Π²Π΅Ρ‡Π΅ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΎΡ‚ Azure DevOps

Ако искатС Π΄Π° сподСлитС Ρ‚Π°Π·ΠΈ статия с англоговорящата аудитория, моля, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° към ΠΏΡ€Π΅Π²ΠΎΠ΄Π°: Владислав Бтоляров. PVS-Studio сСга Π΅ Π² Chocolatey: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Chocolatey ΠΏΠΎΠ΄ Azure DevOps.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster