ααΎαααααααααΎα±ααααΆαααααΎααααΆαα PVS-Studio ααΆααααααΆααααα½αα α§ααααααα·ααΆαααααααΎαα₯α‘αΌααααααΆααα
αααα»α Chocolatey αααααΆαααααα·ααΈααααααααααααα
αααααααΆαα Windows α ααΎαααΏααΆααααΆαααααΉααα½αααααα½ααααααΆαααΆαααααααΆα PVS-Studio ααΆαα·ααααα
αααα»αααααΆαααααααα ααΎααααΈβαα»αβα²ααβαα
βααΆβααααΆαβ αααβαα
βαα·αα·αααβαααααβααΌαβαααα Chocolatey ααΌα
βααααΆα Azure DevOps ααΉαααΎααα½ααΆαααααααα CI α
αααααΊααΆαααααΈααα’αααααααααααααααααααΎαααΎαααααΆαααααααΆααα½ααααα αΌαααΆαα½ααααααααααααα
PVS-Studio αα αααα Azure DevOps PVS-Studio αα αααα Travis CI PVS-Studio αα ααα: CircleCI PVS-Studio αα αααα GitLab CI/CD
αααα»αααααΆαα’αααα±ααααα α·ααααα»αααΆααααΎα’αααααααααΌαα’αααΈααΆααα½ααααα αΌαααΆαα½α Azure DevOps ααααααααα»αααααΈαααα ααα»α αα½αα ααα½αααααΌαααΆααα»αα αα ααΎααααΈαα»αα±ααα ααααα
ααΌα ααααααΈααα»ααααα’ααααααααα
α’αααΈααΆαααααΎααααΆααααΌααΌα‘αΆ
α’αααα’αΆα
ααΎαααΈααααααα‘αΎααααααα·ααΈααααααααααααα
ααααααααα½αααΆααααΆαα
ααΆααααααααΆααΎααααΈααα‘αΎαααααα α»αααααααααα»αααα§ααααααα·ααΆαα
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 2019 αα·α Visual Studio 2019α
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
ααΆααααααΆαααααα’ααααα·ααΆαα
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.directory_ααΆα.
αα
αααα»αααααααααααΆααα·α
αΆαααΆ αααααΊααΆαα»ααα·ααααα·ααΌα
αα½αα ααΆα/α
αΆα αααααααααααα’αΆα
ααααΌαααΆαααααΎα±αααααααΎααααααΆααααα½α && αααααααΎααααα·ααααα·αα && ααα»ααααααΆαααααααααΆααααααα ααΆαα·ααααααΆαααααα’αααΈαααααα ααααααΆαααΆααααα αααα»αααααΈαααααααα ααΆαααΆααα
ααα‘ααααΆα & αα·α & α’αΆα
ααααα±ααααΆααααα αΆααααααααα αα
αααααααααααααΆαααααΆαααααααααααααΌαααΆαα
αΆαααα»ααααααααααα·αααααΉαααααΌα/αα·αααααΉαααααΌαα α§ααΆα ααα αα
αααα»αααΆααααααΌαααα α»αααααααΎα
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
....
}
....
}
αααα»αααααΈαααααΆααααααα·ααααΆα ααααααα ααΈαααααααααα·ααααα·ααΆαααααααααα·ααααα·αα ternary α ααΌααααα‘ααααΎαα±ααααΆααααα αααΆααα ααααα·αααΎααααααααααααααα»αααΆααααααΆαααααααα 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 αααααΆαααα½αα ααα½αααΆαααΎααααΌαααΆαα αΆααααααΎααα ααΆααΌααα ααααα·ααααα·αα ternary ααΉααααα‘ααααααα αα·ααα·α. αααααΆαααααααααααααααα½ααααααα·ααα»αααΉαααααΌαααΆαααααα·ααααα·ααααααααα»αααααα ααΆα αΆααααΌα ααΆαααα»αααΆαααααααααΌαααααα·αααααΎαααΆαααΆααααααα ααΌα αααα’αααααααααααααα·ααΈααΆαααααα
ααΆααααααΆα 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 αα·αα’αΆα α’αα»αααααααΆαααΆααααααααΆαααα α’αΆααΈααΈ αα·ααΈααΈαααΈαααα ααααααααΉααααΆαααΆααααααααΆαααΎ αααα»αα’αΆα ααααααααααΎαααΌα ααΆααααααα
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
αα»ααααααααα»ααα ααΎαααΆαααααΎα’ααααααα α’αααα’αα·αααααα Chocolatey α αΎααα½αααααΆαααα½αααΆαααΆαααα’α ααΎαβαα·αβααΆαβααβααΎαβα’αααΈβαααβααααΆααβαααβαα ααα»ααααβααΆβα§ααΆα ααα αα½αααβα αΌαα α·αααβααα α»αβαααβααΎαβααΆαβααβααΎαβααΆααααβααΉαβαααααΉα "api-key"α
ααααα·αααΎα’αααα
ααα
αααααααα’ααααααααααΆαα½ααααααα·αααααααα·ααΆαααΆααΆα’ααααααα ααΌαααααΎαααααααααα Vladislav Stolyarov α
ααααα: www.habr.com