์ฐ๋ฆฌ๋ 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
๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ์๊ธฐ์ ํต์ฌ์ธ Core ๊ตฌ์ฑ ์์๋ง ์ค์น๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ํ๋๊ทธ(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
๋ค์์ผ๋ก ๊ฐ์ ๋จธ์ ์ ์ ํํด์ผ ํฉ๋๋ค. ํ์ฌ๋ Windows Server 2019 ๋ฐ Visual Studio 2019๋ฅผ ์ฌ์ฉํ๋ Microsoft ํธ์คํ ์์ด์ ํธ์ ๋๋ค.
pool:
vmImage: 'windows-latest'
๊ตฌ์ฑ ํ์ผ์ ๋ณธ๋ฌธ(๋ธ๋ก ๋จ๊ณ). ๊ฐ์ ๋จธ์ ์ ์์์ ์ํํธ์จ์ด๋ฅผ ์ค์นํ ์ ์๋ค๋ ์ฌ์ค์๋ ๋ถ๊ตฌํ๊ณ ์ ๋ Docker ์ปจํ
์ด๋๋ฅผ ์ถ๊ฐํ์ง ์์์ต๋๋ค. Azure DevOps์ ํ์ฅ์ผ๋ก Chocolatey๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ค์์ผ๋ก ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ํ์ฅ์ ์ถ๊ฐํ ์์น๋ฅผ ์ ํํ๊ณ ๋ฒํผ์ ํด๋ฆญํด์ผ ํฉ๋๋ค. ์ค์น.
์ฑ๊ณต์ ์ผ๋ก ์ค์น๊ฐ ์๋ฃ๋๋ฉด ๋ค์์ ํด๋ฆญํ์ธ์. ์กฐ์ง์ผ๋ก ์งํ:
์ด์ ์ฐฝ์์ Chocolatey ์์ ์ ๋ํ ํ ํ๋ฆฟ์ ๋ณผ ์ ์์ต๋๋ค. ์์ ๊ตฌ์ฑ ํ์ผ์ ํธ์งํ ๋ Azure-ํ์ดํ๋ผ์ธ.yml:
Chocolatey๋ฅผ ํด๋ฆญํ๊ณ ํ๋ ๋ชฉ๋ก์ ํ์ธํ์ธ์.
์ฌ๊ธฐ์๋ ์ ํํด์ผ ํฉ๋๋ค. ์ค์น ํ์ฅ์์ ํ๊ณผ ํจ๊ป. ์์ 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)
์ ์ฅ์์ ์๋ 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 ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๊ณ ์๋ฅผ 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 ํ๋ก์ ํธ์๋ 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_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๋ก โโ๋์ด๊ฐ๋๋ค. ์ฐธ๋, ์ด๋ 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 ์์ ๋ช ์ค์ 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ํญ์ ๊ทธ๋ด ๊ฒ์ด๋ค ์ฐธ๋. ์ด๋ฌํ ๊ฒฝ๊ณ ๋ ์ฝ๋์ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋จ์ํ ์ค๋ณต ๊ฒ์ฌ๋ฅผ ๋ํ๋ ๋๋ค.
๊ฒฝ๊ณ 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)
{
....
}
....
}
์ ํ์ ์ธ ์ค์: ๊ฐ์ฒด ์ฐ์ ์ค์น๋ํจํค์ง ์ฌ์ฉ๋ ํ ํ์ธ๋ฉ๋๋ค. null๋ก. ์ด ์ง๋จ์ ํ๋ก๊ทธ๋จ์ ๋ ๊ฐ์ง ๋ฌธ์ ์ค ํ๋์ ๋ํด ์๋ ค์ค๋๋ค. ์ค์น๋ํจํค์ง ๊ฒฐ์ฝ ๊ฐ์ง ์๋ค null๋ก, ์ด๋ ์์ฌ์ค๋ฝ๊ณ ๊ฒ์ฌ๊ฐ ์ค๋ณต๋๊ฑฐ๋ ์ ์ฌ์ ์ผ๋ก ์ฝ๋์์ null ์ฐธ์กฐ์ ์ก์ธ์คํ๋ ค๋ ์๋๋ก ์ธํด ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ ๋ค๋ฅธ ์์ ์กฐ์น๋ฅผ ์ทจํ์ต๋๋ค. ์ด์ PVS-Studio๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ๊ณ ํธ๋ฆฌํด์ก์ต๋๋ค. ๋ํ Chocolatey๋ ์ฝ๋ ์ค๋ฅ๊ฐ ์ ์ ํ๋ฅญํ ํจํค์ง ๊ด๋ฆฌ์๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. PVS-Studio๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ํจ์ฌ ์ค์ด๋ค ์๋ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋
PS
์ถํํ๊ธฐ ์ ์ ์ฐ๋ฆฌ๋ Chocolatey ๊ฐ๋ฐ์๋ค์๊ฒ ๊ธฐ์ฌ๋ฅผ ๋ณด๋๊ณ ๊ทธ๋ค์ ์ข์ ๋ฐ์์ ์ป์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ค์ํ ๊ฒ์ ์ฐพ์ง ๋ชปํ์ง๋ง ์๋ฅผ ๋ค์ด "api-key" ํค์ ๊ด๋ จํ์ฌ ๋ฐ๊ฒฌํ ๋ฒ๊ทธ๋ฅผ ์ข์ํ์ต๋๋ค.
์ด ๊ธฐ์ฌ๋ฅผ ์์ด๊ถ ์ฒญ์ค๊ณผ ๊ณต์ ํ๋ ค๋ฉด ๋ฒ์ญ ๋งํฌ์ธ Vladislav Stolyarov๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ถ์ฒ : habr.com