ç§ãã¡ã¯ãPVS-Studio ã®äœ¿çšãããã«äŸ¿å©ã«ããŠãããŸãã ç§ãã¡ã®ã¢ãã©ã€ã¶ãŒã¯ãWindows çšã®ããã±ãŒãž ãããŒãžã£ãŒã§ãã Chocolatey ã§å©çšã§ããããã«ãªããŸããã ããã«ãããç¹ã«ã¯ã©ãŠã ãµãŒãã¹ã§ã® PVS-Studio ã®å°å
¥ã容æã«ãªããšèããŠããŸãã è¡ãéããªãããã«ãåã Chocolatey ã®ãœãŒã¹ã³ãŒãã確èªããŠã¿ãŸãããã Azure DevOps 㯠CI ã·ã¹ãã ãšããŠæ©èœããŸãã
ã¯ã©ãŠã ã·ã¹ãã ãšã®çµ±åã«é¢ãããããã¯ã«é¢ããä»ã®èšäºã®ãªã¹ãã¯æ¬¡ã®ãšããã§ãã
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
ããã©ã«ãã§ã¯ãã¢ãã©ã€ã¶ãŒã®ã³ã¢ã§ããã³ã¢ ã³ã³ããŒãã³ãã®ã¿ãã€ã³ã¹ããŒã«ãããŸãã ä»ã®ãã¹ãŠã®ãã©ã° (ã¹ã¿ã³ãã¢ãã³ã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
次ã«ãä»®æ³ãã·ã³ãéžæããå¿ èŠããããŸãã çŸæç¹ã§ã¯ãWindows Server 2019 ããã³ Visual Studio 2019 ã䜿çšãã Microsoft ãã¹ãåãšãŒãžã§ã³ãã«ãªããŸãã
pool:
vmImage: 'windows-latest'
èšå®ãã¡ã€ã«ã®æ¬äœ (ãããã¯) ã«ç§»ããŸãããã ã¹ãããïŒã ä»®æ³ãã·ã³ã«ã¯ä»»æã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ã§ããªãã«ãããããããDocker ã³ã³ãããŒã¯è¿œå ããŸããã§ããã Chocolatey ã Azure DevOps ã®æ¡åŒµæ©èœãšããŠè¿œå ã§ããŸãã ãããè¡ãã«ã¯ã次ã®å Žæã«è¡ããŸããã
ããã§ãæ¡åŒµæ©èœãè¿œå ããå Žæãéžæãããã¿ã³ãã¯ãªãã¯ããå¿ èŠããããŸã ã€ã³ã¹ããŒã«ãéå§ãã.
ã€ã³ã¹ããŒã«ãæåãããã ãã¯ãªãã¯ããŸãã çµç¹ã«é²ã:
Chocolatey ã¿ã¹ã¯ã®ãã³ãã¬ãŒãããŠã£ã³ããŠã«è¡šç€ºãããããã«ãªããŸããã ã¿ã¹ã¯ èšå®ãã¡ã€ã«ãç·šéãããšã azure-pipelines.yml:
Chocolatey ãã¯ãªãã¯ãããšããã£ãŒã«ãã®ãªã¹ãã衚瀺ãããŸãã
ããã§éžæããå¿ èŠããããŸã install ããŒã ãšäžç·ã«ãã£ãŒã«ãã§ã 㧠Nuspec ãã¡ã€ã«å å¿ èŠãªããã±ãŒãžã®ååãæå®ããŸã â pvs-studioã ããŒãžã§ã³ãæå®ããªãå Žåã¯ãå®å šã«é©åããææ°ã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããŸãã ãã¿ã³ãæŒããŠã¿ãŸããã å ããŸã çæãããã¿ã¹ã¯ãæ§æãã¡ã€ã«ã«è¡šç€ºãããŸãã
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
次ã«ããã¡ã€ã«ã®äž»èŠéšåã«é²ã¿ãŸãããã
- task: CmdLine@2
inputs:
script:
次ã«ãã¢ãã©ã€ã¶ãŒ ã©ã€ã»ã³ã¹ãå«ããã¡ã€ã«ãäœæããå¿ èŠããããŸãã ãã PVSå О PVSKEY â èšå®ã§å€ãæå®ããå€æ°ã®ååã ãããã«ã¯ãPVS-Studio ãã°ã€ã³ãšã©ã€ã»ã³ã¹ ããŒãä¿åãããŸãã å€ãèšå®ããã«ã¯ãã¡ãã¥ãŒãéããŸã å€æ° -> æ°ããå€æ°ã å€æ°ãäœæããŸããã PVSå ãã°ã€ã³çšãš 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
PlogСonverter ãŠãŒãã£ãªãã£ã䜿çšããŠã¬ããŒãã 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()
å®å šãªæ§æãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
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 ãããžã§ã¯ãã«ã¯ãC# ã³ãŒãã 37615 è¡ããå«ãŸããŠããŸããã èŠã€ãã£ããšã©ãŒã®ããã€ããèŠãŠã¿ãŸãããã
è©Šéšçµæ
èŠåN1
ã¢ãã©ã€ã¶ãŒã®èŠå:
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
ã¢ãã©ã€ã¶ãŒã¯ãããèªäœãžã®å€æ°ã®ä»£å ¥ãæ€åºããŸããããããã¯æå³ããããŸããã ããããããããã®å€æ°ã® XNUMX ã€ã®ä»£ããã«ãå¥ã®å€æ°ãååšããã¯ãã§ãã ãŸãã¯ãããã¯ã¿ã€ããã¹ã§ãããäœåãªå²ãåœãŠã¯åçŽã«åé€ã§ããŸãã
èŠå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;
}
}
æŒç®åã®éã & ãªãã¬ãŒã¿ãŒããã® && åŒã®å·ŠèŸºã falseã®å Žåãå³åŽã¯åŒãç¶ãèšç®ãããŸããããã®å Žåãäžå¿ èŠãªã¡ãœããåŒã³åºããæå³ããŸãã system.directory_exists.
æ€èšããæçã§ã¯ãããã¯å°ããªæ¬ é¥ã§ãã ã¯ãããã®æ¡ä»¶ã¯ & æŒç®åã && æŒç®åã«çœ®ãæããããšã§æé©åã§ããŸãããå®éçãªèŠ³ç¹ããã¯ãããã¯äœã圱é¿ããŸããã ãã ããåŒã®å³åŽãäžæ£ãªå€ãŸãã¯ç¡å¹ãªå€ã§æ±ãããå Žåã& ãš && ã®éã®æ··åã«ããé倧ãªåé¡ãçºçããå¯èœæ§ããããŸãã ããšãã°ããšã©ãŒ ã³ã¬ã¯ã·ã§ã³ã§ã¯ã次ã®ããã«ãªããŸãã
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 ã«é²ã¿ãŸãã true, ããã¯ãè¡ 3 ãå®è¡ãããããšãæå³ããŸããæ¡ä»¶ 1 ã false ã§ããããšãå€æããå Žåãçªå· 4 ã§ããŒã¯ãããè¡ã«é²ã¿ãŸãããã®æ¡ä»¶ãåžžã«æºããããŸãã true, ããã¯ãè¡ 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 äžã®æ°è¡ã¯ãŒãã«åæåãããŠãããäžé æŒç®åã¯å€ãè¿ããŸã falseã ãã®æ¡ä»¶ã®ãããã«ãŒãã®æ¬äœã¯ XNUMX åã ãå®è¡ãããŸãã ãã®ã³ãŒãã¯ããã°ã©ããŒã®æå³ã©ããã«ãŸã£ããæ©èœããªãããã«æããŸãã
èŠå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 != 1ããã¯ãã€ããããªãã ãã trueã å€ãã®å Žåããã®ãããªèŠåã¯ã³ãŒãå ã®è«çãšã©ãŒã瀺ããŸãããåã«åé·ãã§ãã¯ã瀺ããŠããå ŽåããããŸãã
èŠå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");
}
ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ãæžããããã°ã©ãã¯ãæåŸã® XNUMX è¡ãã³ããŒããŠè²Œãä»ããŸããããç·šéããã®ãå¿ããŠããŸããã ãã®ãããChocolatey ãŠãŒã¶ãŒã¯ãã©ã¡ãŒã¿ãé©çšã§ããŸããã§ããã ã¢ãã㌠ããã«ããã€ãã®æ¹æ³ããããŸãã äžèšã®ãã©ã¡ãŒã¿ãšåæ§ã«ã次ã®ãªãã·ã§ã³ãæäŸã§ããŸãã
commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");
ã³ããŒïŒããŒã¹ã ãšã©ãŒã¯ããœãŒã¹ ã³ãŒãã倧éã«ãããããžã§ã¯ãã§ã¯é ããæ©ããçºçããå¯èœæ§ãé«ãããšã©ãŒã«å¯ŸåŠããããã®æè¯ã®ããŒã«ã® XNUMX ã€ã¯éçåæã§ãã
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)
{
....
}
....
}
å€å žçãªééã: ãªããžã§ã¯ããå ã€ã³ã¹ããŒã«ãããããã±ãŒãž ã䜿çšããããã§ãã¯ããã ãã«ã ãã®èšºæã¯ãããã°ã©ã å ã® XNUMX ã€ã®åé¡ã®ãã¡ã® XNUMX ã€ã«ã€ããŠç€ºããŸãã ã€ã³ã¹ããŒã«ãããããã±ãŒãž 決ããŠå¹³çã§ã¯ãªã ãã«ããã¯çãããããããã§ãã¯ãåé·ã«ãªãããã³ãŒãå ã§é倧ãªãšã©ãŒ (null åç §ãžã®ã¢ã¯ã»ã¹è©Šè¡) ãçºçããå¯èœæ§ããããŸãã
ãŸãšã
ããã§ãç§ãã¡ã¯ãŸãå°ããªäžæ©ãèžã¿åºããŸãããPVS-Studio ã®äœ¿çšãããã«ç°¡åãã€äŸ¿å©ã«ãªããŸããã ãŸããChocolatey ã¯ã³ãŒãå ã®ãšã©ãŒãå°ãªãåªããããã±ãŒãž ãããŒãžã£ãŒã§ããããšããäŒãããããšæããŸããPVS-Studio ã䜿çšãããšãšã©ãŒã¯ããã«å°ãªããªãå¯èœæ§ããããŸãã
ç§ãã¡ã¯æåŸ
ããŸã
PS
å ¬éåã«ããã®èšäºã Chocolatey éçºè ã«éä¿¡ãããšããã奜è©ãåããŸããã é倧ãªåé¡ã¯äœãèŠã€ãããŸããã§ããããããšãã°ããAPI-KEYãããŒã«é¢é£ããŠèŠã€ãã£ããã°ã圌ãã¯æ°ã«å ¥ã£ãŠãããŸããã
ãã®èšäºãè±èªåã®èªè
ãšå
±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ãã: Vladislav Stolyarovã
åºæïŒ habr.com