PVS-Studioá áá áá á¨á áá ááš áĽáá˛áá áĽáááĽáááᢠá¨áĽá á°ááłá á áá ááááśááľ á¨áĽá
á á áľá°áłáłáŞ á ááá Chocolatey ááľáĽ ááááᢠáá
ᨠPVS-Studioá á á°ááá á á°áá á áááááśá˝ ááľáĽ áááááľá áŤááťáťá áĽáá áĽáááááᢠáŠá
áĽááłáááľ áŁá¨á°ááłáłáŠá á¸áŽááľ ááá áŽáľ áĽáááľá˝á˘ Azure DevOps áĽáá° CI áľáááľ áá°áŤáá˘
á¨á°áá áľáááśá˝ áá áľáááááľ áááľ á¨áá ááá˝ á˝áááťá˝á áááá áĽáááĄ-
PVS-áľáąá˛áŽ áá° á°áááá˝ áááłá: Azure DevOps PVS-áľáąá˛áŽ áá° á°áá áááłá: Travis CI PVS-áľáąá˛áŽ áá° á°áááá˝ áááłá: CircleCI PVS-áľáąá˛áŽ áá° á°ááá áááłáᥠGitLab CI/CD
ᨠAzure DevOps áá áľá áá á°áľ áááááŞáŤá á˝áá áľáŠá¨áľ áĽááľáľá°áĄ áĽáááááłáá ᣠááááŤáąá á áá ááłá áá á ááłááľ ááĽáŚá˝ áĽááłááŁá áľááááŠá˘
áľááá á¨áá á˝áá áááá˝áĄ-
Chocolatey áľááá áá
á áá
áá á¨áĽá
á á áľá°áłáłáŞáá áĽáá´áľ áĽáá°ááá áá¨áľ áá˝áá
á¨á°ááłáá á¨á áἠáá áľáŞáľ áĽáá˛áá áľáĽáá ááľáĄáĄ-
choco install pvs-studio
á¨á°áá°á á¨PVS-áľáąá˛áŽ áĽá á áľáŞáľ áĽáá˛áá áľáĽáá ááľáĄáĄ-
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 áľá á°ááłáá ááš á á ááá ááłá áĽáááá¨áľá˘
á á°áἠááľá¨á
áĽáá° á áŤáááľ áááááĽáŁ á¨áááŁáł á§á᧠ááľáá ááá á áĽá áááŤáá á GitHub áá¨ááť ááľáĽ áŤáá ááŽáááľ áá áááłá°áá á á°ááá¨á° á¨á°áᨠááá áĽááłá ááľáłááľááľá˘
á ááááŞáŤáŁ á¨ááľáááŞáŤ ááľá á´á áĽáááá ᣠáá á ááááŚá˝ áĽáť áĽáá°ááááá áŤáłáŤá áŁáá¤áľ á áááŤááĄ
trigger:
- master
á ááá á áááŁá áá˝á ááá¨áĽ á ááĽá. áá áá á¨áááśááľ á áááá 2019 áĽá áŞáĽáá áľáąá˛áŽ 2019 áá á ááááŽáśááľ á¨ááľá°áááľ ááŞá ááááá˘
pool:
vmImage: 'windows-latest'
áá° á¨áá
á ááá á áŤá áĽáááľ (á ááľ á°á¨ááá˝). ááá áĽááłá á¨áááá° áśááľááŽá˝á áá° á¨áášáá áá˝á ááŤá áŁáá˝áá á¨áśá¨á áŽáá´ááá á áá¨áááŠáᢠChocolatey á Azure DevOps áĽáá° á
áĽáŤ áá¨á áĽáá˝áááᢠáá
áá áááľá¨á áá° áĽáááľ
áĽáá á áĽáŤáá á¨ááá¨ááá áľá áŚáł ááá¨áĽ áĽá á ááŤáŠá á á ááľá¨á áŤáľáááááłá áŤá.
á¨á°áłáŤ áááľ á áá á á áŤáľáá áá° áľáá áľ ááĽá:
á áá á ááľáŽáą ááľáĽ á Chocolatey á°ááŁá á áĽááľ áá¨áľ áá˝áá á°ááŁáŤáľ á¨ááááŞáŤ áááá á˛áŤááľá Azure-pipelines.yml:
Chocolatey áá á á áŤáľáá áĽá á¨ááľáŽá˝á áááá áááá¨áąáĄ-
áĽáá ááá¨áĽ á ááĽá áŤá á ááłá ááľáĽ á¨áĄáľááš áá. ááľáĽ Nuspec ááá áľá á¨áááááá áĽá á áľá áŤááááą - pvs-studio. áľáŞáąá áŤáááášáľ, á¨á áἠááá ááŤáá, áá á áá á áá ááľáááá. á ááŤáŠá áĽááŤá á áá áĽá á¨á°áá á¨áá á°ááŁá á ááááŞáŤá ááá ááľáĽ áĽááŤáá.
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
á ááá á áá° á¨áááá˝á áá ááá áĽáááľáĄ-
- task: CmdLine@2
inputs:
script:
á áá á¨á°ááłá áááľ áá ááá ááá á á ááĽáᢠáĽáá PVSNAME и ááŞáľáŞ - á á ááĽáŽá˝ ááľáĽ áĽá´áśáťá¸áá á¨ááááá˝áŁá¸á á¨á°ááááŽá˝ áľáá˝á˘ á¨PVS-áľáąá˛áŽ ááá˘áŤ áĽá á¨áááľ ááá áŤá¨ááťáᢠáĽá´áśáťá¸áá ááááááľ, ááááá ááááą á°ááááŽá˝-> á á˛áľ á°áááá. á°ááááŽá˝á áĽááá á PVSNAME áááá˘áŤ áĽá ááŞáľáŞ áá°ááłá ááá. áłáĽá áá ááááľ ááľá¨áá á áááą áá áá áĽá´áľ á ááľáĽá áŤáľááᥠá ááŞáľáŞ. á¨áľáĽáá áŽáľ
Ń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
ᨠ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()
á á áĽááľáá á áľááἠ-> á áľááἠ-> á ááľ á°ááŁáŠá áááľáŹáľ. áá° á°ááŁáŤáľ áľá á áááľ áŞáááąá áĽáááá°áá˘
á¨ážáŽáᲠááŽáááľ 37615 á¨C# áŽáľ ááľááŽá˝á áĽáť áááᢠá¨á°áááľá á ááłááľ áľá á°áśá˝ áĽáááá¨áľá˘
á¨áá¨áŤ áá¤áśá˝
ááľá ááá፠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;
}
}
á¨áŚááŹá°á ááŠááľ & á¨áŚááŹá°á && á¨áááťá á á፠á áŠá á¨áá áá á¨áá°áľ, á¨á፠á¨áá áá á ááá áá°áá, á áá ááłá áá á ááľááá á¨áľááľ áĽáŞáá˝á áŤááááłá system.áááŤ_á á.
á á°á áá°á ááá ááľáĽ, áá
áľáá˝ ááľááľ áá. á áᣠáá
áááł áŚááŹá°áŠá á &&áŚááŹá°á á áá°áŤáľ áááťá¸áľ ááťááᣠááá áá á¨á°ááŁáŤá áĽááł áá
ááá á áááłáᢠááá ááᣠá ááá˝ áááłáá˝áŁ á & áĽá && ááŤá¨á á፠áááŁáľ á¨áá á¨áááľ á ááááš áľááá áŁááá/ áá áŁááá áĽá´áśá˝ á˛áłá¨á á¨áŁáľ á˝áá áááĽá áá˝ááᢠáááłá á áľá
á°áľ áľáĽáľáŁá˝á ááľáĽáŁ
if ((k < nct) & (s[k] != 0.0))
áá¨á á ááá áĽááłá á˘áá k áľááá á áá°ááᣠá¨áľááľá á áŁá áááľá¨áľ áĽá á áá ááááᢠá áá¤áąá, á¨á°áᨠáááł ááŁáá 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
....
}
....
}
á áá ááłá áá, á¨á°áá᪠áŚááŹá°á á á áŤá á áľá°ááᣠá ááľ áĽáááł á áááᎠá á. áĽáľá˛ á áá áĽáá áĽáááááᥠá ááĽá 1 áá áŤáľáááĽáŠáľ á áľá áááł á¨á°ááᥠáá° áááłá ââ2 áĽáá¸áááŤááᥠáá á áá áá ááᢠáĽááá°ááá á áááľ ááľáá 3 ááááá áááľ ááᥠáááł 1 áá°áľ áá á¨á°ááᥠáá° ááĽá 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)
á¨á°áááá j á¨áá áŤááľ áĽááľ ááľááŽá˝ áá° áᎠá°ááá¨áá ᣠá¨á°áá᪠áŚááŹá°á áĽá´áąá ááááłá á¨áá°áľ. á áá áááł ááááŤáľ á¨áá á áŤá á ááľ áá áĽáť áá¨áááá. áá áŽáľ ááŽááŤáá áĽááłá°á á ááá á¨ááá°áŤ áááľááá˘
ááľá ááá፠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);
}
....
}
....
}
á ááľ áĽáááł á¨áá á¨áá áááł áĽáá á ááĄ- á°áááPackageVersions.Count!= 1ááááá á¨áááá áĽááá°á. áĽááá áá áĽáá˛á ááááą ááľá ááá፠á áŽáą ááľáĽ á¨ááá áľá á°áľ áááŠá áŤáłáŤá, áĽá á ááá˝ áááłáá˝ á°áá á ááá á á°á°ááá ááá°á˝á áŤááááłá.
ááľá ááá፠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");
}
áá áá á¨áŽáľ ááá á¨áťáá ááŽááŤáá á¨áá¨á¨áťáášá áááľ ááľááŽá˝ áááĽáŚ ááĽá áá¨á á¨áľáśáłáᢠá áá ááááŤáľ á¨ážáŽááľ á°á áááá˝ áááŞáŤáá áá°áá á á ááťáá á á᪠áááľ á°á¨á᪠ááááśá˝á˘ á¨áá áŤááľ áááŞáŤáá˝ áá á áááłá°á ááአá¨áá¨á°ááľá á ááŤáŽá˝ áá á¨áĽ áĽá˝ááááĄ-
commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");
á¨áááá ἠáľá á°áśá˝ ááĽáá ááá ááááś á¨áá°á áá á áŤáá á¨ááá áŽáľ áŁáá ááŽáááľ ááľáĽ á¨ááłá¨áľ áĽáľáá¸á á¨áá°á ááᣠáĽá áĽááąá ááááá á áŁá áĽáŠ á¨áá ááłáŞáŤáá˝ ááľáĽ á ááą á¨áááááłááľ áľááłá ááá˘
PS áĽá áĽáá° ááááá áá
áľá
á°áľ á áŁááĽá ááľáá áááł áá¨á¨áť áá ááłáŤá :). á
áľááąá áááá¨áą"
ááľá ááá፠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)
{
....
}
....
}
ááá˛á áľá á°áľáĄ ááááŞáŤ áĽá á¨á°áŤá ááŹá áĽá á áá áááá áĽá á¨á፠ááŁáŤá áŁáś. áá ááá፠á ááŽááŤá ááľáĽ áŤááľ áááľ á˝ááŽá˝ á ááąá áááá¨ááᥠáá á¨á°áŤá ááŹá áá˝á áĽáŠá á áá°áá áŁáś, á á áŤáŁáŞ áá, áĽá á¨á፠áźáŠ áĽá áá á¨ááá°áŤ áá, ááá á áŽáą áá á¨áŁáľ áľá á°áľ ááá¨á áá˝áá - áŁáś ááŁááťá áááááľ áá¨áŤ.
áá°áá°ááŤ
áľááá áá áľáá˝ áĽááá ááľá°áá - á áá PVS-Studioá áá áá á¨á áá ááá áĽá á¨á áá ááš áááᢠáĽá á°áá áááľ áĽááááá Chocolatey á áŽáą ááľáĽ á ááľá°á ááĽá áŤáá¸á áľá á°áśá˝ áŤááľ áĽáŠ á¨áĽá á á áľá°áłáłáŞ áá, áá á PVS-Studio á˛á áá á¨á áá áŤáá° ááá áá˝áá.
áĽáááĽááááá˘
PS
á¨ááłá°á á ááľ, á˝ááá áážáŽááľ ááá˘áá˝ áá¨áá, áĽá áĽááą á á°áἠá°ááĽááá. ááá ááłá ááá á áááááᣠááá áá áĽááąáŁ áááłáᣠá¨"api-key" ááá áá á¨á°áŤáŤááá áľá á°áľ áá°ááłáá˘
áá
áá á˝áá ááĽááááá á°áá᪠áłáłááá˝ áááŤáľ á¨ááá áĽáŁááá á¨áľááá ááŤáŤáŁáá áá áá-ááá˛áá áľáśááŤáŽáá˘
ááá: hab.com