PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps
Urang terus make PVS-Studio leuwih merenah. Analis kami ayeuna sayogi di Chocolatey, manajer pakét pikeun Windows. Kami yakin yén ieu bakal ngagampangkeun panyebaran PVS-Studio, khususna, dina jasa awan. Pikeun henteu jauh, hayu urang parios kode sumber tina Coklat anu sami. Azure DevOps bakal meta salaku sistem CI.

Ieu daptar tulisan kami anu sanés ngeunaan topik integrasi sareng sistem awan:

Kuring mamatahan anjeun nengetan artikel munggaran ngeunaan integrasi jeung Azure DevOps, sabab dina hal ieu sababaraha titik dileungitkeun ku kituna teu jadi duplikat.

Janten, pahlawan tulisan ieu:

PVS Studio mangrupakeun alat analisis kode statik dirancang pikeun ngaidentipikasi kasalahan sarta potensi kerentanan dina program ditulis dina C, C ++, C # jeung Java. Dijalankeun dina sistem Windows, Linux, sareng macOS 64-bit, sareng tiasa nganalisa kode anu dirancang pikeun platform ARM 32-bit, 64-bit, sareng dipasang. Upami ieu pertama kalina anjeun nyobian analisis kode statik pikeun mariksa proyék anjeun, kami nyarankeun yén anjeun familiarize diri artikel ngeunaan kumaha gancang nempo warnings PVS-Studio paling metot jeung evaluate kamampuhan alat ieu.

Azure DevOps — sakumpulan jasa awan anu babarengan nutupan sakabéh prosés pangwangunan. Platform ieu kalebet alat sapertos Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, anu ngamungkinkeun anjeun nyepetkeun prosés nyiptakeun parangkat lunak sareng ningkatkeun kualitasna.

Chocolatey nyaéta manajer pakét open source pikeun Windows. Tujuan tina proyék nyaéta pikeun ngajadikeun otomatis sakabéh siklus hirup software ti pamasangan nepi ka ngamutahirkeun jeung uninstallation dina sistem operasi Windows.

Ngeunaan ngagunakeun Chocolatey

Anjeun tiasa ningali kumaha masang manajer pakét sorangan dina ieu link. Dokuméntasi lengkep pikeun masang analyzer sayogi di link Tempo Instalasi ngagunakeun bagian Chocolatey pakét manajer. Kuring sakeudeung bakal ngulang sababaraha titik ti dinya.

Paréntah pikeun masang versi pangénggalna analisa:

choco install pvs-studio

Paréntah pikeun masang versi khusus tina pakét PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Sacara standar, ngan ukur inti analisa, komponén Inti, dipasang. Kabéh umbul séjén (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) bisa diliwatan ngagunakeun --package-parameters.

Conto paréntah anu bakal masang analisa sareng plugin pikeun Visual Studio 2019:

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

Ayeuna hayu urang tingali conto panggunaan analisa anu gampang dina Azure DevOps.

carana ngatur

Hayu atuh ngingetkeun yén aya bagian misah ngeunaan masalah sapertos ngadaptar hiji akun, nyieun Pipeline Ngawangun tur nyingkronkeun akun anjeun kalawan proyék lokasina di gudang GitHub. artikel. Setélan urang bakal langsung dimimitian ku nulis file konfigurasi.

Mimiti, hayu urang nyetél pemicu peluncuran, nunjukkeun yén urang ngaluncurkeun ngan ukur pikeun parobihan ngawasaan cabang:

trigger:
- master

Salajengna urang kedah milih mesin virtual. Pikeun ayeuna éta bakal janten agén anu di-host Microsoft sareng Windows Server 2019 sareng Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Hayu urang ngaléngkah ka awak file konfigurasi (block léngkah). Sanaos kanyataan yén anjeun henteu tiasa masang parangkat lunak sawenang-wenang kana mesin virtual, kuring henteu nambihan wadah Docker. Urang tiasa nambihan Chocolatey salaku ekstensi pikeun Azure DevOps. Jang ngalampahkeun ieu, hayu urang buka link. Pencét Kéngingkeun gratis. Salajengna, upami anjeun parantos otorisasi, kantun pilih akun anjeun, sareng upami henteu, teras lakonan hal anu sami saatos otorisasina.

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Di dieu anjeun kedah milih dimana kami bakal nambihan ekstensi sareng klik tombolna masang.

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Saatos instalasi suksés, klik Neruskeun organisasi:

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Anjeun ayeuna tiasa ningali template pikeun tugas Chocolatey dina jandela tugas nalika ngédit file konfigurasi azure-pipelines.yml:

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Klik dina Chocolatey tur tingal daptar widang:

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Di dieu urang kudu milih masang di lapangan jeung tim. DI Ngaran File Nuspec nunjukkeun nami pakét anu diperyogikeun - pvs-studio. Mun anjeun teu nangtukeun versi, nu panganyarna bakal dipasang, nu cocog kami lengkep. Hayu urang pencét tombol nambah sarta kami bakal ningali tugas dihasilkeun dina file konfigurasi.

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

Salajengna, hayu urang ngalih ka bagian utama file urang:

- task: CmdLine@2
  inputs:
    script: 

Ayeuna urang kedah nyiptakeun file nganggo lisénsi analisa. Ieuh PVSNAME и PVSKEY – ngaran variabel anu nilaina kami tangtukeun dina setélan. Aranjeunna bakal nyimpen login PVS-Studio sareng konci lisénsi. Pikeun nyetel nilai maranéhanana, buka ménu Variabel-> Variabel anyar. Hayu urang nyieun variabel PVSNAME pikeun login jeung PVSKEY pikeun konci analyzer. Tong hilap pariksa kotakna Tetep nilai ieu rusiah keur PVSKEY. Kodeu paréntah:

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

Hayu urang ngawangun proyék nganggo file bat anu aya di gudang:

сall build.bat

Hayu urang ngadamel polder dimana file sareng hasil analisa bakal disimpen:

сall mkdir PVSTestResults

Hayu urang mimitian analisa proyék:

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

Kami ngarobih laporan kami kana format html nganggo utilitas PlogConverter:

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

Ayeuna anjeun kedah ngadamel tugas supados anjeun tiasa unggah laporan.

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

Berkas konfigurasi lengkep sapertos kieu:

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

Hayu urang klik Simpen-> Simpen-> Jalankeun pikeun ngajalankeun tugas. Hayu urang ngundeur laporan ku buka tab tugas.

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Proyék Chocolatey ngan ngandung 37615 garis kode C #. Hayu urang nempo sababaraha kasalahan kapanggih.

Hasil tés

Perhatosan N1

Peringatan analis: V3005 Variabel 'Panyadia' ditugaskeun ka dirina. CrytpoHashProviderSpecs.cs 38

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

Analis ngadeteksi tugas variabel ka dirina, anu henteu masuk akal. Paling dipikaresep, di tempat salah sahiji variabel ieu kudu aya sababaraha sejen. Nya, atanapi ieu mangrupikeun salah ketik, sareng tugas tambahan tiasa dileungitkeun.

Perhatosan N2

Peringatan analis: V3093 [CWE-480] Operator '&' ngaevaluasi duanana operan. Panginten operator '&&' sirkuit pondok kedah dianggo. 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;
  }
}

bédana operator & ti operator && nya éta lamun beulah kénca babasan téh palsu, teras sisi katuhu bakal tetep diitung, nu dina hal ieu ngakibatkeun nelepon metoda teu perlu system.directory_exists.

Dina fragmen dianggap, ieu cacad minor. Leres, kaayaan ieu tiasa dioptimalkeun ku ngagentos operator & sareng operator &&, tapi tina sudut pandang praktis, ieu henteu mangaruhan nanaon. Nanging, dina kasus anu sanés, kabingungan antara & sareng && tiasa nyababkeun masalah anu serius nalika sisi katuhu éksprési dirawat kalayan nilai anu salah/teu valid. Contona, dina kumpulan kasalahan urang, diidentifikasi nganggo diagnostik V3093, aya kasus ieu:

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

Malah lamun indéks k lepat, éta bakal dipaké pikeun ngakses hiji unsur Asép Sunandar Sunarya. Hasilna, pengecualian bakal dialungkeun IndexOutOfRangeException.

Warnings N3, N4

Peringatan analis: V3022 [CWE-571] Ekspresi 'shortPrompt' salawasna leres. InteractivePrompt.cs 101
Peringatan analis: V3022 [CWE-571] Ekspresi 'shortPrompt' salawasna leres. 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
    ....
  }
  ....
}

Dina hal ieu, aya logika aneh balik operasi operator ternary. Hayu urang nempo leuwih deukeut: lamun kaayaan kuring ditandaan ku angka 1 geus patepung, teras urang ngaléngkah ka kaayaan 2, nu salawasna bener, nu hartina baris 3 bakal dieksekusi. Lamun kaayaan 1 tétéla palsu, lajeng urang bakal balik ka garis ditandaan ku angka 4, kaayaan nu ogé salawasna bener, nu hartina baris 5 bakal dieksekusi. Ku kituna, kaayaan ditandaan komentar 0 moal pernah kaeusi, nu bisa jadi teu persis logika operasi nu programmer ekspektasi.

Perhatosan N5

Peringatan analis: V3123 [CWE-783] Panginten operator '?:' tiasa dianggo dina cara anu béda ti anu disangka. Prioritasna langkung handap tibatan prioritas operator sanés dina kaayaanana. 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);
  }
}

Diagnostik dianggo pikeun jalur:

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

Kusabab variabel j sababaraha garis di luhur ieu initialized ka enol, operator ternary bakal balik nilai palsu. Kusabab kaayaan ieu, awak loop bakal dieksekusi ngan sakali. Sigana mah yén sapotong kode ieu teu dianggo pisan sakumaha programmer dimaksudkeun.

Perhatosan N6

Peringatan analis: V3022 [CWE-571] Babasan 'installedPackageVersions.Count!= 1' salawasna leres. 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);
    }
    ....
  }
  ....
}

Aya kaayaan nested aneh di dieu: InstallPackageVersions.Count!= 1nu bakal salawasna bener. Sering peringatan sapertos nunjukkeun kasalahan logis dina kode, sareng dina kasus sanésna ngan ukur nunjukkeun pamariksaan anu kaleuleuwihan.

Perhatosan N7

Peringatan analis: V3001 Aya sub-ekspresi idéntik 'commandArguments.contains ("-apikey")' ka kénca jeung ka katuhu tina '||' 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");
}

Programmer anu nyerat bagian kode ieu nyalin sareng nempelkeun dua garis anu terakhir sareng hilap ngeditna. Kusabab ieu, pamaké Chocolatey teu bisa nerapkeun parameter apikey sababaraha cara deui. Sarupa sareng parameter di luhur, kuring tiasa nawiskeun pilihan ieu:

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

Kasalahan salinan-témpél gaduh kasempetan anu luhur pikeun muncul engké atanapi engké dina proyék naon waé kalayan jumlah kode sumber anu ageung, sareng salah sahiji alat anu pangsaéna pikeun meranganana nyaéta analisis statik.

PS Jeung sakumaha salawasna, kasalahan ieu condong muncul dina tungtung kaayaan multi-garis :). Tingali publikasi "Pangaruh garis panungtungan".

Perhatosan N8

Peringatan analis: V3095 [CWE-476] Obyék 'installedPackage' dipaké saméméh éta diverifikasi ngalawan null. Pariksa garis: 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)
  {
    ....
  }
  ....
}

Kasalahan klasik: obyék heula InstallPackage dipaké lajeng dipariksa pikeun null. Diagnostik ieu nyarioskeun ka urang ngeunaan salah sahiji tina dua masalah dina program: boh InstallPackage pernah sarua null, nu diragukeun, lajeng dipariksa téh kaleuleuwihan, atanapi urang berpotensi meunang kasalahan serius dina kode - usaha pikeun ngakses rujukan null.

kacindekan

Janten kami parantos nyandak léngkah leutik - ayeuna nganggo PVS-Studio parantos janten langkung gampang sareng langkung gampang. Kuring ogé hoyong disebutkeun yen Chocolatey mangrupakeun manajer pakét alus kalawan sajumlah leutik kasalahan dina kode, nu bisa jadi malah pangsaeutikna lamun maké PVS-Studio.

Urang ngajak anjeun скачать jeung cobaan PVS-Studio. Pamakéan rutin analis statik bakal ningkatkeun kualitas sareng reliabilitas kode anu dikembangkeun ku tim anjeun sareng ngabantosan nyegah seueur kerentanan enol poé.

PS

Sateuacan publikasi, kami ngirim tulisan ka pamekar Chocolatey, sareng aranjeunna nampi éta saé. Kami henteu mendakan nanaon anu kritis, tapi aranjeunna, contona, resep kutu anu kami mendakan aya hubunganana sareng konci "api-konci".

PVS-Studio ayeuna di Chocolatey: mariksa Chocolatey ti handapeun Azure DevOps

Upami anjeun hoyong ngabagikeun tulisan ieu ka pamiarsa anu nyarios basa Inggris, mangga nganggo tautan tarjamahan: Vladislav Stolyarov. PVS-Studio Ayeuna di Chocolatey: Mariksa Chocolatey handapeun Azure DevOps.

sumber: www.habr.com

Tambahkeun komentar