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# ΠΈ 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

Π’ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, ΠΊΡƒΠ΄Π° ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Install.

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

Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ install Π² ΠΏΠΎΠ»Π΅ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ. Π’ 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 для ΠΊΠ»ΡŽΡ‡Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Keep this value secret для 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 ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ PlogΠ‘onverter:

с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()

НаТмём Save->Save->Run для запуска Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΈΠΌ ΠΎΡ‚Ρ‡Ρ‘Ρ‚, зайдя Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Π·Π°Π΄Π°Ρ‡ΠΈ.

PVS-Studio Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Chocolatey ΠΈΠ·-ΠΏΠΎΠ΄ Azure DevOps

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Chocolatey содСрТит всСго 37615 строк C# ΠΊΠΎΠ΄Π°. Рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ошибок.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3005 The ‘Provider’ variable is assigned to itself. 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] The ‘&’ operator evaluates both operands. Perhaps a short-circuit ‘&&’ operator should be used instead. 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;
  }
}

ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° & ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° && Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли лСвая Ρ‡Π°ΡΡ‚ΡŒ выраТСния β€” false, Ρ‚ΠΎ всё Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ вычислСна правая Ρ‡Π°ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ лишниС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° system.directory_exists.

Π’ рассмотрСнном Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ это ΠΌΠ΅Π»ΠΊΠΈΠΉ Π½Π΅Π΄ΠΎΡ‡Ρ‘Ρ‚. Π”Π°, Π΄Π°Π½Π½ΠΎΠ΅ условиС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ &&, Π½ΠΎ, с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, это Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ влияСт. Однако, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ & ΠΈ && ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° правая Ρ‡Π°ΡΡ‚ΡŒ выраТСния Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ/нСдопустимыми значСния. НапримСр, Π² нашСй ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ошибок, выявлСнных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ диагностики V3093, Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ случай:

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

Π”Π°ΠΆΠ΅ Ссли индСкс k Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ элСмСнту массива. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрировано ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ IndexOutOfRangeException.

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [CWE-571] Expression ‘shortPrompt’ is always true. InteractivePrompt.cs 101
ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [CWE-571] Expression ‘shortPrompt’ is always true. 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, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ всСгда true, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ выполнится строчка 3. Если ΠΆΠ΅ условиС 1 окаТСтся Π»ΠΎΠΆΠ½Ρ‹ΠΌ, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ Π½Π° строчку, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΡƒΡŽ Ρ†ΠΈΡ„Ρ€ΠΎΠΉ 4, условиС Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΎΠΆΠ΅ всСгда true, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, выполнится строчка 5. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, условия, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ 0, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ совсСм Ρ‚ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ рассчитывал программист.

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3123 [CWE-783] Perhaps the ‘?:’ operator works in a different way than it was expected. Its priority is lower than priority of other operators in its condition. 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 < nameStart.Length; ++i) 
  {
    int start, j = 0;
    do 
    {
      start = description.IndexOf (nameStart [i], j);
    } 
    while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

Диагностика сработала Π½Π° строку:

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

Π’Π°ΠΊ ΠΊΠ°ΠΊ пСрСмСнная j Π½Π° нСсколько строк Π²Ρ‹ΡˆΠ΅ инициализируСтся Π½ΡƒΠ»Ρ‘ΠΌ, Ρ‚Π΅Ρ€Π½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. Из-Π·Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ условия, Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° выполнится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. МнС каТСтся, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совсСм Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π» программист.

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3022 [CWE-571] Expression ‘installedPackageVersions.Count != 1’ is always true. NugetService.cs 1405

private void remove_nuget_cache_for_package(....)
{
  if (!config.AllVersions && installedPackageVersions.Count > 1)
  {
    const string allVersionsChoice = "All versions";
    if (installedPackageVersions.Count != 1)
    {
      choices.Add(allVersionsChoice);
    }
    ....
  }
  ....
}

Π—Π΄Π΅ΡΡŒ странноС Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ условиС: installedPackageVersions.Count != 1, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ true. Часто Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΊΠΎΠ΄Π΅, Π° Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях просто Π½Π° ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ.

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3001 There are identical sub-expressions ‘commandArguments.contains("-apikey")’ to the left and to the right of the ‘||’ operator. 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=");

Copy-paste ошибки ΠΈΠΌΠ΅ΡŽΡ‚ большой шанс Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π² любом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ с большим количСством исходного ΠΊΠΎΠ΄Π°, ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… срСдств Π±ΠΎΡ€ΡŒΠ±Ρ‹ с Π½ΠΈΠΌΠΈ – статичСский Π°Π½Π°Π»ΠΈΠ·.

P.S. И ΠΊΠ°ΠΊ всСгда, эта ошибка тяготССт ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ многострочного условия :). Π‘ΠΌ. ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ "Π­Ρ„Ρ„Π΅ΠΊΡ‚ послСднСй строки".

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: V3095 [CWE-476] The ‘installedPackage’ object was used before it was verified against null. Check lines: 910, 917. NugetService.cs 910

public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
  ....
  var pinnedPackageResult = outdatedPackages.GetOrAdd(
    packageName, 
    new 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.

ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΡΡ‚Π°Ρ‚ΡŒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π‘hocolatey, ΠΈ ΠΎΠ½ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΅Ρ‘ приняли. НичСго ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ, Π½ΠΎ ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ найдСнная Π½Π°ΠΌΠΈ ошибка, связанная с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Β«api-keyΒ».

PVS-Studio Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Chocolatey: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Chocolatey ΠΈΠ·-ΠΏΠΎΠ΄ Azure DevOps

Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ с англоязычной Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ, Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылку Π½Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: Vladislav Stolyarov. PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps.

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