موږ د PVS-Studio کارولو ته دوام ورکوو. زموږ تحلیلګر اوس په چاکلیټي کې شتون لري، د وینډوز لپاره د بسته بندي مدیر. موږ باور لرو چې دا به د PVS-Studio ګمارل اسانه کړي، په ځانګړې توګه په کلاوډ خدماتو کې. د دې لپاره چې لرې لاړ نشي، راځئ چې د ورته چاکلیټي سرچینې کوډ وګورئ. Azure DevOps به د CI سیسټم په توګه عمل وکړي.
دلته د بادل سیسټمونو سره د ادغام په موضوع کې زموږ د نورو مقالو لیست دی:
PVS- سټوډیو بادونو ته ځي: Azure DevOps PVS-Studio بادونو ته ځي: Travis CI PVS- سټوډیو بادونو ته ځي: CircleCI PVS- سټوډیو بادونو ته ځي: 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 په کارولو سره لیږدول کیدی شي.
د کمانډ یوه بیلګه چې د لید سټوډیو 2019 لپاره د پلگ ان سره شنونکی به نصب کړي:
choco install pvs-studio --package-parameters="'/MSVS2019'"
اوس راځئ چې د Azure DevOps لاندې د تحلیل کونکي اسانه کارونې مثال وګورو.
تعدیلات
اجازه راکړئ تاسو ته یادونه وکړم چې د داسې مسلو په اړه جلا برخه شتون لري لکه د حساب راجستر کول، د پایپ لاین جوړول او ستاسو حساب د GitHub ذخیره کې موقعیت لرونکي پروژې سره همغږي کول.
لومړی، راځئ چې د لانچ محرک تنظیم کړو، دا په ګوته کوي چې موږ یوازې د بدلونونو لپاره پیل کوو د بادار څانګه:
trigger:
- master
بیا موږ باید یو مجازی ماشین غوره کړو. د اوس لپاره دا به د وینډوز سرور 2019 او لید سټوډیو 2019 سره د مایکروسافټ کوربه شوی اجنټ وي:
pool:
vmImage: 'windows-latest'
راځئ چې د تنظیم کولو فایل بدن ته لاړ شو (بلاک ګامونه). د دې حقیقت سره سره چې تاسو نشئ کولی خپل سري سافټویر په مجازی ماشین کې نصب کړئ ، ما د ډاکر کانټینر ندی اضافه کړی. موږ کولی شو د Azure DevOps لپاره د توسیع په توګه چاکلیټ اضافه کړو. د دې کولو لپاره، راځئ چې لاړ شو
دلته تاسو اړتیا لرئ وټاکئ چیرې چې موږ به توسیع اضافه کړو او تڼۍ کلیک وکړئ ولګوه.
د بریالي نصبولو وروسته، کلیک وکړئ تنظیم ته لاړشئ:
تاسو اوس کولی شئ په کړکۍ کې د چاکلیټي دندې لپاره ټیمپلیټ وګورئ دندې کله چې د تشکیلاتو فایل سمول azure-pipelines.yml:
په چاکلیټ کلیک وکړئ او د ساحو لیست وګورئ:
دلته موږ باید غوره کړو لګول د ټیمونو سره په میدان کې. IN د Nuspec دوتنې نوم د اړتیا وړ کڅوړې نوم په ګوته کړئ - pvs-studio. که تاسو نسخه مشخص نه کړئ، وروستی به نصب شي، کوم چې موږ ته په بشپړه توګه مناسب دی. راځئ چې تڼۍ فشار کړو اضافه او موږ به د تشکیلاتو فایل کې پیدا شوي دنده وګورو.
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'
بیا، راځئ چې زموږ د فایل اصلي برخې ته لاړ شو:
- task: CmdLine@2
inputs:
script:
اوس موږ اړتیا لرو چې د تحلیل جواز سره فایل جوړ کړو. دلته PVSNAME и PVSKEY - د متغیرونو نومونه چې ارزښتونه یې موږ په ترتیباتو کې مشخص کوو. دوی به د PVS-Studio ننوتل او د جواز کیلي ذخیره کړي. د دوی ارزښتونو تنظیم کولو لپاره ، مینو خلاص کړئ متغیرات -> نوی متغیر. راځئ چې متغیرونه جوړ کړو 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
موږ خپل راپور د PlogConverter یوټیلیټ په کارولو سره 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()
راځئ چې کلیک وکړو خوندي کړئ -> خوندي کړئ -> چل کړئ د دندې د ترسره کولو لپاره. راځئ چې د کارونو ټب ته په تګ سره راپور ډاونلوډ کړو.
د چاکلیټ پروژه یوازې د 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_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 پورته یو څو کرښې صفر ته پیل شوې، د ترنیري آپریټر به ارزښت بیرته راولي غلط. د دې حالت له امله، د لوپ بدن به یوازې یو ځل اعدام شي. ماته داسې ښکاري چې د کوډ دا ټوټه په بشپړه توګه کار نه کوي لکه څنګه چې د پروګرامر هدف دی.
خبرداری 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");
}
هغه پروګرامر چې د کوډ دا برخه یې لیکلې وه وروستۍ دوه کرښې یې کاپي او پیسټ کړې او د دوی ترمیم یې هیر کړی. د دې له امله، د چاکلیټ کاروونکي نشي کولی پیرامیټر پلي کړي 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 کارولو پرمهال حتی لږ کیدی شي.
موږ تاسو ته بلنه درکوو
PS
د خپرولو دمخه، موږ مقاله د چاکلیټ پراختیا کونکو ته واستوله، او دوی یې ښه ترلاسه کړل. موږ کوم مهم ندی موندلی، مګر دوی، د بیلګې په توګه، هغه بګ خوښ کړ چې موږ د "api-key" کیلي پورې اړوند وموندل.
که تاسو غواړئ دا مقاله د انګلیسي ژبو لیدونکو سره شریکه کړئ، مهرباني وکړئ د ژباړې لینک وکاروئ: ولادیسلاو سټولیاروف.
سرچینه: www.habr.com