PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en
PVS-Studio erabiltzea erosoagoa egiten jarraitzen dugu. Gure analizatzailea Chocolatey-n dago eskuragarri, Windows-erako paketeen kudeatzailean. Horrek PVS-Studio hedatzea erraztuko duela uste dugu, bereziki hodeiko zerbitzuetan. Urrutira ez joateko, egiaztatu dezagun Chocolatey beraren iturburu kodea. Azure DevOps-ek CI sistema gisa jardungo du.

Hona hemen hodeiko sistemekin integrazioaren gaiari buruzko gure beste artikuluen zerrenda:

Azure DevOps-ekin integratzeari buruzko lehen artikuluari arreta jartzea gomendatzen dizut, kasu honetan puntu batzuk ezabatzen baitira bikoiztu ez izateko.

Beraz, artikulu honen heroiak:

PVS-Studioa C, C++, C# eta Javan idatzitako programetan akatsak eta ahultasun potentzialak identifikatzeko diseinatutako kode estatikoa aztertzeko tresna bat da. 64 biteko Windows, Linux eta macOS sistemetan exekutatzen da, eta 32 biteko, 64 biteko eta txertatutako ARM plataformetarako diseinatutako kodea azter dezake. Kode estatikoen azterketa zure proiektuak egiaztatzeko lehen aldia bada, ezagutzea gomendatzen dizugu Artikulu PVS-Studioko abisu interesgarrienak azkar nola ikusi eta tresna honen gaitasunak ebaluatzeari buruz.

Azure DevOps — garapen prozesu osoa elkarrekin estaltzen duten hodeiko zerbitzuen multzoa. Plataforma honek Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans bezalako tresnak biltzen ditu, softwarea sortzeko prozesua bizkortu eta haren kalitatea hobetzeko aukera ematen dutenak.

chocolatey Windows-erako kode irekiko paketeen kudeatzailea da. Proiektuaren helburua softwarearen bizi-ziklo osoa automatizatzea da, instalaziotik eguneratze eta Windows sistema eragileetan desinstalaziora arte.

Chocolatey erabiltzeari buruz

Pakete kudeatzailea bera nola instalatu ikus dezakezu honetan link. Analizatzailea instalatzeko dokumentazio osoa helbidean dago eskuragarri link Ikusi Chocolatey paketeen kudeatzailea erabiliz Instalazioa atala. Hortik aurrera puntu batzuk laburki errepikatuko ditut.

Analizatzailearen azken bertsioa instalatzeko komandoa:

choco install pvs-studio

PVS-Studio paketearen bertsio zehatz bat instalatzeko komandoa:

choco install pvs-studio --version=7.05.35617.2075

Lehenespenez, analizatzailearen nukleoa, Core osagaia, bakarrik instalatzen da. --package-parameters erabiliz gainontzeko bandera guztiak (Autonomikoa, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) pasa daitezke.

Visual Studio 2019rako plugin batekin analizatzaile bat instalatuko duen komando baten adibidea:

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

Ikus dezagun orain analizagailuaren erabilera erosoaren adibide bat Azure DevOps-en.

doikuntza

Gogorarazten dizut kontu bat erregistratzeari, Build Pipeline bat sortzeari eta zure kontua GitHub biltegian kokatutako proiektu batekin sinkronizatzeari buruzko atal bereizi bat dagoela. artikuluan. Gure konfigurazioa berehala hasiko da konfigurazio fitxategi bat idazten.

Lehenik eta behin, konfigura dezagun abiarazteko abiarazlea, aldaketak egiteko soilik abiarazten dugula adieraziz master adarra:

trigger:
- master

Ondoren, makina birtual bat hautatu behar dugu. Oraingoz Microsoft-ek ostatatutako agente bat izango da Windows Server 2019 eta Visual Studio 2019-ekin:

pool:
  vmImage: 'windows-latest'

Joan gaitezen konfigurazio fitxategiaren gorputzera (blokea urrats). Makina birtualean software arbitrarioa instalatu ezin duzun arren, ez dut Docker edukiontzirik gehitu. Chocolatey gehi dezakegu Azure DevOps-en luzapen gisa. Horretarako, goazen link. Egin klik Lortu ezazu dohainik. Ondoren, dagoeneko baimenduta bazaude, hautatu zure kontua, eta ez bada, egin gauza bera baimendu ondoren.

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Hemen hautatu behar duzu non gehituko dugun luzapena eta egin klik botoian Instalatu.

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Instalatu ondoren, egin klik Antolakuntzarekin jarraitu:

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Orain Chocolatey zereginaren txantiloia ikus dezakezu leihoan zereginak konfigurazio fitxategi bat editatzerakoan azure-pipelines.yml:

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Egin klik Chocolatey-n eta ikusi eremuen zerrenda:

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Hemen aukeratu behar dugu instalatzeko taldeekin zelaian. IN Nuspec fitxategiaren izena adierazi behar den paketearen izena – pvs-studio. Bertsioa zehazten ez baduzu, azkena instalatuko da, guztiz egokitzen zaiguna. Sakatu dezagun botoia gehitu eta sortutako zeregina konfigurazio fitxategian ikusiko dugu.

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

Jarraian, joan gaitezen gure fitxategiaren zati nagusira:

- task: CmdLine@2
  inputs:
    script: 

Orain analizatzailearen lizentziarekin fitxategi bat sortu behar dugu. Hemen PVSNAME и PVSKEY – Ezarpenetan balioak zehazten ditugun aldagaien izenak. PVS-Studio saio-hasiera eta lizentzia-gakoa gordeko dituzte. Haien balioak ezartzeko, ireki menua Aldagaiak->Aldagai berria. Sor ditzagun aldagaiak PVSNAME saioa hasteko eta PVSKEY analizatzailearen teklarako. Ez ahaztu laukia markatzea Ezkutuan gorde balio hau egiteko PVSKEY. Agindu kodea:

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

Eraiki dezagun proiektua biltegian dagoen bat fitxategia erabiliz:

сall build.bat

Sortu dezagun karpeta bat non analizatzailearen emaitzekin fitxategiak gordeko diren:

сall mkdir PVSTestResults

Has gaitezen proiektua aztertzen:

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

Gure txostena html formatura bihurtzen dugu PlogСonverter utilitatea erabiliz:

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

Orain zeregin bat sortu behar duzu txostena igo ahal izateko.

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

Konfigurazio-fitxategi osoa honelakoa da:

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

Egin dezagun klik Gorde->Gorde->Exekutatu zeregina exekutatzeko. Deskargatu dezagun txostena zereginen fitxara joanda.

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Chocolatey proiektuak C# kodearen 37615 lerro besterik ez ditu. Ikus ditzagun aurkitutako akats batzuk.

Proben emaitzak

Abisua N1

Analizatzailearen abisua: V3005 'Hornitzailea' aldagaia bere buruari esleitzen zaio. CrytpoHashProviderSpecs.cs 38

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

Analizatzaileak bere buruari aldagaiaren esleipena detektatu zuen, eta horrek ez du zentzurik. Seguruenik, aldagai horietako baten ordez besteren bat egon beharko litzateke. Beno, edo hau akatsa da, eta aparteko esleipena kendu besterik ez dago.

Abisua N2

Analizatzailearen abisua: V3093 [CWE-480] '&' operadoreak bi eragigaiak ebaluatzen ditu. Beharbada zirkuitulaburren '&&' operadorea erabili beharko litzateke. Plataforma.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;
  }
}

Operadorearen aldea & operadorearengandik && da esamoldearen ezkerraldea bada false, orduan eskuineko aldea oraindik kalkulatuko da, eta horrek kasu honetan alferrikako metodo-deiak suposatzen du sistema.direktorioa_exista.

Kontuan hartutako zatian, hau akats txiki bat da. Bai, baldintza hau optimizatu daiteke & operadorea && operadorearekin ordezkatuz, baina ikuspuntu praktikotik, horrek ez du ezertan eragiten. Hala ere, beste kasu batzuetan, & eta &&-ren arteko nahasteak arazo larriak sor ditzake adierazpenaren eskuineko aldea balio oker/baliogabeekin tratatzen denean. Adibidez, gure akatsen bilduman, V3093 diagnostikoa erabiliz identifikatu, kasu hau dago:

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

Nahiz eta indizea k okerra da, array-elementu batera sartzeko erabiliko da. Ondorioz, salbuespen bat botako da IndexOutOfRangeException.

Abisuak N3, N4

Analizatzailearen abisua: V3022 [CWE-571] 'ShortPrompt' adierazpena beti da egia. InteractivePrompt.cs 101
Analizatzailearen abisua: V3022 [CWE-571] 'ShortPrompt' adierazpena beti da egia. 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
    ....
  }
  ....
}

Kasu honetan, operadore ternarioaren funtzionamenduaren atzean logika arraro bat dago. Ikus dezagun hurbilagotik: 1 zenbakiarekin markatu dudan baldintza betetzen bada, 2. baldintzara pasatuko gara, hau da, beti. Egia, hau da, 3. lerroa exekutatuko da. 1. baldintza faltsua suertatzen bada, orduan 4 zenbakiaz markatutako lerrora joango gara, baldintza horretan ere beti baitago. Egia, hau da, 5. lerroa exekutatuko dela esan nahi du. Horrela, 0 iruzkinarekin markatutako baldintzak ez dira inoiz beteko, agian programatzaileak espero zuen eragiketa-logika ez izatea.

Abisua N5

Analizatzailearen abisua: V3123 [CWE-783] Agian '?:' operadoreak espero zena baino beste modu batean funtzionatzen du. Bere lehentasuna bere egoeran beste operadoreen lehentasuna baino txikiagoa da. Aukerak.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);
  }
}

Diagnostikoak lerroan funtzionatu zuen:

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

Aldagaitik j goiko lerro batzuk zerora hasten dira, operadore ternarioak balioa itzuliko du false. Baldintza hau dela eta, begiztaren gorputza behin bakarrik exekutatuko da. Iruditzen zait kode zati honek ez duela batere funtzionatzen programatzaileak nahi zuen bezala.

Abisua N6

Analizatzailearen abisua: V3022 [CWE-571] 'installedPackageVersions.Count != 1' adierazpena beti da egia. 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);
    }
    ....
  }
  ....
}

Hemen habiaratutako baldintza arraro bat dago: installPackageVersions.Count != 1beti egongo dena Egia. Askotan horrelako abisu batek kodean errore logiko bat adierazten du, eta beste kasu batzuetan egiaztapen erredundantea besterik ez du adierazten.

Abisua N7

Analizatzailearen abisua: V3001 'commandArguments.contains("-apikey")' azpi-esamolde berdinak daude '||'-ren ezkerraldean eta eskuinean. operadorea. 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");
}

Kode-atal hau idatzi zuen programatzaileak azken bi lerroak kopiatu eta itsatsi zituen eta editatzea ahaztu zitzaion. Horregatik, Chocolatey-ko erabiltzaileek ezin izan dute parametroa aplikatu apikey modu pare bat gehiago. Goiko parametroen antzera, aukera hauek eskain ditzaket:

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

Kopiatu-itsatsi erroreek iturburu-kode kopuru handia duten edozein proiektutan lehenago edo beranduago agertzeko aukera handiak dituzte, eta horiei aurre egiteko tresnarik onenetako bat analisi estatikoa da.

PS Eta beti bezala, errore hau lerro anitzeko baldintza baten amaieran agertu ohi da :). Ikus argitalpena "Azken lerroaren efektua".

Abisua N8

Analizatzailearen abisua: V3095 [CWE-476] 'installedPackage' objektua nullaren aurka egiaztatu aurretik erabili zen. Egiaztatu lerroak: 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)
  {
    ....
  }
  ....
}

Akats klasikoa: objektua lehenik instalatutakoPaketea erabiltzen da eta gero egiaztatu null. Diagnostiko honek programaren bi arazoetariko baten berri ematen digu: bai instalatutakoPaketea inoiz berdinak null, zalantzazkoa da, eta orduan egiaztapena erredundantea da, edo baliteke akats larri bat lor genezake kodean - erreferentzia nulu batera sartzeko saiakera bat.

Ondorioa

Beraz, beste urrats txiki bat eman dugu - orain PVS-Studio erabiltzea are errazagoa eta erosoagoa bihurtu da. Esan nahi nuke Chocolatey pakete-kudeatzaile ona dela kodean errore kopuru txiki batekin, PVS-Studio erabiltzean are gutxiago izan daitezkeela.

Gonbidatzen zaitugu deskargatu eta saiatu PVS-Studio. Analizatzaile estatiko bat aldizka erabiltzeak zure taldeak garatzen duen kodearen kalitatea eta fidagarritasuna hobetuko ditu eta asko saihesten lagunduko du zero eguneko ahultasunak.

PS

Argitaratu aurretik, artikulua Chocolatey garatzaileei bidali genien, eta ondo jaso zuten. Ez dugu ezer kritikorik aurkitu, baina haiei, adibidez, gustatu zaie "api-key" gakoarekin lotuta aurkitu dugun akatsa.

PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzen Azure DevOps-en

Artikulu hau ingelesez hitz egiten duen publiko batekin partekatu nahi baduzu, mesedez, erabili itzulpen esteka: Vladislav Stolyarov. PVS-Studio Chocolatey-n dago orain: Chocolatey egiaztatzea Azure DevOps-en.

Iturria: www.habr.com

Gehitu iruzkin berria