PVS-Studio භාවිතය වඩාත් පහසු කිරීමට අපි දිගටම කටයුතු කරන්නෙමු. අපගේ විශ්ලේෂකය දැන් Windows සඳහා පැකේජ කළමනාකරු වන Chocolatey හි ඇත. මෙය PVS-Studio, විශේෂයෙන්ම, Cloud සේවාවන්හි යෙදවීමට පහසුකම් සපයනු ඇතැයි අපි විශ්වාස කරමු. දුර නොයන්න, අපි එකම චොකලට් වල මූල කේතය පරීක්ෂා කරමු. Azure DevOps CI පද්ධතියක් ලෙස ක්රියා කරයි.
වලාකුළු පද්ධති සමඟ ඒකාබද්ධ කිරීමේ මාතෘකාව පිළිබඳ අපගේ අනෙකුත් ලිපි ලැයිස්තුවක් මෙන්න:
PVS-Studio වලාකුළු වෙත යයි: Azure DevOps PVS-Studio වලාකුළු වෙත යයි: Travis CI PVS-Studio වලාකුළු වෙත යයි: CircleCI PVS-Studio වලාකුළු වෙත යයි: GitLab CI/CD
Azure DevOps සමඟ ඒකාබද්ධ වීම පිළිබඳ පළමු ලිපිය කෙරෙහි අවධානය යොමු කරන ලෙස මම ඔබට උපදෙස් දෙමි, මන්ද මෙම අවස්ථාවේ දී අනුපිටපත් නොකිරීමට සමහර කරුණු මඟ හරිනු ලැබේ.
ඉතින්, මෙම ලිපියේ වීරයන්:
චොකලට් භාවිතය ගැන
Package Manager එක Install කරන හැටි මේකෙන් බලාගන්න පුළුවන්
විශ්ලේෂකයේ නවතම අනුවාදය ස්ථාපනය කිරීමට විධානය:
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
මීළඟට අපි Virtual Machine එකක් තෝරාගත යුතුයි. දැනට එය Windows Server 2019 සහ Visual Studio 2019 සමඟ Microsoft සත්කාරක නියෝජිතයෙකු වනු ඇත:
pool:
vmImage: 'windows-latest'
අපි වින්යාස ගොනුවේ ශරීරය වෙත යමු (බ්ලොක් පියවර) ඔබට අත්තනෝමතික මෘදුකාංග අථත්ය යන්ත්රයකට ස්ථාපනය කළ නොහැකි වුවද, මම ඩොකර් කන්ටේනරයක් එක් කළේ නැත. අපට 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 и PVSKEY - අපි සැකසුම් තුළ සඳහන් කරන අගයන් සහිත විචල්යවල නම්. ඔවුන් PVS-Studio පිවිසුම් සහ බලපත්ර යතුර ගබඩා කරනු ඇත. ඒවායේ අගයන් සැකසීමට, මෙනුව විවෘත කරන්න විචල්යයන්->නව විචල්යය. අපි variables හදමු PVSNAME පුරනය වීම සඳහා සහ 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);
}
}
විශ්ලේෂකය තමන්ටම විචල්යයේ පැවරුමක් අනාවරණය කර ගත් අතර එය තේරුමක් නැත. බොහෝ දුරට, මෙම විචල්ය වලින් එකක් වෙනුවට වෙනත් එකක් තිබිය යුතුය. හොඳයි, නැතහොත් මෙය ටයිප් එකකි, අමතර පැවරුම සරලව ඉවත් කළ හැකිය.
අනතුරු ඇඟවීම 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
....
}
....
}
මෙහිදී ත්රිත්ව ක්රියාකරුගේ ක්රියාකාරිත්වය පිටුපස ඇත්තේ අමුතු තර්කයකි. අපි සමීපව බලමු: මා අංක 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);
}
....
}
....
}
මෙහි අමුතු කැදැලි තත්වයක් ඇත: 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 භාවිතා කරන්නන්ට පරාමිතිය යෙදීමට නොහැකි විය apikey තවත් ක්රම කිහිපයක්. ඉහත පරාමිතීන්ට සමානව, මට පහත විකල්ප ඉදිරිපත් කළ හැකිය:
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 භාවිතා කිරීම වඩාත් පහසු සහ පහසු වී ඇත. PVS-Studio භාවිතා කරන විට ඊටත් වඩා අඩු විය හැකි කේතයේ කුඩා දෝෂ සංඛ්යාවක් සහිත Chocolatey හොඳ පැකේජ කළමණාකරුවෙකු බව මම පැවසීමට කැමැත්තෙමි.
අපි ඔබට ආරාධනා කරනවා
ප්රාදේශීය සභා
ප්රකාශනය කිරීමට පෙර, අපි ලිපිය චොකලට් සංවර්ධකයින් වෙත යැවූ අතර ඔවුන්ට එය හොඳින් ලැබුණි. අපි විවේචනාත්මක කිසිවක් සොයා ගත්තේ නැත, නමුත් ඔවුන්, උදාහරණයක් ලෙස, "api-key" යතුර සම්බන්ධව අප සොයාගත් දෝෂයට කැමති විය.
ඔබට මෙම ලිපිය ඉංග්රීසි කතා කරන ප්රේක්ෂකයින් සමඟ බෙදා ගැනීමට අවශ්ය නම්, කරුණාකර පරිවර්තන සබැඳිය භාවිතා කරන්න: Vladislav Stolyarov.
මූලාශ්රය: www.habr.com