
ααΎααααααααααα’ααΆαααΆααααα½αααααΎααααΆαααααα PVS-Studioα α§ααααααα·ααΆαααααααΎαα₯α‘αΌααααααΆααα
αααα»α Chocolatey αααααΆαααααα·ααΈααααααααααααα
αααααααΆαα WindowsααΎαααΏααΆααααΆ ααΆαααααΎααααααααΉααα½αααααα½ααααααΆαααΆαααααααΆα PVS-Studio ααΆαα·ααααα
αααα»αααααΆαααα cloudα ααΎααααΈα
αΆααααααΎα α
αΌαααΎααα·αα·αααααΎαααΌαααααααααα Chocolateyα Azure DevOps ααΉααααααΎααΆαααααααα CIα
αααααΊααΆαααααΈααα’αααααααααααααααααααΎαααΎαααααΆαααααααΆααα½ααααα αΌαααΆαα½ααααααααααααα
αααα»αααααΆαα’αααα±ααααα α·ααααα»αααΆααααΎα’αααααααααΌαα’αααΈααΆααα½ααααα αΌαααΆαα½α Azure DevOps ααααααααα»αααααΈαααα ααα»α αα½αα ααα½αααααΌαααΆααα»αα αα ααΎααααΈαα»αα±ααα ααααα
ααΌα ααααααΈααα»ααααα’ααααααααα
β α§ααααααα·ααΆαααΌααα·αα·αααααα½ααααααααΌαααΆααα ααΆα‘αΎαααΎααααΈααααΎαααα α»α αα·αααΆαααΆαααααααααααα’αΆα ααΎαααΆααα αααα»ααααααα·ααΈααααααααααΆ C, C++, C# αα·α Javaα ααααΎαααΆαααΎαααααααα 64 αααΈαα Windows, Linux ΠΈ macOSαα·αα’αΆα αα·ααΆαααΌαααααααααααααα ααΎαααα·ααΆ ARM 32-bit, 64-bit αα·α embeddedα ααααα·αααΎα’ααααααα»αααΆαααααααΆααα·ααΆαααΌααα·αα·αααααααααΆααααααααααααα’αααααΆααΎαααααΌα ααΎαααΌαααααΆαα±ααα’αααααααΆαααααα½αα―αααΆαα½α α’αααΈααααααΎαααΆααααααΆα 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ααΆαααααΆαααΎα ααΆαααααααΌαααα§ααααααα·ααΆα αααααΆαααΆαααΆαααααΌαααα»ααααααααααααΌαααΆαααα‘αΎαα αααααααααααααΆααα’αα ( 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 α . ααΆααααα αααααααΎαααΉαα αΆααααααΎαααααΆααααΆαα½αααΉαααΆααααααα―αααΆαααααααα ααΆααααααααα
ααΆααααΌα α αΌαααΎααααα ααααααα·ααΈααΎαααααΎαααΆα ααααααα αΆαααΆααΎαααΎαααααΎαααΆααααααΆααααααΆαααααΆααααααΌααα αααα»α αα ααΆααΆα
trigger:
- masterαααααΆαααα ααΎαααααΌαααααΎαααΎααααΆαααΈααα·αααα·ααα½αα αα α ααα»α ααα ααΆααΉαααααΆαααΆααααΆααααΆαααααααα ααααα Microsoft ααΆαα½α Windows Server α’α α‘α© αα·α Visual Studio α’α α‘α©α
pool:
vmImage: 'windows-latest'α αΌααααααα αα½ααα―αααΆαααααααα ααΆαααααααα (αααα»α ααα αΆα) αααααΈααΆααΆααα·ααααααΆα’ααααα·αα’αΆα ααα‘αΎααααααα·ααΈααααΆααα αααα»ααααΆαααΈααα·αααα·αααααα αααααα»ααα·αααΆααααααα Docker container αααα ααΎαα’αΆα αααααα Chocolatey ααΆααααααααααααααααΆαα Azure DevOps α ααΎααααΈααααΎααΌα αααααΌααα . α α»α ααααΆαααα₯ααα·ααααα. αααααΆαααα ααααα·αααΎα’αααααααΌαααΆαα’αα»ααααΆααα½α α αΎα ααααΆααααααααΎαααΎαααααΈααααα’ααα α αΎαααααα·αααΎαα·αααΆααα αααααΆααααααααΎααΌα ααααΆαααααΆααααΈααΆαα’αα»ααααΆαα

αα ααΈαααα’αααααααΌαααααΎαααΎααααααααααααΎαααΉααααααααααααααααααα αΎαα α»α αααΌαα»α ααα‘αΎα.

αααααΆααααΈααΆαααα‘αΎαααααααααΌαα α»α αααααα α’αααααΆα:

α₯α‘αΌαααα α’αααα’αΆα ααΎαααααΌαααααΆαααα·α αα ααΆα Chocolatey αα αααα»ααααα’α½α ααΆααα·α αα αα αααααααααα½αα―αααΆαααααααα ααΆαααααααα azure-pipelines.ymlα

α α»α ααΎ Chocolatey α αΎαααΎααααααΈααΆαα

αα ααΈαααααΎαααααΌαααααΎαααΎα ααα‘αΎα αα αααα»αααΆαααΆαα½ααααα»αα IN αααααα―αααΆα Nuspec αααα αΆαααααααααα αααααααααΌαααΆα - pvs-studio α ααααα·αααΎα’ααααα·ααααααΆαααααααα ααααα α»αααααααααα»αααΉαααααΌαααΆαααα‘αΎα αααααΆαααααΉαααΎαααΆαααααα»αα αααα α»α αααΌαα»α αααααα α αΎαααΎαααΉαααΎαααΆααα·α αα αααααΆααααααΎααα αααα»αα―αααΆαααααααα ααΆααααααααα
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'αααααΆαααα ααΎααααααα αααααααααΆααααα―αααΆαααααααΎαα
- task: CmdLine@2
inputs:
script: α₯α‘αΌααααααΎαααααΌααααααΎαα―αααΆααααααΆαα’αΆααααΆαααααα’ααααα·ααΆαα αα ααΈααα PVSNAME ΠΈ PVSKEY β αααααβααβα’αααβαααβαααααβααΎαβαααααΆααβαααα»αβααΆαβαααααα αα½αααααΉααααααΆαα»αααΆαα αΌα PVS-Studio αα·ααααααΌαα’αΆααααΆαααααα ααΎααααΈααααααααααααααααΆ ααΌαααΎααααΊαα»α Variables-> α’αααααααΈα. ααααααααΎαα’ααα PVSNAME αααααΆααααΆαα αΌααα·α PVSKEY αααααΆαααααααΉααα·ααΆαα αα»αααααα αα·αα·αααααΎααααα’αα αααααΆααααααααααΆαααααΆαα αααααΆαα PVSKEY. ααΌαβαααααΆα
Ρall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials
βu $(PVSNAME) βn $(PVSKEY)α αΌαααΎααααααΎααααααααααααααΎα―αααΆα bat αααααΆαααΈααΆαααα αααα»αααααΆααα
Ρall build.batααααααααΎα folder αααα―αααΆααααααΆαααααααααααα’ααααα·ααΆαααΉαααααΌαααΆααααααΆαα»αα
Ρ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()αααα α»α αααααΆαα»α -> αααααΆαα»α -> ααα ααΎααααΈααααΎαααΆαααΆααα·α αα α αααααΆααααααΆαααΆααααααα αΌααα ααΆααααααΆαααα·α αα ααΆαα
αααααα Chocolatey ααΆαααααΉααα 37615 αααααΆααααααΌα C# ααα»αααααα ααΌααααα‘ααααΎαααα α»ααα½αα ααα½ααααααΆαααααΎαα
ααααααβααβααα
ααΆααααααΆα N1
ααΆααααααΆαααααα’ααααα·ααΆαα α’ααα 'α’ααααααααααααΆ' ααααΌαααΆαααααααα αααα½αααΆααααΆααα CrytpoHashProviderSpecs.cs α£α¨
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}α’ααααα·ααΆαααΆαααααΎαααΆαα αΆααααΆααααα’ααααα αααα½αααΆ ααααα·αααα ααα»ααα ααΆαα αααΎαααααααΆαααα½αα±ααα’ααααα½ααααα»αα ααααα’αααααΆααααα αα½αααααΆααα½αααααααααα αααα αΎα α¬αααααΊααΆααΆαααΆααα»α α αΎααα·α αα ααΆαααααααα’αΆα ααααΌαααΆαααα αααααααΆααααα
ααΆααααααΆα N2
ααΆααααααΆαααααα’ααααα·ααΆαα [CWE-480] ααααα·ααααα·αα '&' ααΆααααααααααα·ααααα·ααΆαααΆααααΈαα αααα ααβααΆβααααααΈβααααΈ '&&' operator αα½αβααααΌαβααΆαβααααΎβαααα½αβαα·αα Platform.cs α¦α€
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_ααΆα.
αα αααα»αααααααααααΆααα·α αΆαααΆ αααααΊααΆαα»ααα·ααααα·ααΌα αα½αα ααΆα/α αΆα αααααααααααα’αΆα ααααΌαααΆαααααΎα±αααααααΎααααααΆααααα½α && αααααααΎααααα·ααααα·αα && ααα»ααααααΆαααααααααΆααααααα ααΆαα·ααααααΆαααααα’αααΈαααααα ααααααΆαααΆααααα αααα»αααααΈαααααααα ααΆαααΆααα ααα‘ααααΆα & αα·α & α’αΆα ααααα±ααααΆααααα αΆααααααααα αα αααααααααααααΆαααααΆαααααααααααααΌαααΆαα αΆαααα»ααααααααααα·αααααΉαααααΌα/αα·αααααΉαααααΌαα α§ααΆα ααα αα αααα»αααΆααααααΌαααα α»αααααααΎα , ααΆαααααΈαααα
if ((k < nct) & (s[k] != 0.0))αααααΈααΆααααααααα k αα·αααααΉαααααΌααα ααΆααΉαααααΌαααΆαααααΎααΎααααΈα αΌαααααΎααΆαα»α’αΆααα ααΆααααααααααΈααΎαααααα½αααΉαααααΌαααΆααααα αα IndexOutOfRangeException.
ααΆααααααΆα N3, N4
ααΆααααααΆαααααα’ααααα·ααΆαα [CWE-571] αααααα 'shortPrompt' ααΊαααααααΆααΆααα·αα InteractivePrompt.cs α‘α α‘
ααΆααααααΆαααααα’ααααα·ααΆαα [CWE-571] αααααα 'shortPrompt' ααΊαααααααΆααΆααα·αα InteractivePrompt.cs α‘α α‘
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 α ααΌααααα‘ααααΎαα±ααααΆααααα αααΆααα ααααα·αααΎααααααααααααααα»αααΆααααααΆαααααααα 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 αααααΆαααα½αα ααα½αααΆαααΎααααΌαααΆαα αΆααααααΎααα ααΆααΌααα ααααα·ααααα·αα ternary ααΉααααα‘ααααααα αα·ααα·α. αααααΆαααααααααααααααα½ααααααα·ααα»αααΉαααααΌαααΆαααααα·ααααα·ααααααααα»αααααα ααΆα αΆααααΌα ααΆαααα»αααΆαααααααααΌαααααα·αααααΎαααΆαααΆααααααα ααΌα αααα’αααααααααααααα·ααΈααΆαααααα
ααΆααααααΆα 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);
}
....
}
....
}ααΆαααααΆαααΆαα ααααααα½ααα ααΈαααα installPackageVersions.Count != α‘αααααΉαααΆαααΆαα·α αα ααΆααΆααα·α. ααΆααΉαααΆααααΆααααααΆααααααααααα αΆαααΈααα α»αα‘αΌααΈαααα αααα»αααΌα α αΎααααα»αααααΈααααααααααΆααααΆαααααααα αΆαααΈααΆααααα½ααα·αα·αααααααα·αα αΆαααΆα αα
ααΆααααααΆα N7
ααΆααααααΆαααααα’ααααα·ααΆαα ααΆαααααααααααΌα ααααΆααααα·α 'commandArguments.contains("-apikey")' αα ααΆαααααα αα·αααΆαααααΆααα '||' ααααα·ααααα·ααα ArgumentsUtility.cs α€α’
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=");ααα α»αα αααααα·αααααΆααααΆαα±ααΆαααααααααα»αααΆααααα αΆαααΆααα α¬ααααααααα αααα»αααααααααΆαα½ααααααΆαααΌααααααα αααΎα α αΎαα§αααααααααα’αααα»ααα½αααΎααααΈααααα»ααααααααΆααααΉααα½αααΆααΊααΆααα·ααΆααα·αα·ααααα
PS α αΎαααΌα ααΆαααα ααα α»ααααααααααΆααα α‘αΎααα α α»ααααα αααααααααααααα α»αα½α :) α ααΌαααΎαααΆαααααα»αααααααΆα "".
ααΆααααααΆα N8
ααΆααααααΆαααααα’ααααα·ααΆαα [CWE-476] ααααα» 'installedPackage' ααααΌαααΆαααααΎαα»ααααααΆααααΌαααΆααααααααααΆαααααααΆααααΉαααΆαα αΆαααα»αααΆααααα αα·αα·ααααααααΆααα 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 α ααΆαααααΎααααΆααααΆαααααΆααααΌαα§ααααααα·ααΆααα·αα·ααααααΉαααααΎα’αααααααΎαα‘αΎαααΌααα»αααΆα αα·αααΆαααΏααΆααααααΌαααααααα»αααααα’ααααααααΎα αα·ααα½αααΆαααΆαααα»αααααΆα αααΎα .
PS
αα»ααααααααα»ααα ααΎαααΆαααααΎα’ααααααα α’αααα’αα·αααααα Chocolatey α αΎααα½αααααΆαααα½αααΆαααΆαααα’α ααΎαβαα·αβααΆαβααβααΎαβα’αααΈβαααβααααΆααβαααβαα ααα»ααααβααΆβα§ααΆα ααα αα½αααβα αΌαα α·αααβααα α»αβαααβααΎαβααΆαβααβααΎαβααΆααααβααΉαβαααααΉα "api-key"α
ααααα·αααΎα’αααα
ααα
αααααααα’ααααααααααΆαα½ααααααα·αααααααα·ααΆαααΆααΆα’ααααααα ααΌαααααΎαααααααααα Vladislav Stolyarov α .
ααααα: www.habr.com
