PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول
موږ د PVS-Studio کارولو ته دوام ورکوو. زموږ تحلیلګر اوس په چاکلیټي کې شتون لري، د وینډوز لپاره د بسته بندي مدیر. موږ باور لرو چې دا به د PVS-Studio ګمارل اسانه کړي، په ځانګړې توګه په کلاوډ خدماتو کې. د دې لپاره چې لرې لاړ نشي، راځئ چې د ورته چاکلیټي سرچینې کوډ وګورئ. Azure DevOps به د CI سیسټم په توګه عمل وکړي.

دلته د بادل سیسټمونو سره د ادغام په موضوع کې زموږ د نورو مقالو لیست دی:

زه تاسو ته مشوره درکوم چې د Azure DevOps سره د ادغام په اړه لومړۍ مقالې ته پاملرنه وکړئ ، ځکه چې پدې حالت کې ځینې ټکي پریښودل شوي ترڅو نقل نشي.

نو، د دې مقالې اتلان:

PVS- سټوډیو د جامد کوډ تحلیل وسیله ده چې په C، C++، C# او Java کې لیکل شوي برنامو کې د غلطیو او احتمالي زیانونو پیژندلو لپاره ډیزاین شوې. په 64-bit وینډوز، لینکس، او macOS سیسټمونو چلوي، او کولی شي د 32-bit، 64-bit، او د ARM پلیټ فارمونو لپاره ډیزاین شوي کوډ تحلیل کړي. که دا ستاسو لومړی ځل وي چې ستاسو د پروژو چک کولو لپاره د جامد کوډ تحلیل هڅه کوي، موږ وړاندیز کوو چې تاسو خپل ځان وپیژنئ مقاله د دې په اړه چې څنګه ژر تر ژره خورا په زړه پوري PVS-Studio اخطارونه وګورئ او د دې وسیلې وړتیاوې ارزوئ.

د Azure DevOps - د بادل خدماتو یوه سیټ چې په ګډه د پراختیا ټوله پروسه پوښي. پدې پلیټ فارم کې وسیلې شاملې دي لکه Azure پایپ لاینونه ، Azure بورډونه ، Azure هنرونه ، Azure Repos ، Azure Test Plans ، کوم چې تاسو ته اجازه درکوي د سافټویر رامینځته کولو پروسه ګړندۍ کړئ او کیفیت یې ښه کړئ.

چاکلیټی د وینډوز لپاره د خلاصې سرچینې بسته مدیر دی. د پروژې هدف دا دی چې د وینډوز عملیاتي سیسټمونو کې د نصب څخه تازه کولو او غیر نصب کولو پورې د سافټویر ټول ژوند دوره اتومات کړي.

د چاکلیټ کارولو په اړه

تاسو کولی شئ وګورئ چې پدې کې پخپله د بسته بندۍ مدیر څنګه نصب کړئ مخونه. د تحلیل کونکي نصبولو لپاره بشپړ اسناد شتون لري مخونه د چاکلیټ پیکج مدیر برخې په کارولو سره نصب کول وګورئ. زه به په لنډه توګه له هغه ځایه ځینې ټکي تکرار کړم.

د تحلیل کونکي وروستي نسخه نصبولو لپاره امر وکړئ:

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 لپاره د توسیع په توګه چاکلیټ اضافه کړو. د دې کولو لپاره، راځئ چې لاړ شو مخونه. کلیک وکړئ وړیا ترلاسه کړئ. بیا، که تاسو دمخه اجازه لرئ، په ساده ډول خپل حساب وټاکئ، او که نه، نو بیا د اجازې وروسته ورته وکړئ.

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

دلته تاسو اړتیا لرئ وټاکئ چیرې چې موږ به توسیع اضافه کړو او تڼۍ کلیک وکړئ ولګوه.

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

د بریالي نصبولو وروسته، کلیک وکړئ تنظیم ته لاړشئ:

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

تاسو اوس کولی شئ په کړکۍ کې د چاکلیټي دندې لپاره ټیمپلیټ وګورئ دندې کله چې د تشکیلاتو فایل سمول azure-pipelines.yml:

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

په چاکلیټ کلیک وکړئ او د ساحو لیست وګورئ:

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

دلته موږ باید غوره کړو لګول د ټیمونو سره په میدان کې. 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()

راځئ چې کلیک وکړو خوندي کړئ -> خوندي کړئ -> چل کړئ د دندې د ترسره کولو لپاره. راځئ چې د کارونو ټب ته په تګ سره راپور ډاونلوډ کړو.

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

د چاکلیټ پروژه یوازې د C# کوډ 37615 لینونه لري. راځئ چې د موندلو ځینې تېروتنې وګورو.

د ازموینې پایلې

خبرداری N1

د تحلیل کونکي خبرداری: V3005 د 'وړونکي' متغیر ځان ته ټاکل شوی. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

شنونکي خپل ځان ته د متغیر دنده کشف کړه، کوم چې معنی نلري. ډیری احتمال، د دې متغیرونو څخه یو ځای باید یو بل وي. ښه، یا دا یو ټایپ دی، او اضافي دنده په ساده ډول لرې کیدی شي.

خبرداری N2

د تحلیل کونکي خبرداری: V3093 [CWE-480] '&' آپریټر دواړه عملیات ارزوي. شاید یو لنډ سرکیټ '&&' آپریټر باید پرځای وکارول شي. Platform.cs 64

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.

په پام کې نیول شوې ټوټه کې، دا یو کوچنی نیمګړتیا ده. هو، دا حالت د & او آپریټر سره د & آپریټر په ځای کولو سره مطلوب کیدی شي، مګر د عملي نظر څخه، دا هیڅ شی اغیزه نه کوي. په هرصورت، په نورو قضیو کې، د & او && ترمنځ ګډوډي کولی شي جدي ستونزې رامینځته کړي کله چې د بیان ښي اړخ د غلط / ناسم ارزښتونو سره چلند کیږي. د مثال په توګه، زموږ د خطا ټولګه کې، د V3093 تشخیص په کارولو سره پیژندل شویدا قضیه ده:

if ((k < nct) & (s[k] != 0.0))

حتی که شاخص k غلط دی، دا به د سرې عنصر ته د لاسرسي لپاره وکارول شي. د پایلې په توګه، یو استثنا به وغورځول شي IndexOutOfRangeException.

اخطارونه N3, N4

د تحلیل کونکي خبرداری: V3022 [CWE-571] بیان 'لنډ پرامپټ' تل ریښتیا وي. InteractivePrompt.cs 101
د تحلیل کونکي خبرداری: V3022 [CWE-571] بیان 'لنډ پرامپټ' تل ریښتیا وي. InteractivePrompt.cs 105

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

د تحلیل کونکي خبرداری: V3123 [CWE-783] شاید '؟:' آپریټر په بل ډول کار کوي تر هغه چې تمه کیده. د دې لومړیتوب په خپل حالت کې د نورو آپریټرانو لومړیتوب څخه ټیټ دی. Options.cs 1019

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

د تحلیل کونکي خبرداری: V3022 [CWE-571] بیان 'installedPackageVersions.Count!= 1' تل ریښتیا وي. NugetService.cs 1405

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

د تحلیل کونکي خبرداری: V3001 د 'commandArguments.contains("-apikey")' کیڼ اړخ ته او د '||' ښي خوا ته ورته فرعي څرګندونې شتون لري. چلوونکی ArgumentsUtility.cs 42

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

د تحلیل کونکي خبرداری: V3095 [CWE-476] 'installedPackage' څیز مخکې له دې چې د null په مقابل کې تایید شي کارول شوی و. لینونه چیک کړئ: 910، 917. NugetService.cs 910

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 کارولو پرمهال حتی لږ کیدی شي.

موږ تاسو ته بلنه درکوو скачать او د PVS-Studio هڅه وکړئ. د جامد تحلیل کونکي منظم کارول به د کوډ کیفیت او اعتبار ته وده ورکړي چې ستاسو ټیم رامینځته کوي او د ډیری مخنیوي کې مرسته کوي د صفر ورځې زیانونه.

PS

د خپرولو دمخه، موږ مقاله د چاکلیټ پراختیا کونکو ته واستوله، او دوی یې ښه ترلاسه کړل. موږ کوم مهم ندی موندلی، مګر دوی، د بیلګې په توګه، هغه بګ خوښ کړ چې موږ د "api-key" کیلي پورې اړوند وموندل.

PVS- سټوډیو اوس په چاکلیټي کې ده: د Azure DevOps لاندې څخه چاکلیټ چیک کول

که تاسو غواړئ دا مقاله د انګلیسي ژبو لیدونکو سره شریکه کړئ، مهرباني وکړئ د ژباړې لینک وکاروئ: ولادیسلاو سټولیاروف. PVS-Studio اوس په چاکلیټ کې دی: د Azure DevOps لاندې چاکلیټ چیک کول.

سرچینه: www.habr.com

Add a comment