PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish
Biz PVS-Studio-dan foydalanishni yanada qulayroq qilishda davom etamiz. Analizatorimiz endi Windows uchun paketlar menejeri Chocolatey-da mavjud. Ishonamizki, bu PVS-Studio-ni, xususan, bulutli xizmatlarda joylashtirishni osonlashtiradi. Uzoqqa bormaslik uchun o'sha Chocolateyning manba kodini tekshirib ko'raylik. Azure DevOps CI tizimi sifatida ishlaydi.

Bulutli tizimlar bilan integratsiya mavzusidagi boshqa maqolalarimiz ro'yxati:

Men sizga Azure DevOps bilan integratsiya haqida birinchi maqolaga e'tibor qaratishingizni maslahat beraman, chunki bu holda takrorlanmaslik uchun ba'zi fikrlar o'tkazib yuborilgan.

Shunday qilib, ushbu maqolaning qahramonlari:

PVS-studiyasi C, C++, C# va Java tillarida yozilgan dasturlardagi xatolar va potentsial zaifliklarni aniqlash uchun moʻljallangan statik kod tahlili vositasidir. 64-bitli Windows, Linux va macOS tizimlarida ishlaydi va 32-bit, 64-bit va oʻrnatilgan ARM platformalari uchun moʻljallangan kodni tahlil qilishi mumkin. Agar siz loyihalaringizni tekshirish uchun statik kod tahlilini birinchi marta sinab ko'rsangiz, biz bilan tanishib chiqishingizni tavsiya qilamiz. maqola eng qiziqarli PVS-Studio ogohlantirishlarini tezda ko'rish va ushbu vositaning imkoniyatlarini qanday baholash haqida.

Azure DevOps — butun rivojlanish jarayonini birgalikda qamrab oluvchi bulutli xizmatlar to'plami. Bu platforma Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans kabi vositalarni o‘z ichiga oladi, ular dasturiy ta’minotni yaratish jarayonini tezlashtirish va uning sifatini yaxshilash imkonini beradi.

Chocolatey Windows uchun ochiq kodli paket menejeri. Loyihaning maqsadi - Windows operatsion tizimlarida o'rnatishdan to yangilash va o'chirishgacha bo'lgan butun dasturiy ta'minotning ishlash davrini avtomatlashtirish.

Chocolatey foydalanish haqida

Paket menejerining o'zini qanday o'rnatishni bu erda ko'rishingiz mumkin aloqa. Analizatorni o'rnatish bo'yicha to'liq hujjatlar quyidagi manzilda mavjud aloqa Chocolatey paketi menejeri yordamida o'rnatish bo'limiga qarang. Men u erdan ba'zi fikrlarni qisqacha takrorlayman.

Analizatorning so'nggi versiyasini o'rnatish buyrug'i:

choco install pvs-studio

PVS-Studio paketining ma'lum bir versiyasini o'rnatish buyrug'i:

choco install pvs-studio --version=7.05.35617.2075

Odatiy bo'lib, faqat analizatorning yadrosi, Core komponenti o'rnatiladi. Boshqa barcha bayroqlar (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) --package-parameters yordamida uzatilishi mumkin.

Visual Studio 2019 uchun plagin bilan analizatorni o'rnatadigan buyruq misoli:

choco install pvs-studio --package-parameters="'/MSVS2019'"

Endi Azure DevOps ostida analizatordan qulay foydalanish misolini ko'rib chiqamiz.

moslashish

Eslatib o'taman, hisob qaydnomasini ro'yxatdan o'tkazish, Build Pipeline yaratish va hisobingizni GitHub omborida joylashgan loyiha bilan sinxronlashtirish kabi masalalar haqida alohida bo'lim mavjud. maqola. Bizning sozlashimiz darhol konfiguratsiya faylini yozish bilan boshlanadi.

Birinchidan, ishga tushirish triggerini o'rnatamiz, bu biz faqat o'zgarishlar uchun ishga tushirishimizni bildiradi usta filiali:

trigger:
- master

Keyinchalik virtual mashinani tanlashimiz kerak. Hozircha u Windows Server 2019 va Visual Studio 2019 bilan Microsoft tomonidan joylashtirilgan agent bo'ladi:

pool:
  vmImage: 'windows-latest'

Keling, konfiguratsiya faylining asosiy qismiga o'tamiz (blok qadamlar). Virtual mashinaga o'zboshimchalik bilan dasturiy ta'minotni o'rnatolmasangiz ham, men Docker konteynerini qo'shmadim. Biz Chocolatey-ni Azure DevOps uchun kengaytma sifatida qo'shishimiz mumkin. Buni amalga oshirish uchun keling aloqa. bosing Bepul oling. Keyin, agar siz allaqachon avtorizatsiya qilingan bo'lsangiz, shunchaki hisobingizni tanlang, agar bo'lmasa, avtorizatsiyadan keyin xuddi shunday qiling.

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Bu erda siz kengaytmani qaerga qo'shishimizni tanlashingiz va tugmani bosishingiz kerak o'rnatmoq.

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Muvaffaqiyatli o'rnatishdan so'ng, bosing Tashkilotga o'ting:

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Endi oynada Chocolatey topshirig'i shablonini ko'rishingiz mumkin vazifalar konfiguratsiya faylini tahrirlashda azure-pipelines.yml:

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Chocolatey-ni bosing va maydonlar ro'yxatini ko'ring:

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Bu erda biz tanlashimiz kerak o'rnatish jamoalar bilan maydonda. IN Nuspec fayl nomi kerakli paket nomini ko'rsating - pvs-studio. Agar siz versiyani ko'rsatmasangiz, eng so'nggisi o'rnatiladi, bu bizga to'liq mos keladi. Keling, tugmani bosamiz qo'shish va biz konfiguratsiya faylida yaratilgan vazifani ko'ramiz.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

Keyinchalik, faylimizning asosiy qismiga o'tamiz:

- task: CmdLine@2
  inputs:
    script: 

Endi biz analizator litsenziyasi bilan fayl yaratishimiz kerak. Bu yerga PVSNAME и PVSKEY - sozlamalarda qiymatlarini ko'rsatadigan o'zgaruvchilar nomlari. Ular PVS-Studio login va litsenziya kalitini saqlaydi. Ularning qiymatlarini belgilash uchun menyuni oching O'zgaruvchilar->Yangi o'zgaruvchi. Keling, o'zgaruvchilarni yarataylik PVSNAME kirish uchun va PVSKEY Analizator kaliti uchun. Qutini belgilashni unutmang Ushbu qiymatni sir saqlang uchun PVSKEY. Buyruq kodi:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
–u $(PVSNAME) –n $(PVSKEY)

Loyihani omborda joylashgan bat faylidan foydalanib tuzamiz:

сall build.bat

Analizator natijalari bilan fayllar saqlanadigan papka yarataylik:

сall mkdir PVSTestResults

Loyihani tahlil qilishni boshlaylik:

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
–t .srcchocolatey.sln –o .PVSTestResultsChoco.plog 

PlogSonverter yordam dasturidan foydalanib, hisobotimizni html formatiga aylantiramiz:

сall "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
–t html –o PVSTestResults .PVSTestResultsChoco.plog

Endi siz hisobotni yuklashingiz uchun vazifa yaratishingiz kerak.

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

To'liq konfiguratsiya fayli quyidagicha ko'rinadi:

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()

Keling, bosing Saqlash->Saqlash->Ishga tushirish vazifani bajarish uchun. Vazifalar yorlig'iga o'tish orqali hisobotni yuklab olaylik.

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Chocolatey loyihasi faqat 37615 qator C# kodini o'z ichiga oladi. Keling, topilgan ba'zi xatolarni ko'rib chiqaylik.

Sinov natijalari

Ogohlantirish N1

Analizator ogohlantirishi: V3005 "Provayder" o'zgaruvchisi o'ziga tayinlangan. CrytpoHashProviderSpecs.cs 38

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

Analizator o'zgaruvchining o'ziga tayinlanishini aniqladi, bu mantiqiy emas. Ehtimol, ushbu o'zgaruvchilardan birining o'rniga boshqasi bo'lishi kerak. Xo'sh, bu matn terish xatosi va qo'shimcha topshiriqni oddiygina olib tashlash mumkin.

Ogohlantirish N2

Analizator ogohlantirishi: V3093 [CWE-480] '&' operatori ikkala operandni ham baholaydi. Ehtimol, uning o'rniga qisqa tutashuvli "&&" operatoridan foydalanish kerak. 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;
  }
}

Operator farqi & operatordan && ifodaning chap tomoni bo'lsa yolg'on, keyin o'ng tomon hali ham hisoblab chiqiladi, bu holda bu holda keraksiz usul chaqiruvlarini nazarda tutadi system.directory_exists.

Ko'rib chiqilayotgan fragmentda bu kichik kamchilik. Ha, bu shartni & operatorini && operatoriga almashtirish orqali optimallashtirish mumkin, ammo amaliy nuqtai nazardan, bu hech narsaga ta'sir qilmaydi. Biroq, boshqa hollarda, & va && o'rtasidagi chalkashlik, ifodaning o'ng tomoni noto'g'ri/yaroqsiz qiymatlar bilan ishlaganda jiddiy muammolarni keltirib chiqarishi mumkin. Misol uchun, bizning xatolar to'plamimizda, V3093 diagnostikasi yordamida aniqlangan, bu holat mavjud:

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

Indeks bo'lsa ham k noto'g'ri bo'lsa, u massiv elementiga kirish uchun ishlatiladi. Natijada, istisno tashlanadi IndexOutOfRangeException.

Ogohlantirishlar N3, N4

Analizator ogohlantirishi: V3022 [CWE-571] "shortPrompt" ifodasi har doim to'g'ri. InteractivePrompt.cs 101
Analizator ogohlantirishi: V3022 [CWE-571] "shortPrompt" ifodasi har doim to'g'ri. 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
    ....
  }
  ....
}

Bunday holda, uchlik operatorining ishlashi ortida g'alati mantiq bor. Keling, batafsil ko'rib chiqaylik: agar men 1 raqami bilan belgilagan shart bajarilsa, biz har doim bo'lgan 2-shartga o'tamiz. haqiqiy, ya'ni 3-satr bajariladi.Agar 1-shart noto'g'ri bo'lib chiqsa, u holda 4 raqami bilan belgilangan qatorga o'tamiz, bunda ham shart har doim bo'ladi. haqiqiy, ya'ni 5-satr bajariladi.Shunday qilib, 0 izoh bilan belgilangan shartlar hech qachon bajarilmaydi, bu dasturchi kutgan ish mantig'iga to'liq mos kelmasligi mumkin.

Ogohlantirish N5

Analizator ogohlantirishi: V3123 [CWE-783] Balki "?:" operatori kutilganidan boshqacha ishlaydi. Uning ustuvorligi uning holatidagi boshqa operatorlarning ustuvorligidan past. 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);
  }
}

Diagnostika liniya uchun ishladi:

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

O'zgaruvchidan beri j yuqoridagi bir necha satr nolga tenglashtirilsa, uchlik operator qiymatni qaytaradi yolg'on. Ushbu shart tufayli tsiklning tanasi faqat bir marta bajariladi. Menimcha, bu kod qismi dasturchi nazarda tutganidek umuman ishlamaydi.

Ogohlantirish N6

Analizator ogohlantirishi: V3022 [CWE-571] 'installedPackageVersions.Count != 1' ifodasi har doim to'g'ri. 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);
    }
    ....
  }
  ....
}

Bu erda g'alati ichki holat mavjud: installPackageVersions.Count != 1bu har doim bo'ladi haqiqiy. Ko'pincha bunday ogohlantirish koddagi mantiqiy xatoni ko'rsatadi va boshqa hollarda bu shunchaki ortiqcha tekshirishni ko'rsatadi.

Ogohlantirish N7

Analizator ogohlantirishi: V3001 '||' ning chap va o'ng tomonida bir xil 'commandArguments.contains("-apikey")' pastki ifodalari mavjud. operator. 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");
}

Kodning ushbu qismini yozgan dasturchi oxirgi ikki satrdan nusxa ko'chirgan va joylashtirgan va ularni tahrirlashni unutgan. Shu sababli, Chocolatey foydalanuvchilari parametrni qo'llay olmadilar apikey yana bir necha usul. Yuqoridagi parametrlarga o'xshab, men quyidagi variantlarni taklif qilishim mumkin:

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

Nusxa ko'chirish va joylashtirish xatolari katta hajmdagi manba kodiga ega bo'lgan har qanday loyihada ertami-kechmi paydo bo'lish ehtimoli yuqori va ular bilan kurashishning eng yaxshi vositalaridan biri bu statik tahlildir.

PS Va har doimgidek, bu xato ko'p qatorli shartning oxirida paydo bo'ladi :). Nashrga qarang "Oxirgi qator effekti".

Ogohlantirish N8

Analizator ogohlantirishi: V3095 [CWE-476] "installedPackage" obyekti null bilan tekshirilishidan oldin ishlatilgan. Tekshirish qatorlari: 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)
  {
    ....
  }
  ....
}

Klassik xato: avval ob'ekt o'rnatilgan paket ishlatiladi va keyin tekshiriladi null. Ushbu diagnostika bizga dasturdagi ikkita muammodan biri haqida gapirib beradi: yoki o'rnatilgan paket hech qachon teng emas null, bu shubhali va keyin tekshirish ortiqcha bo'ladi yoki biz kodda jiddiy xatoga yo'l qo'yishimiz mumkin - null havolaga kirishga urinish.

xulosa

Shunday qilib, biz yana bir kichik qadam tashladik - endi PVS-Studio-dan foydalanish yanada oson va qulayroq bo'ldi. Shuni ham aytmoqchimanki, Chocolatey yaxshi paket menejeri bo'lib, koddagi kam sonli xatolarga ega, bu PVS-Studio-dan foydalanganda ham kamroq bo'lishi mumkin.

Biz taklif qilamiz скачать va PVS-Studio-ni sinab ko'ring. Statik analizatordan muntazam foydalanish sizning jamoangiz ishlab chiqadigan kodning sifati va ishonchliligini yaxshilaydi va ko'plab xatolarning oldini olishga yordam beradi. nol kunlik zaifliklar.

PS

Nashr qilishdan oldin biz maqolani Chocolatey ishlab chiqaruvchilariga yubordik va ular buni yaxshi qabul qilishdi. Biz hech qanday tanqidiy narsani topmadik, lekin ular, masalan, "api-kalit" kaliti bilan bog'liq bo'lgan xatoni yoqtirishdi.

PVS-Studio endi Chocolatey-da: Chocolatey-ni Azure DevOps-dan tekshirish

Agar siz ushbu maqolani ingliz tilida so'zlashuvchi auditoriya bilan baham ko'rmoqchi bo'lsangiz, tarjima havolasidan foydalaning: Vladislav Stolyarov. PVS-Studio endi shokoladda: Azure DevOps ostida shokoladni tekshirish.

Manba: www.habr.com

a Izoh qo'shish