áá»áœááºá¯ááºááá¯á·ááẠPVS-Studio ááᯠááá¯ááá¯á¡áááºááŒá±á
á±ááẠáááºáááºáá¯ááºáá±á¬ááºáá«áááºá áá»áœááºá¯ááºááá¯á·áááœá²ááŒááºážá
áááºááŒá¬áá°á¡á¬áž Windows á¡ááœáẠáááºáá±á·áá»áºáááºáá±áá»á¬ááŒá
áºáá±á¬ Chocolatey ááœáẠááá¯áááŸáááá¯ááºáá«ááŒá®á áááºážááẠPVS-Studio á¡áá°ážáááŒáá·áº cloud áááºáá±á¬ááºááŸá¯áá»á¬ážááœáẠááœááºáá°áá»á±á¬ááœá±á·á
á±áááºáᯠáá»áœááºá¯ááºááá¯á·áá¯á¶ááŒááºáá«áááºá áá±ážáá±ážáááœá¬ážá
á±áááºá áá°áá®áá±á¬ Chocolatey áá¡áááºážá¡ááŒá
áºáá¯ááºááá¯á
á
áºáá±ážááŒáá«á
áá¯á·á Azure DevOps ááẠCI á
áá
áºáá
áºáá¯á¡ááŒá
Ạáá¯ááºáá±á¬ááºáááºááŒá
áºáááºá
á€áááºááŸá¬ cloud á áá áºáá»á¬ážááŸáá·áº áá±á«ááºážá ááºážááŒááºážááá¯ááºáᬠáá±á«ááºážá ááºááŸáá·áº áááºáááºááá·áº áá»áœááºá¯ááºááá¯á·á á¡ááŒá¬ážáá±á¬ áá±á¬ááºážáá«ážáá»á¬ážá á¬áááºáž ááŒá áºáá«áááºá
PVS-Studio ááẠááááºáá»á¬ážáá®ááá¯á·ááœá¬ážáááº- Azure DevOps PVS-Studio ááẠááááºáá»á¬ážáá®ááá¯á·ááœá¬ážáááº- Travis CI PVS-Studio ááẠááááºáá»á¬ážáá®ááá¯á·ááœá¬ážáááº- CircleCI PVS-Studio ááẠááááºáá»á¬ážáá®ááá¯á·ááœá¬ážáááº- GitLab CI/CD
Azure DevOps ááŸáá·áº áá±á«ááºážá ááºážááŒááºážááá¯ááºáᬠááááá±á¬ááºážáá«ážááᯠááá¯ááŒá¯ááẠá¡ááŒá¶ááŒá¯ááá¯áá«áááºá á€ááá á¹á ááœáẠá¡áá»áá¯á·áá±á¬á¡áá»ááºáá»á¬ážááᯠáááºááœá¬ážááá¶áá á±ááẠáá»ááºááŸááºáá¬ážáááºá
ááá¯á·ááŒá±á¬áá·áº á€áá±á¬ááºážáá«ážá áá°áá²áá±á¬ááºážáá»á¬ážá
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 ááá¯ááŸá±á¬ááºááŸá¯ááœááºááŸááá±á¬ ááá±á¬áá»ááºáá
áºáá¯ááŸáá·áº ááá·áºá¡áá±á¬áá·áºááᯠáááºáá°ááŒá¯ááŒááºážáá²á·ááá¯á·áá±á¬ ááŒá¿áá¬áá»á¬ážááŸáá·áºáááºáááºááá·áº áá®ážááŒá¬ážááá¹ááá
áºáá¯ááŸáááŒá±á¬ááºáž áá»áœááºá¯ááºá¡á¬áž ááááá±ážáá«áá
á±á
ááááŠážá áœá¬á áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá¡ááœááºáᬠá áááºáá¯ááºáá±á¬ááºááŒá±á¬ááºáž ááœáŸááºááŒáá±á¬ launch trigger áá áºáá¯ááᯠáááºááŸááºááŒáá«á áá¯á· áá¬á áᬠáá¬áááœá²-
trigger:
- master
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠvirtual machine áá áºáá¯ááᯠááœá±ážáá»ááºááẠááá¯á¡ááºáááºá ááá¯á¡áá»áááºááœáẠáááºážááẠWindows Server 2019 ááŸáá·áº Visual Studio 2019 ááŒáá·áº Microsoft-hosted á¡á±ážáá»áá·áºááŒá áºáááá·áºáááº-
pool:
vmImage: 'windows-latest'
ááœá²á·á
ááºážááŸá¯ááá¯ááºáááá¯ááºáááºááá¯á· áááºááœá¬ážááŒáá«á
áá¯á· (ááááºááá¯á·áá«á ááŒá±ááŸááºážáá»á¬áž) áááºááẠááááºáááá¯áá±á¬á·ááºáá²ááºááᯠvirtual machine áá
áºáá¯ááœááºááá·áºááœááºážááááá±á¬áºáááºážá áá»áœááºá¯ááºááẠDocker container ááá¯áááá·áºáá²á·áá«á áá»áœááºá¯ááºááá¯á·ááẠAzure DevOps á¡ááœáẠáá±á¬ááºáááºááœá²á¡ááŒá
ẠChocolatey ááᯠááá·áºááá¯ááºáááºá áá®ááá¯áá¯ááºááá¯á·á ááœá¬ážááŒáá¡á±á¬ááº
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¯ážáá»á²á·ááŸá¯ááá·áºááá·áºáá±áá¬ááᯠááœá±ážáá»ááºááŒá®áž ááá¯ááºááá¯ááŸáááºááá«áááºá Install.
áááºáááºááŸá¯á¡á±á¬ááºááŒááºááŒá®ážáá±á¬ááºá ááŸáááºáá«á á¡ááœá²á·á¡á ááºážááᯠáááºááœá¬ážáá«á:
ááᯠwindow ááœáẠChocolatey á¡áá¯ááºá¡ááœáẠááá°áá¬áá¯á¶á á¶ááᯠáááºááŒááºááá¯ááºáá«ááŒá®á áá¯ááºáááºážáá¬áááºáá»á¬áž configuration file áá áºáá¯ááᯠáááºážááŒááºáá²á·á¡áá« azure-pipelines.yml-
Chocolatey ááá¯ááŸáááºááŒá®áž á¡ááœááºáá»á¬ážá á¬áááºážááá¯ááŒáá·áºáá«
á€ááœááºáá»áœááºá¯ááºááá¯á·ááœá±ážáá»ááºáááºááá¯á¡ááºáááºá install á¡áááºážááœá±áá²á· ááœááºážáá²ááŸá¬á IN Nuspec ááá¯ááºá¡ááẠááá¯á¡ááºáá±á¬áááºáá±á·áá»áºá¡ááẠ- pvs-studio á áá¬ážááŸááºážááᯠáááºááááºááŸááºáá«áá áá»áœááºá¯ááºááá¯á·ááŸáá·áº áá¯á¶ážáááá¯ááºáá®ááá·áº áá±á¬ááºáá¯á¶ážááœááºááᯠááá·áºááœááºážáá«áááºá ááá¯ááºááᯠááŸáááºááá¯ááºáá¡á±á¬áẠáá±á«ááºáž configuration file ááœáẠáá¯ááºáá±ážáá¬ážáá±á¬ áá¯ááºáá±á¬ááºá áá¬ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááá«áááºá
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·áááá¯ááºá á¡áááá¡ááá¯ááºážááá¯á· áááºááœá¬ážááŒáá«á áá¯á·á
- task: CmdLine@2
inputs:
script:
ááᯠáá»áœááºá¯ááºááá¯á·ááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºá ááºááŒáá·áº ááá¯ááºáá áºáá¯ááᯠáááºáá®ážáááºááá¯á¡ááºáááºá áá®ááŸá¬ PVSNAME О PVSKEY - áááºáááºáá»á¬ážááœáẠáá»áœááºá¯ááºááá¯á·áááºááŸááºáá¬ážáá±á¬ áááºááá¯ážáá»á¬áž ááááºážááŸááºá¡áááºáá»á¬ážá áááºážááá¯á·ááẠPVS-Studio á¡áá±á¬áá·áºáááºááŒááºážááŸáá·áº ááá¯ááºá ááºáá®ážááᯠááááºážáááºážáá¬ážáááºááŒá áºáááºá áááºážááá¯á·ááááºááá¯ážáá»á¬ážááᯠáááºááŸááºááẠáá®áá°ážááá¯ááœáá·áºáá«á Variables->ááŒá±á¬ááºážááœá²ááŒá±á¬ááºážá¡áá áº. ááááºážááŸááºáá»á¬ážáááºáá®ážááŒáá«á áá¯á· PVSNAME login ááŸáá·áº PVSKEY ááœá²ááŒááºážá áááºááŒá¬áá±á¬á·á¡ááœááºá á¡ááœááºááá¯á á áºáá±ážáááºááá±á·áá«ááŸáá·áº á€áááºááá¯ážááᯠáá»áŸáá¯á·ááŸááºáá¬ážáá«á á¡ááœáẠPVSKEY. á¡áááá·áºáá¯ááº-
Ñall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials
âu $(PVSNAME) ân $(PVSKEY)
repository ááœááºááŸááá±á¬ bat ááá¯ááºááᯠá¡áá¯á¶ážááŒá¯á ááá±á¬áá»ááºááᯠáááºáá±á¬ááºááŒáá«á áá¯á·á
Ñall build.bat
ááœá²ááŒááºážá áááºááŒá¬áá°áááááºáá»á¬ážááá¯ááááºážáááºážááá·áºááá¯ááºááœá²áá áºáá¯áááºáá®ážááŒáá«á áá¯á·á
Ñall mkdir PVSTestResults
ááá±á¬áá»ááºááᯠááœá²ááŒááºážá áááºááŒá¬ááŒáá·áºáá¡á±á¬ááºá
Ñall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
ât .srcchocolatey.sln âo .PVSTestResultsChoco.plog
PlogСonverter utility ááᯠá¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·áá¡á á®áááºáá¶á á¬ááᯠhtml áá±á¬áºáááºááá¯á· ááŒá±á¬ááºážáá«áááºá
Ñall "C:Program Files (x86)PVS-StudioPlogConverter.exe"
ât html âo PVSTestResults .PVSTestResultsChoco.plog
ááᯠáááºááẠá¡á á®áááºáá¶á á¬ááᯠá¡ááºáá¯ááºáá¯ááºááá¯ááºááẠáá¯ááºáá±á¬ááºá áá¬áá áºáᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()
ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ configuration file ááẠá€áá²á·ááá¯á·ááŒá áºáááº-
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 áá¬áááºááá¯áááºáááºáááºá áá¯ááºáá±á¬ááºá áá¬áá»á¬áž áááºááºááá¯á· ááœá¬ážááŒááºážááŒáá·áº á¡á á®áááºáá¶á á¬ááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒáá«á áá¯á·á
Chocolatey ááá±á¬áá»ááºááœáẠC# áá¯áẠááááá ááá¯ááºážáá¬áá«ááŸááááºá ááœá±á·ááá²á· Error á¡áá»áá¯á·ááᯠáá±á·áá¬ááŒáá·áºáá¡á±á¬ááºá
á ááºážáááºááŸá¯ááááºáá»á¬áž
ááááá±ážáá»áẠN1
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
ááœá²ááŒááºážá áááºááŒá¬áá°ááẠá¡áááá¹áá¬ááºáááŸááá±á¬ ááááºážááŸááºááá¬áááºááᯠáá°á·áá¬áá¬áá° ááŸá¬ááœá±ááœá±á·ááŸááá²á·áááºá ááŒá áºááá¯ááºáá»á± á¡áá»á¬ážá á¯ááŸá¬á á€ááááºážááŸááºáá»á¬ážáá²á០áá áºáá¯á¡á á¬áž á¡ááŒá¬ážáá áºáᯠááŸáááá·áºáááºá áá±á¬ááºážááŒá®á ááá¯á·ááá¯áẠáááºážááẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒá áºááŒá®áž á¡ááá¯áá¬áááºááᯠááá¯ážááŸááºážá áœá¬ áááºááŸá¬ážááá¯ááºáááºá
ááááá±ážáá»áẠN2
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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;
}
}
á¡á±á¬áºááá±áá¬ááœá¬ááŒá¬ážáá»áẠ& á¡á±á¬áºááá±áá¬áá¶á០&& ááá¯ááá¯áááºááŸá¬ expression á áááºáááºá¡ááŒááºážááŒá áºáá«á áááŸááºáá±á¬ááá¯á·áá±á¬áẠáá¬áááºááŒááºážááᯠááœááºáá»ááºáá±áá²ááŒá áºááŒá®ážá á€ááá á¹á ááœáẠáááá¯á¡ááºáá±á¬ áááºážáááºážáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠááá¯ááá¯áááºá system.directory_ ááŸááá±áá«áááºá.
á¡ááá¯ááºážá¡á
ááœááºá á€áááºááŸá¬ á¡áá±ážá
á¬ážáá»áá¯á·ááœááºážáá»ááºááŒá
áºáááºá áá¯ááºáá«áááºá á€á¡ááŒá±á¡áá±á¡á¬áž & á¡á±á¬áºááá±áá¬á¡á¬áž && á¡á±á¬áºááá±áá¬ááŒáá·áº á¡á
á¬ážááá¯ážááŒááºážááŒáá·áº á¡áá±á¬ááºážáá¯á¶ážááŒá
áºá¡á±á¬áẠáá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž áááºááœá±á·áá»áá±á¬á¡ááŒááºá¡áá áááºážááẠáááºááá·áºá¡áá¬ááá¯áá»áŸ áááááá¯ááºá
á±áá«á ááá¯á·áá¬ááœááºá á¡ááŒá¬ážááá
á¹á
áá»á¬ážááœááºá &&& ááŒá¬ážááœáẠááŸá¯ááºááœá±ážááŸá¯áá»á¬ážááẠá
áá¬ážáááºááá¬áááºááŒááºážááᯠááŸá¬ážááœááºáž/áááŸááºáááºáá±á¬áááºááá¯ážáá»á¬ážááŒáá·áº áááºáá¶áá±á¬á¡áá«ááœáẠááŒá®ážáá¬ážáá±á¬ááŒá¿áá¬áá»á¬ážááŒá
áºá
á±ááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·á error collection á
if ((k < nct) & (s[k] != 0.0))
ááááºážááẠk ááŸá¬ážááœááºážáá±áááºá áááºážááᯠarray ááŒááºá ááºááá¯á· áááºáá±á¬ááºááẠá¡áá¯á¶ážááŒá¯áá«áááºá ááááºá¡áá±áá²á· ááŒáœááºážáá»ááºá¡áá±áá²á· áá»áœááºážáá»ááºá¡áá±áá²á· áá±ážáá«áááá·áºáááºá IndexOutOfRangeException.
ááááá±ážáá»ááºáá»á¬áž N3á N4
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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
....
}
....
}
á€ááá á¹á ááœááºá ternary operator ááá¯ááºáá±á¬ááºááŸá¯áá±á¬ááºááœááºááœáẠáá°ážáááºážáá±á¬áá¯áá¹áááá áºáá¯ááŸááááºá á¡áá®ážáááºáá±á·áá¬ááŒáá·áºáá¡á±á¬ááº- áá»áœááºáá±á¬áº áá¶áá«áẠ1 áá²á· á¡ááŸááºá¡áá¬ážááŒá¯áá¬ážáá²á· á¡ááŒá±á¡áá±áá²á· ááá¯ááºáá®áááºá á¡ááŒá²áááºáž ááŒá áºáá±áá²á· á¡ááŒá±á¡áá± 2 ááᯠáááºááœá¬ážáááºá á á áºááŸááºáá²á·ááá¯ááá¯áááºááŸá¬ ááá¯ááºáž 3 ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºááŒá áºáááºá á¡ááŒá±á¡áá± 1 ááẠfalse ááŒá áºááœá¬ážáá«áá áá¶áá«áẠ4 ááŒáá·áº á¡ááŸááºá¡áá¬ážááŒá¯áá¬ážáá±á¬ áá»ááºážááá¯á·ááœá¬ážáá«áááºá á á áºááŸááºáá²á·ááá¯ááá¯áááºááŸá¬ á á¬ááŒá±á¬ááºáž 5 ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá«áááºá ááá¯á·ááŒá±á¬áá·áºá ááŸááºáá»áẠ0 ááŒáá·áº á¡ááŸááºá¡áá¬ážááŒá¯áá¬ážáá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááẠáááºááá·áºá¡áá«áá»áŸ ááŒáá·áºá á¯á¶áááá·áºáááºááá¯ááºáá±á áááºážááẠáááá¯ááááºáᬠáá»áŸá±á¬áºááá·áºáá¬ážááá·áº áá¯ááºáá±á¬ááºááŸá¯á áá¯áá¹ááááŸáá·áº á¡ááá¡áá» ááá¯ááºááá¯ááºáá«á
ááááá±ážáá»áẠN5
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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)
variable áá ááá¯á· j á¡áááºáá±á¬áºááŒáá« ááá¯ááºážá¡áááºážáááºááᯠáá¯áááá¯á· á¡á ááŒá¯ááŒá®áž ternary operator á០áááºááá¯ážááᯠááŒááºáá±ážáá«áááºá áááŸááºáá±á¬. á€á¡ááŒá±á¡áá±ááŒá±á¬áá·áºá loop áááá¯ááºáááºááᯠáá áºááŒáááºáᬠáá¯ááºáá±á¬ááºáááºááŒá áºáááºá áá®áá¯ááºá¡ááá¯ááºážá¡á á áááá¯ááááºáᬠáááºááœááºáá¬ážáá²á·á¡ááá¯ááºáž á¡áá¯ááºááá¯ááºáá°ážááá¯á· áá°ááá«áááºá
ááááá±ážáá»áẠN6
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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);
}
....
}
....
}
á€áá±áá¬ááœáẠáá°ážáááºážáá±á¬ á¡ááá¯ááºá¡ááŒá¯á¶áá áºáᯠááŸááá«áááºá installPackageVersions.Count != áá¡ááŒá²áááºážááŒá áºáááá·áºáááºá á á áºááŸááºáá²á·. áááŒá¬áá ááá¯ááááá±ážáá»ááºááẠáá¯ááºááœáẠáá¯áá¹áááááºáá±á¬ á¡ááŸá¬ážááᯠááœáŸááºááŒááŒá®áž á¡ááŒá¬ážááá á¹á áá»á¬ážááœáẠáááá¯á¡ááºáá² á á áºáá±ážááŒááºážááᯠááá¯ážááŸááºážá áœá¬ áá±á¬áºááŒáááºá
ááááá±ážáá»áẠN7
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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=");
áá±á¬áºáá®áá°ážááá·áºáá¬ážáá±á¬ á¡ááŸá¬ážáá»á¬ážááẠá¡áááºážá¡ááŒá áºáá¯ááºáá»á¬ážá áœá¬ááŸááá±á¬ áááºááá·áºááá±á¬áá»ááºááœááºáááᯠáááŒá¬áá® ááá¯á·ááá¯áẠáá±á¬ááºááá¯ááºážááœáẠáá±á«áºáá¬ááá¯ááºááŒá± ááŒáá·áºáá¬ážááŒá®áž áááºážááá¯á·ááᯠááá¯ááºáá»ááºááẠá¡áá±á¬ááºážáá¯á¶ážáááááá¬áá»á¬ážáá²ááŸáá áºáá¯ááŸá¬ áááºááŒáááºááŸá¯ááá¯ááºáᬠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááŒá áºáááºá
PS á¡ááŒá²ááá¯ááá¯á áá® error áᬠmulti-line condition áá
áºáá¯áá²á·á¡áá¯á¶ážááŸá¬ áá±á«áºáá¬áááºáá«ááẠ:) á
á¬á
á±á¬ááºááá¯ááŒáá·áºáá«"
ááááá±ážáá»áẠN8
ááœá²ááŒááºážá
áááºááŒá¬áá° ááááá±ážáá»ááº-
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)
{
....
}
....
}
ááá¹ááááºá¡ááŸá¬áž- áááá¡áᬠááá·áºááœááºážáá¬ážáá±á¬ Package áá¯á¶ážááŒá®ážáá±á¬á· á á áºáá±ážáááºá ááá¬ážááááºáá±á¬. á€áá±á¬áá«ááŸá¬ááœá±ááŸá¯ááẠáááá¯ááááºááŸá ááŒá¿áá¬ááŸá áºáá¯á¡áááºá០áá áºáá¯ááᯠááŒá±á¬ááŒáááº- ááá·áºááœááºážáá¬ážáá±á¬ Package áááºáá±á¬á·á០ááá®áá»áŸáá°ážá ááá¬ážááááºáá±á¬áá¶ááááŒá áºááœááºááŸáááŒá®áž áá»ááºáááºááŸááºááẠáááá¯á¡ááºáá±á¬á·ááẠááá¯á·ááá¯áẠáá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááœáẠááá¯ážááœá¬ážáá±á¬ á¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááᯠáááŸáááá¯ááºááẠ- null áááºááœáŸááºážáá»ááºááᯠááá°ááẠááŒáá¯ážáááºážááŸá¯á
áá±á¬ááºáá»ááº
ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáááºááŒá±ááŸááºážáá±ážáá±ážáá áºáá¯ááᯠááŸááºážááŒá®ážáá«ááŒá® - ááᯠPVS-Studio ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠááá¯ááááºááœááºáá°ááŒá®áž ááá¯ááá¯á¡áááºááŒá±áá¬áá«áááºá Chocolatey ááẠPVS-Studio ááá¯á¡áá¯á¶ážááŒá¯áá¬ááœáẠá¡áááºážáááºáá»áŸáá¬ááŸáááá¯ááºááá·áº áá¯ááºááœáẠá¡ááŸá¬ážá¡ááœááºážá¡áááºážáááºáá«ááá·áº áá±á¬ááºážááœááºáá±á¬ áááºáá±á·áá»áºáááºáá±áá»á¬ááŒá áºááŒá±á¬ááºážáááºáž áá»áœááºáá±á¬áºááŒá±á¬ááá¯áá«áááºá
ááááºáá±á«áºáá«áááºá
PS
ááá¯ááºáá±áá®á áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºážáá«ážááᯠChocolatey developer áá»á¬ážáᶠáá±ážááá¯á·áá²á·ááŒá®áž áááºážááá¯á·ááẠáááºážááᯠáá±á¬ááºážááœááºá áœá¬ áááºáá¶áááŸááá²á·áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá±ážááŒá®ážááá·áºá¡áá¬áá áºáá¯áá»áŸáááœá±á·áá²á·ááá±á¬áºáááºážá á¥ááá¬á¡á¬ážááŒáá·áºá áááºážááá¯á·ááẠ"api-key" áá±á¬á·ááŸáá·áºáááºááá¯ááºááá·áº áá»áœááºá¯ááºááá¯á·ááœá±á·ááŸáááá·áº bug ááᯠááá±á¬áá»ááŒáááºá
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Vladislav Stolyarov ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com