PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps
ืžื™ืจ ืคืึธืจื–ืขืฆืŸ ืฆื• ืžืึทื›ืŸ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ PVS-Studio ืžืขืจ ื‘ืึทืงื•ื•ืขื. ืื•ื ื“ื–ืขืจ ืึทื ืึทืœื™ื–ืขืจ ืื™ื– ืื™ืฆื˜ ื‘ื ื™ืžืฆื ืื™ืŸ Chocolatey, ืึท ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืคึฟืึทืจ Windows. ืžื™ืจ ื’ืœื•ื™ื‘ืŸ ืึทื– ื“ืึธืก ื•ื•ืขื˜ ืคืึทืกื™ืœืึทื˜ื™ื™ื˜ ื“ื™ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืคื•ืŸ PVS-Studio, ืกืคึผืขืฆื™ืขืœ ืื™ืŸ ื•ื•ืึธืœืงืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก. ืื™ืŸ ืกื“ืจ ื ื™ืฉื˜ ืฆื• ื’ื™ื™ืŸ ื•ื•ื™ื™ึทื˜, ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื˜ืฉืึธืงืœืึทื˜. Azure DevOps ื•ื•ืขื˜ ืฉืคึผื™ืœืŸ ื•ื•ื™ ืึท ืกื™ ืกื™ืกื˜ืขื.

ื“ืึธ ืื™ื– ืึท ืจืฉื™ืžื” ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืื ื“ืขืจืข ืึทืจื˜ื™ืงืœืขืŸ ืื•ื™ืฃ ื“ืขืจ ื˜ืขืžืข ืคื•ืŸ โ€‹โ€‹ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ืžื™ื˜ ื•ื•ืึธืœืงืŸ ืกื™ืกื˜ืขืžืขืŸ:

ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืื™ืจ ืฆื• ื‘ืึทืฆืึธืœืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืฆื• ื“ืขืจ ืขืจืฉื˜ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ืžื™ื˜ Azure DevOps, ื•ื•ื™ื™ึทืœ ืื™ืŸ ื“ืขื ืคืึทืœ ืขื˜ืœืขื›ืข ืคื•ื ืงื˜ืŸ ื–ืขื ืขืŸ ืื™ื‘ืขืจื’ืขื”ื™ืคึผืขืจื˜ ืึทื–ื•ื™ ื ื™ืฉื˜ ืฆื• ื–ื™ื™ืŸ ื“ื•ืคึผืœื™ืงื™ื™ื˜ื™ื“.

ืึทื–ื•ื™, ื“ื™ ื”ืขืœื“ืŸ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ:

ืคึผื•ื•ืก-ืกื˜ื•ื“ื™ืึธ ืื™ื– ืึท ืกื˜ืึทื˜ื™ืง ืงืึธื“ ืึทื ืึทืœื™ืกื™ืก ื’ืขืฆื™ื™ึทื’ ื“ื™ื–ื™ื™ื ื“ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื– ืื™ืŸ ืžื’ื™ืœื” ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ C, C ++, C # ืื•ืŸ Java. ืœื•ื™ืคื˜ ืื•ื™ืฃ 64-ื‘ื™ืกืœ ื•ื•ื™ื ื“ืึธื•ื–, ืœื™ื ื•ืงืก ืื•ืŸ ืžืึทืงืึธืก ืกื™ืกื˜ืขืžืขืŸ, ืื•ืŸ ืงืขื ืขืŸ ืึทื ืึทืœื™ื™ื– ืงืึธื“ ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ 32-ื‘ื™ืกืœ, 64-ื‘ื™ืกืœ ืื•ืŸ ืขืžื‘ืขื“ื™ื“ ARM ืคึผืœืึทื˜ืคืึธืจืžืก. ืื•ื™ื‘ ื“ืึธืก ืื™ื– ื“ื™ื™ืŸ ืขืจืฉื˜ืขืจ ืžืึธืœ ืื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืกื˜ืึทื˜ื™ืง ืงืึธื“ ืึทื ืึทืœื™ืกื™ืก ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ื™ืŸ ืคึผืจืึทื“ื–ืฉืขืงืก, ืžื™ืจ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืื™ืจ ื‘ืืงืขื ืขืŸ ื–ื™ืš ืžื™ื˜ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ื•ื•ื™ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ื–ืขืŸ ื“ื™ ืžืขืจืกื˜ ื˜ืฉื™ืงืึทื•ื•ืข ื•ื•ืึธืจื ื™ื ื’ื– ืคื•ืŸ PVS-Studio ืื•ืŸ ืึธืคึผืฉืึทืฆืŸ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ืขื ื’ืขืฆื™ื™ึทื’.

ืึทื–ื•ืจืข ื“ืขื•ื•ืึธืคึผืก - ืึท ืกื›ื•ื ืคื•ืŸ ื•ื•ืึธืœืงืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก ื•ื•ืึธืก ืฆื•ื–ืึทืžืขืŸ ื“ืขืงืŸ ื“ื™ ื’ืื ืฆืข ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคึผืจืึธืฆืขืก. ื“ื™ ืคึผืœืึทื˜ืคืึธืจืžืข ื›ื•ืœืœ ืžื›ืฉื™ืจื™ื ืึทื–ืึท ื•ื•ื™ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, ื•ื•ืึธืก ืœืึธื–ืŸ ืื™ืจ ืฆื• ืคืึทืจื’ื™ื›ืขืจืŸ ื“ืขื ืคึผืจืึธืฆืขืก ืคื•ืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืื•ืŸ ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืงื•ื•ืึทืœื™ื˜ืขื˜.

ืฉืึธืงืึธืœืึทื“ื™ ืื™ื– ืึทืŸ ืึธืคึฟืŸ ืžืงื•ืจ ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืคึฟืึทืจ Windows. ื“ืขืจ ืฆื™ืœ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ืฆื• ืึธื˜ืึทืžื™ื™ื˜ ื“ื™ ื’ืื ืฆืข ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืœื™ื™ืคืกื™ื™ืง ืคื•ืŸ ื™ื™ึทื ืžืึธื ื˜ื™ืจื•ื ื’ ืฆื• ืึทืคึผื“ื™ื™ื˜ื™ื ื’ ืื•ืŸ ื•ื ื™ื ืกื˜ืึทืœืœืึทื˜ื™ืึธืŸ ืื•ื™ืฃ Windows ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ.

ื•ื•ืขื’ืŸ ื ื™ืฆืŸ ื˜ืฉืึธืงืœืึทื˜

ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ื•ื•ื™ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ื–ื™ืš ืื™ืŸ ื“ืขื ืจื•ื ื’. ื’ืึทื ืฅ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืคึฟืึทืจ ื™ื ืกื˜ืึธืœื™ื ื’ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืื™ื– ื‘ื ื™ืžืฆื ืื™ืŸ ืจื•ื ื’ ื–ืขืŸ ื“ื™ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืžื™ื˜ ื“ื™ Chocolatey ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’. ืื™ืš ื•ื•ืขืœ ืคื•ืŸ ื“ืืจื˜ืŸ ื‘ืงื™ืฆื•ืจ ืื™ื‘ืขืจื—ื–ืจืŸ ืขื˜ืœืขื›ืข ื ืงื•ื“ื•ืช.

ื‘ืึทืคึฟืขืœ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืœืขืฆื˜ืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืึทื ืึทืœื™ื–ืขืจ:

choco install pvs-studio

ื‘ืึทืคึฟืขืœ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ PVS-Studio ืคึผืขืงืœ:

choco install pvs-studio --version=7.05.35617.2075

ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ื‘ืœื•ื™ื– ื“ื™ ื”ืึทืจืฅ ืคื•ืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ, ื“ื™ ืงืึธืจ ืงืึธืžืคึผืึธื ืขื ื˜, ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ. ืึทืœืข ืื ื“ืขืจืข ืคืœืึทื’ืก (ืกื˜ืึทื ื“ืึทืœืึธื ืข, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) ืงืขื ืขืŸ ื–ื™ื™ืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืžื™ื˜ --ืคึผืึทืงืงืึทื’ืข-ืคึผืึทืจืึทืžืขื˜ืขืจืก.

ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื‘ืึทืคึฟืขืœ ื•ื•ืึธืก ื•ื•ืขื˜ ื™ื ืกื˜ืึทืœื™ืจืŸ ืึท ืึทื ืึทืœื™ื–ืขืจ ืžื™ื˜ ืึท ืคึผืœื•ื’ื™ืŸ ืคึฟืึทืจ ื•ื•ื™ืกื•ืึทืœ ืกื˜ื•ื“ื™ืึธ 2019:

choco install pvs-studio --package-parameters="'/MSVS2019'"

ืื™ืฆื˜ ืœืึธืžื™ืจ ื–ืขืŸ ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ื‘ืึทืงื•ื•ืขื ื ื•ืฆืŸ ืคื•ืŸ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืื•ื ื˜ืขืจ Azure DevOps.

Customize

ืœืึธื–ืŸ ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ ืึทื– ืขืก ืื™ื– ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ื•ื•ืขื’ืŸ ืึทื–ืึท ื™ืฉื•ื– ื•ื•ื™ ืจืขื“ื–ืฉื™ืกื˜ืขืจื™ื ื’ ืึท ื—ืฉื‘ื•ืŸ, ืงืจื™ื™ื™ื˜ื™ื ื’ ืึท ื‘ื™ืœื“ ืคึผื™ื™ืคึผืœื™ื™ืŸ ืื•ืŸ ืกื™ื ื’ืงืจืึทื ื™ื™ื– ื“ื™ื™ืŸ ื—ืฉื‘ื•ืŸ ืžื™ื˜ ืึท ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ื“ื™ GitHub ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™. ืึทืจื˜ื™ืงืœ. ืื•ื ื“ื–ืขืจ ืกืขื˜ืึทืคึผ ื•ื•ืขื˜ ืžื™ื“ ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ืฉืจื™ื™ื‘ืŸ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข.

ืขืจืฉื˜ืขืจ, ืœืึธืžื™ืจ ืฉื˜ืขืœืŸ ืึท ืงืึทื˜ืขืจ ืฆื™ื ื’ืœ, ื•ื•ืึธืก ื™ื ื“ื™ืงื™ื™ืฅ ืึทื– ืžื™ืจ ืงืึทื˜ืขืจ ื‘ืœื•ื™ื– ืคึฟืึทืจ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื‘ืึทืœืขื‘ืึธืก ืฆื•ื•ื™ื™ึทื’:

trigger:
- master

ื•ื•ื™ื™ึทื˜ืขืจ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ. ืื™ืฆื˜ ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึท ืžื™ืงืจืึธืกืึธืคื˜ ื›ืึธื•ืกื˜ื™ื“ ืึทื’ืขื ื˜ ืžื™ื˜ Windows Server 2019 ืื•ืŸ Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

ืœืึธืžื™ืจ ื’ื™ื™ืŸ ืฆื• ื“ื™ ื’ื•ืฃ ืคื•ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข (ื‘ืœืึธืง ื˜ืจืขืค). ื˜ืจืึธืฅ ื“ืขื ืคืึทืงื˜ ืึทื– ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ื™ื ืกื˜ืึทืœื™ืจืŸ ืึทืจื‘ื™ื˜ืจืึทืจื™ืฉ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืื™ืŸ ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ, ืื™ืš ื”ืื˜ ื ื™ืฉื˜ ืœื™ื™ื’ืŸ ืึท ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจ. ืžื™ืจ ืงืขื ืขืŸ ืœื™ื™ื’ืŸ Chocolatey ื•ื•ื™ ืึท ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ืคึฟืึทืจ Azure DevOps. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืœืึธื–ืŸ ืื•ื ื“ื– ื’ื™ื™ืŸ ืฆื• ืจื•ื ื’. ื“ืจื™ืงื˜ ื‘ืึทืงื•ืžืขืŸ ืขืก ืคืจื™ื™. ื“ืขืจื ืึธืš, ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืฉื•ื™ืŸ ืึธื˜ืขืจื™ื™ื–ื“, ื ืึธืจ ืกืขืœืขืงื˜ื™ืจืŸ ื“ื™ื™ืŸ ื—ืฉื‘ื•ืŸ, ืื•ืŸ ืื•ื™ื‘ ื ื™ืฉื˜, ื˜ืึธืŸ ื“ื™ ื–ืขืœื‘ืข ื–ืึทืš ื ืึธืš ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ.

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ื“ืึธ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื•ื•ื• ืžื™ืจ ื•ื•ืขืœืŸ ืœื™ื™ื’ืŸ ื“ื™ ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ืื•ืŸ ื’ื™ื˜ ื“ื™ ืงื ืขืคึผืœ ื™ื ืกื˜ืึทืœื™ืจืŸ.

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ื ืึธืš ืžืฆืœื™ื— ื™ื™ึทื ืžืึธื ื˜ื™ืจื•ื ื’, ื’ื™ื˜ ื’ื™ื™ื  ื•ื•ื™ื™ึทื˜ืขืจ ืฆื• ืึธืจื’ืึทื ื™ื–ืึทืฆื™ืข:

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ืื™ืจ ืงืขื ื˜ ืื™ืฆื˜ ื–ืขืŸ ื“ื™ ืžื•ืกื˜ืขืจ ืคึฟืึทืจ ื“ื™ Chocolatey ืึทืจื‘ืขื˜ ืื™ืŸ ื“ื™ ืคึฟืขื ืฆื˜ืขืจ ื˜ืึทืกืงืก ื•ื•ืขืŸ ืขื“ื™ื˜ื™ื ื’ ืึท ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข azure-pipelines.yml:

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ื“ืจื™ืงื˜ ืื•ื™ืฃ Chocolatey ืื•ืŸ ื–ืขืŸ ืึท ืจืฉื™ืžื” ืคื•ืŸ ืคืขืœื“ืขืจ:

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ื“ืึธ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ืื™ืŸ ื“ื™ ืคืขืœื“ ืžื™ื˜ ื“ื™ ื˜ื™ืžื–. ืื™ืŸ Nuspec ื˜ืขืงืข ื ืึธืžืขืŸ ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืคืืจืœืื ื’ื˜ ืคึผืขืงืœ - pvs-studio. ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ื•ื•ืขืจืกื™ืข, ื“ื™ ืœืขืฆื˜ืข ื•ื•ืขืจืกื™ืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ, ื•ื•ืึธืก ืกื•ืฅ ืื•ื ื“ื– ื’ืึธืจ. ืœืึธืžื™ืจ ื“ืจื™ืงืŸ ื“ืขื ืงื ืขืคึผืœ ืฆื•ื’ืขื‘ืŸ ืื•ืŸ ืžื™ืจ ื•ื•ืขืœืŸ ื–ืขืŸ ื“ื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืึทืจื‘ืขื˜ ืื™ืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

ื“ืขืจื ืึธืš, ืœืึธื–ืŸ ืื•ื ื“ื– ื’ื™ื™ืŸ ืฆื• ื“ื™ ื”ื•ื™ืคึผื˜ ื˜ื™ื™ืœ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื˜ืขืงืข:

- task: CmdLine@2
  inputs:
    script: 

ืื™ืฆื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ื˜ืขืงืข ืžื™ื˜ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ. ื“ืึธ PVSNAME ะธ PVSKEY - ื ืขืžืขืŸ ืคื•ืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื•ื•ืขืžืขื ืก ื•ื•ืึทืœื•ืขืก ืžื™ืจ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืื™ืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก. ื–ื™ื™ ื•ื•ืขืœืŸ ืงืจืึธื ื“ื™ PVS-Studio ืœืึธื’ื™ืŸ ืื•ืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืฉืœื™ืกืœ. ืฆื• ืฉื˜ืขืœืŸ ื–ื™ื™ืขืจ ื•ื•ืึทืœื•ืขืก, ืขืคืขื ืขืŸ ื“ื™ ืžืขื ื™ื• ื•ื•ืขืจื™ืึทื‘ืึทืœื–-> ื ื™ื• ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ื–ืืœ ืก ืžืึทื›ืŸ ื•ื•ืขืจื™ืึทื‘ืึทืœื– PVSNAME ืคึฟืึทืจ ืœืึธื’ื™ืŸ ืื•ืŸ PVSKEY ืคึฟืึทืจ ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืฉืœื™ืกืœ. ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคืึทืจื’ืขืกืŸ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืงืขืกื˜ืœ ื”ืึทืœื˜ืŸ ื“ืขื ื•ื•ืขืจื˜ ืกื•ื“ ืคืึทืจ PVSKEY. ื‘ืึทืคึฟืขืœืŸ ืงืึธื“:

ัall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
โ€“u $(PVSNAME) โ€“n $(PVSKEY)

ืœืึธืžื™ืจ ื‘ื•ื™ืขืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื ื™ืฆืŸ ื“ื™ ืคืœืขื“ืขืจืžื•ื™ื– ื˜ืขืงืข ืื™ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™:

ั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()

ืœืืžื™ืจ ืงืœื™ืงืŸ ื”ื™ื˜-> ื”ื™ื˜-> ืœื•ื™ืคืŸ ืฆื• ืœื•ื™ืคืŸ ื“ื™ ืึทืจื‘ืขื˜. ืœืึธืžื™ืจ ืืจืืคืงืืคื™ืข ื“ืขื ื‘ืึทืจื™ื›ื˜ ื“ื•ืจืš ื’ื™ื™ืŸ ืฆื• ื“ื™ ื˜ืึทืกืงืก ืงื•ื•ื™ื˜ืœ.

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ื“ื™ Chocolatey ืคึผืจื•ื™ืขืงื˜ ื›ึผื•ืœืœ ื‘ืœื•ื™ื– 37615 ืฉื•ืจื•ืช ืคื•ืŸ C # ืงืึธื“. ื–ืืœ ืก ืงื•ืง ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืขืจืจืึธืจืก ื’ืขืคื•ื ืขืŸ.

ื˜ืขืกื˜ ืจืขื–ื•ืœื˜ืื˜ืŸ

ื•ื•ืืจืขื ื•ื ื’ N1

ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก ื“ื™ 'ืคึผืจืึทื•ื•ื™ื™ื“ืขืจ' ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื™ื– ืึทืกื™ื™ื ื“ ืฆื• ื–ื™ืš. 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.

ืื™ืŸ ื“ื™ ื‘ืึทื˜ืจืึทื›ื˜ ืคืจืึทื’ืžืขื ื˜, ื“ืึธืก ืื™ื– ืึท ืžื™ื ืขืจื•ื•ืขืจื˜ื™ืง ืคืขืœืขืจ. ื™ืึธ, ื“ืขื ืฆื•ืฉื˜ืึทื ื“ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึธืคึผื˜ื™ืžื™ื–ืขื“ ื“ื•ืจืš ืจื™ืคึผืœื™ื™ืกื™ื ื’ ื“ื™ & ืึธืคึผืขืจืึทื˜ืึธืจ ืžื™ื˜ ื“ื™ && ืึธืคึผืขืจืึทื˜ืึธืจ, ืึธื‘ืขืจ ืคึฟื•ืŸ ืึท ืคึผืจืึทืงื˜ื™ืฉ ืคื•ื ื˜ ืคื•ืŸ ืžื™ื™ื ื•ื ื’, ื“ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ื•ื•ื™ืจืงืŸ ืขืคึผืขืก. ืึธื‘ืขืจ, ืื™ืŸ ืื ื“ืขืจืข ืงืึทืกืขืก, ืฆืขืžื™ืฉื•ื ื’ ืฆื•ื•ื™ืฉืŸ & ืื•ืŸ && ืงืขื ืขืŸ ืึธื ืžืึทื›ืŸ ืขืจื ืกื˜ ืคึผืจืึธื‘ืœืขืžืก ื•ื•ืขืŸ ื“ื™ ืจืขื›ื˜ ื–ื™ื™ึทื˜ ืคื•ืŸ ื“ื™ ืื•ื™ืกื“ืจื•ืง ืื™ื– ื‘ืื”ืื ื“ืœื˜ ืžื™ื˜ ืคืึทืœืฉ / ืคืึทืจืงืจื™ืคึผืœื˜ ื•ื•ืึทืœื•ืขืก. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืŸ ืื•ื ื“ื–ืขืจ ื˜ืขื•ืช ื–ืึทืžืœื•ื ื’, ื™ื™ื“ืขื ืึทืคื™ื™ื“ ืžื™ื˜ ื“ื™ V3093 ื“ื™ืึทื’ื ืึธืกื˜ื™ืง, ืขืก ืื™ื– ื“ืขื ืคืึทืœ:

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

ืืคื™ืœื• ืื•ื™ื‘ ื“ืขืจ ืื™ื ื“ืขืงืก k ืื™ื– ืคืึทืœืฉ, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืฆื• ืึทืงืกืขืก ืึท ืžืขื ื’ืข ืขืœืขืžืขื ื˜. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืึท ื•ื™ืกื ืขื ื•ื•ืขื˜ ื–ื™ื™ืŸ ืืจืœื ื’ืขื•ื•ืืจืคืŸ IndexOutOfRangeException.

ื•ื•ืึธืจื ื™ื ื’ื– N3, N4

ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-571] ื“ื™ ืื•ื™ืกื“ืจื•ืง 'ืงื•ืจืฅ ืคึผื™ื ื˜ืœืขืš' ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช. InteractivePrompt.cs 101
ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-571] ื“ื™ ืื•ื™ืกื“ืจื•ืง 'ืงื•ืจืฅ ืคึผื™ื ื˜ืœืขืš' ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช. 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 < 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 ืขื˜ืœืขื›ืข ืฉื•ืจื•ืช ืื•ื™ื‘ืŸ ืื™ื– ื™ื ื™ื˜ื™ืึทืœื™ื™ื–ื“ ืฆื• ื ื•ืœ, ื“ื™ ื˜ืขืจื ืขืจื™ ืึธืคึผืขืจืึทื˜ืึธืจ ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื“ื™ ื•ื•ืขืจื˜ ืคืึทืœืฉ. ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื“ืขื ืฆื•ืฉื˜ืึทื ื“, ื“ืขืจ ื’ื•ืฃ ืคื•ืŸ ื“ื™ ืฉืœื™ื™ืฃ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืขืงืกืึทืงื™ื•ื˜ืึทื“ ื‘ืœื•ื™ื– ืึทืžืึธืœ. ืขืก ืžื™ื™ื ื˜ ืฆื• ืžื™ืจ ืึทื– ื“ืึธืก ืฉื˜ื™ืง ืคื•ืŸ ืงืึธื“ ื˜ื•ื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ื•ื•ื™ ื“ืขืจ ืคึผืจืึธื’ืจืึทืžื™ืกื˜ ื‘ื“ืขื”.

ื•ื•ืืจืขื ื•ื ื’ 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 = "All versions";
    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 ื™ื•ื–ืขืจื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ื‘ื™ื›ื•ืœืช ืฆื• ืฆื•ืœื™ื™ื’ืŸ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ ืึทืคึผื™ืงื™ื™ ืึท ืคึผืึธืจ ืžืขืจ ื•ื•ืขื’ืŸ. ืขื ืœืขืš ืฆื• ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื•ื™ื‘ืŸ, ืื™ืš ืงืขื ืขืŸ ืคืึธืจืฉืœืึธื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืึธืคึผืฆื™ืขืก:

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

ืงืึธืคึผื™-ืคึผืึทืคึผ ืขืจืจืึธืจืก ื”ืึธื‘ืŸ ืึท ื”ื•ื™ืš ื’ืขืœืขื’ื ื”ื™ื™ึทื˜ ืฆื• ื“ืขืจืฉื™ื™ึทื ืขืŸ ื’ื™ื›ืขืจ ืึธื“ืขืจ ืฉืคึผืขื˜ืขืจ ืื™ืŸ ืงื™ื™ืŸ ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ ืึท ื’ืจื•ื™ืก ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืžืงื•ืจ ืงืึธื“, ืื•ืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื‘ืขืกื˜ืขืจ ืžื›ืฉื™ืจื™ื ืฆื• ืงืึทืžื‘ืึทื˜ ื–ื™ื™ ืื™ื– ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก.

ืคึผืก ืื•ืŸ ื•ื•ื™ ืฉื˜ืขื ื“ื™ืง, ื“ืขืจ ื˜ืขื•ืช ื˜ืขื ื“ื– ืฆื• ื“ืขืจืฉื™ื™ึทื ืขืŸ ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ืึท ืžืึทืœื˜ื™-ืฉื•ืจื” ืฆื•ืฉื˜ืึทื ื“ :). ื–ืขืŸ ืื•ื™ืกื’ืื‘ืข "ืœืขืฆื˜ืข ืฉื•ืจื” ื•ื•ื™ืจืงื•ื ื’".

ื•ื•ืืจืขื ื•ื ื’ N8

ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-476] ื“ื™ 'ื™ื ืกื˜ืึทืœืœืขื“ ืคึผืึทืงืงืึทื’ืข' ื›ื™ื™ืคืขืฅ ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ื™ื“ืขืจ ืขืก ืื™ื– ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ ื ืึทืœ. ื˜ืฉืขืง ืฉื•ืจื•ืช: 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)
  {
    ....
  }
  ....
}

ืงืœืึทืกื™ืฉ ื’ืจื™ื™ึทื–: ื›ื™ื™ืคืขืฅ ืขืจืฉื˜ืขืจ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืคึผืึทืงืงืึทื’ืข ืื™ื– ื’ืขื ื™ืฆื˜ ืื•ืŸ ื“ืขืžืึธืœื˜ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืคึฟืึทืจ ื ืึทืœ. ื“ืขืจ ื“ื™ืึทื’ื ืึธืกื˜ื™ืง ื“ืขืจืฆื™ื™ืœื˜ ืื•ื ื“ื– ื•ื•ืขื’ืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ืฆื•ื•ื™ื™ ืคึผืจืึธื‘ืœืขืžืก ืื™ืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื: ืึธื“ืขืจ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืคึผืึทืงืงืึทื’ืข ืงื™ื™ื ืžืึธืœ ื’ืœื™ื™ึทืš ื ืึทืœ, ื•ื•ืึธืก ืื™ื– ืกืึธืคืขืงื“ื™ืง, ืื•ืŸ ื“ืขืจ ื˜ืฉืขืง ืื™ื– ื™ื‘ืขืจื™ืง, ืึธื“ืขืจ ืžื™ืจ ืงืขืŸ ืคึผืึทื˜ืขื ื˜ืฉืึทืœื™ ื‘ืึทืงื•ืžืขืŸ ืึท ืขืจื ืกื˜ ื˜ืขื•ืช ืื™ืŸ ื“ื™ ืงืึธื“ - ืึทืŸ ืคึผืจื•ื•ื•ืŸ ืฆื• ืึทืงืกืขืก ืึท ื ืึทืœ ืจืขืคึฟืขืจืขื ืฅ.

ืกืึธืฃ

ืึทื–ื•ื™ ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื ื•ืžืขืŸ ืืŸ ืื ื“ืขืจ ืงืœื™ื™ืŸ ืฉืจื™ื˜ - ืื™ืฆื˜ ื ื™ืฆืŸ PVS-Studio ืื™ื– ื’ืขื•ื•ืืจืŸ ืืคื™ืœื• ื’ืจื™ื ื’ืขืจ ืื•ืŸ ืžืขืจ ื‘ืึทืงื•ื•ืขื. ืื™ืš ื•ื•ืึธืœื˜ ืื•ื™ืš ื•ื•ื™ ืฆื• ื–ืึธื’ืŸ ืึทื– Chocolatey ืื™ื– ืึท ื’ื•ื˜ ืคึผืขืงืœ ืคืึทืจื•ื•ืึทืœื˜ืขืจ ืžื™ื˜ ืึท ืงืœื™ื™ืŸ ื ื•ืžืขืจ ืคื•ืŸ ืขืจืจืึธืจืก ืื™ืŸ ื“ื™ ืงืึธื“, ื•ื•ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ืืคื™ืœื• ื•ื•ื™ื™ื ื™ืงืขืจืข ื•ื•ืขืŸ ืื™ืจ ื ื•ืฆืŸ PVS-Studio.

ืžื™ืจ ืœืึทื“ืŸ ืื™ืจ ืึธืคึผืœืึธื“ื™ืจืŸ ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ PVS-Studio. ืจืขื’ื•ืœืขืจ ื ื•ืฆืŸ ืคื•ืŸ ืึท ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืขื˜ ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื•ืŸ ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™ ืคื•ืŸ ื“ื™ ืงืึธื“ ื•ื•ืึธืก ื“ื™ื™ืŸ ืžืึทื ืฉืึทืคึฟื˜ ื“ืขื•ื•ืขืœืึธืคึผืก ืื•ืŸ ื”ืขืœืคืŸ ืคืึทืจืžื™ื™ึทื“ืŸ ืคื™ืœืข ื ื•ืœ ื˜ืึธื’ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–.

ืคึผืก

ืคืืจืŸ ืืจื•ื™ืกื’ืขื‘ืŸ ื”ืื‘ืŸ ืžื™ืจ ื’ืขืฉื™ืงื˜ ื“ืขื ืืจื˜ื™ืงืœ ืฆื• ื“ื™ ื˜ืฉืึธืงืœืื˜ื™ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก, ืื•ืŸ ื–ื™ื™ ื”ืื‘ืŸ ืขืก ื’ื•ื˜ ื‘ืืงื•ืžืขืŸ. ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ื˜ ื’ืขืคึฟื•ื ืขืŸ ืขืคึผืขืก ืงืจื™ื˜ื™ืฉ, ืึธื‘ืขืจ ื–ื™ื™, ืœืžืฉืœ, ืœื™ื™ืงื˜ ื“ื™ ื–ืฉื•ืง ื•ื•ืึธืก ืžื™ืจ ื’ืขืคึฟื•ื ืขืŸ ืฉื™ื™ืš ืฆื• ื“ื™ "ืึทืคึผื™-ืงื™ื™" ืฉืœื™ืกืœ.

PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ Chocolatey: ื˜ืฉืขืง Chocolatey ืคึฟื•ืŸ ืื•ื ื˜ืขืจ Azure DevOps

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื˜ื™ื™ืœืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ื˜ ืึทืŸ ืขื ื’ืœื™ืฉ-ื’ืขืจืขื“ื˜ ื•ื™ืœืขื, ื‘ื™ื˜ืข ื ื•ืฆืŸ ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืœื™ื ืง: Vladislav Stolyarov. PVS-Studio ืื™ื– ืื™ืฆื˜ ืื™ืŸ ื˜ืฉืึธืงืœืึทื˜: ื˜ืฉืขืง ื˜ืฉืึธืงืœืึทื˜ ืื•ื ื˜ืขืจ Azure DevOps.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’