PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt
Jätkame PVS-Stuudio kasutamise mugavamaks muutmist. Meie analüsaator on nüüd saadaval Windowsi paketihalduris Chocolatey. Usume, et see hõlbustab PVS-Studio juurutamist eelkõige pilveteenustes. Et mitte kaugele minna, kontrollime selle sama Chocolatey lähtekoodi. Azure DevOps toimib CI-süsteemina.

Siin on nimekiri meie teistest artiklitest pilvesüsteemidega integreerimise teemal:

Soovitan teil pöörata tähelepanu esimesele artiklile Azure DevOpsiga integreerimise kohta, kuna sel juhul jäetakse mõned punktid välja, et mitte dubleerida.

Niisiis, selle artikli kangelased:

PVS-stuudio on staatilise koodi analüüsi tööriist, mis on loodud C, C++, C# ja Java keeles kirjutatud programmide vigade ja võimalike haavatavuste tuvastamiseks. Töötab 64-bitistes Windowsi, Linuxi ja macOS-i süsteemides ning saab analüüsida 32-bitistele, 64-bitistele ja manustatud ARM-platvormidele mõeldud koodi. Kui proovite oma projektide kontrollimiseks esimest korda staatilist koodianalüüsi, soovitame teil sellega tutvuda artiklit selle kohta, kuidas kiiresti vaadata kõige huvitavamaid PVS-Studio hoiatusi ja hinnata selle tööriista võimalusi.

Azure DevOps — pilveteenuste komplekt, mis ühiselt katab kogu arendusprotsessi. See platvorm sisaldab selliseid tööriistu nagu Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, mis võimaldavad teil tarkvara loomise protsessi kiirendada ja selle kvaliteeti parandada.

Chocolatey on Windowsi avatud lähtekoodiga paketihaldur. Projekti eesmärk on automatiseerida kogu tarkvara elutsükkel alates installimisest kuni värskendamise ja desinstallimiseni Windowsi operatsioonisüsteemides.

Chocolatey kasutamisest

Siit saate vaadata, kuidas installida paketihaldur ise link. Täielik analüsaatori paigaldamise dokumentatsioon on saadaval aadressil link Vaadake jaotist Installimine Chocolatey paketihalduri abil. Kordan lühidalt mõnda punkti sealt.

Analüsaatori uusima versiooni installimise käsk:

choco install pvs-studio

PVS-Studio paketi konkreetse versiooni installimise käsk:

choco install pvs-studio --version=7.05.35617.2075

Vaikimisi on installitud ainult analüsaatori tuum, Core komponent. Kõiki muid lippe (eraldi, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) saab edastada --paketiparameetrite abil.

Näide käsust, mis installib Visual Studio 2019 pistikprogrammiga analüsaatori:

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

Vaatame nüüd näidet analüsaatori mugavast kasutamisest Azure DevOpsi all.

reguleerimine

Lubage mul teile meelde tuletada, et selliste probleemide kohta nagu konto registreerimine, Build Pipeline'i loomine ja konto sünkroonimine GitHubi hoidlas asuva projektiga on eraldi jaotis. artikkel. Meie seadistus algab kohe konfiguratsioonifaili kirjutamisega.

Esmalt seadistame käivituspäästiku, mis näitab, et käivitame ainult muudatuste korral meister haru:

trigger:
- master

Järgmisena peame valima virtuaalse masina. Praegu on see Microsofti hostitud agent Windows Server 2019 ja Visual Studio 2019-ga:

pool:
  vmImage: 'windows-latest'

Liigume edasi konfiguratsioonifaili põhiosa juurde (block samme). Vaatamata asjaolule, et virtuaalmasinasse ei saa installida suvalist tarkvara, ei lisanud ma Dockeri konteinerit. Chocolatey saame lisada Azure DevOpsi laiendusena. Selleks lähme juurde link. Klõpsake Saa tasuta. Järgmiseks, kui olete juba volitatud, valige lihtsalt oma konto ja kui mitte, siis tehke pärast autoriseerimist sama.

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Siin peate valima, kuhu me laienduse lisame, ja klõpsama nuppu paigaldama.

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Pärast edukat installimist klõpsake nuppu Jätkake organisatsiooniga:

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Nüüd näete aknas Chocolatey ülesande malli ülesanded konfiguratsioonifaili redigeerimisel azure-pipelines.yml:

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Klõpsake Chocolatey ja vaadake väljade loendit:

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Siin peame valima paigaldama väljakul koos meeskondadega. IN Nuspec failinimi märkige vajaliku paketi nimi – pvs-studio. Kui te versiooni ei täpsusta, installitakse uusim, mis sobib meile täielikult. Vajutame nuppu lisama ja me näeme loodud ülesannet konfiguratsioonifailis.

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

Järgmisena liigume edasi meie faili põhiosa juurde:

- task: CmdLine@2
  inputs:
    script: 

Nüüd peame looma analüsaatori litsentsiga faili. Siin PVSNAME и PVSKEY – muutujate nimed, mille väärtused seadistustes määrame. Nad salvestavad PVS-Studio sisselogimise ja litsentsivõtme. Nende väärtuste määramiseks avage menüü Muutujad-> Uus muutuja. Loome muutujad PVSNAME sisselogimiseks ja PVSKEY analüsaatori võtme jaoks. Ärge unustage kasti märkida Hoidke see väärtus saladuses eest PVSKEY. Käsukood:

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

Ehitame projekti hoidlas asuva bat-faili abil:

сall build.bat

Loome kausta, kuhu salvestatakse analüsaatori tulemustega failid:

сall mkdir PVSTestResults

Alustame projekti analüüsimist:

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

Teisendame oma aruande html-vormingusse, kasutades utiliiti PlogСonverter:

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

Nüüd peate looma ülesande, et saaksite aruande üles laadida.

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

Täielik konfiguratsioonifail näeb välja selline:

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

Klõpsame Salvesta->Salvesta->Käivita ülesande täitmiseks. Laadime aruande alla, minnes vahekaardile ülesanded.

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Chocolatey projekt sisaldab ainult 37615 rida C# koodi. Vaatame mõningaid leitud vigu.

Testi tulemused

Hoiatus N1

Analüsaatori hoiatus: V3005 Muutuja 'Pakkuja' määratakse iseendale. CrytpoHashProviderSpecs.cs 38

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

Analüsaator tuvastas muutuja määramise endale, millel pole mõtet. Tõenäoliselt peaks ühe muutuja asemel olema mõni muu. Noh, või see on kirjaviga ja lisaülesande saab lihtsalt eemaldada.

Hoiatus N2

Analüsaatori hoiatus: V3093 [CWE-480] Operaator '&' hindab mõlemat operandi. Võib-olla tuleks selle asemel kasutada lühiseoperaatorit "&&". 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;
  }
}

Operaator erinevus & operaatorilt && on see, et kui avaldise vasak pool on vale, siis arvutatakse ikkagi parem pool, mis antud juhul tähendab tarbetuid meetodikutseid system.directory_exists.

Vaadeldavas fragmendis on see väike viga. Jah, seda tingimust saab optimeerida, asendades &-operaatori &&-operaatoriga, kuid praktilisest seisukohast ei mõjuta see midagi. Kuid muudel juhtudel võib & ja && segadus põhjustada tõsiseid probleeme, kui avaldise paremat poolt töödeldakse valede/kehtetute väärtustega. Näiteks meie veakogus tuvastati V3093 diagnostika abil, on selline juhtum:

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

Isegi kui indeks k on vale, kasutatakse seda massiivielemendile juurdepääsuks. Selle tulemusena tehakse erand IndexOutOfRangeException.

Hoiatused N3, N4

Analüsaatori hoiatus: V3022 [CWE-571] Avaldis 'shortPrompt' on alati tõene. InteractivePrompt.cs 101
Analüsaatori hoiatus: V3022 [CWE-571] Avaldis 'shortPrompt' on alati tõene. 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
    ....
  }
  ....
}

Sel juhul on kolmeosalise operaatori töö taga kummaline loogika. Vaatame lähemalt: kui on täidetud tingimus, mille märkisin numbriga 1, siis liigume edasi tingimuse 2 juurde, mis on alati tõsi, mis tähendab, et täidetakse rida 3. Kui tingimus 1 osutub valeks, siis minnakse numbriga 4 tähistatud reale, mille tingimus on samuti alati tõsi, mis tähendab, et täidetakse rida 5. Seega ei täitu kunagi kommentaariga 0 märgitud tingimused, mis ei pruugi olla täpselt selline tööloogika, mida programmeerija eeldas.

Hoiatus N5

Analüsaatori hoiatus: V3123 [CWE-783] Võib-olla töötab operaator „?:” oodatust erineval viisil. Selle prioriteet on oma seisundis teiste operaatorite prioriteetsusest madalam. 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 töötas liini jaoks:

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

Kuna muutuja j paar rida eespool lähtestatakse nulliks, tagastab kolmekordne operaator väärtuse vale. Selle tingimuse tõttu teostatakse silmuse keha ainult üks kord. Mulle tundub, et see koodijupp ei tööta üldse nii, nagu programmeerija ette nägi.

Hoiatus N6

Analüsaatori hoiatus: V3022 [CWE-571] Avaldis 'installedPackageVersions.Count != 1' on alati tõene. 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);
    }
    ....
  }
  ....
}

Siin on kummaline pesastatud tingimus: installeeritudPackageVersions.Count != 1mis jääb alatiseks olema tõsi. Tihti viitab selline hoiatus loogikaveale koodis ja muul juhul lihtsalt üleliigsele kontrollile.

Hoiatus N7

Analüsaatori hoiatus: V3001 '||' vasakul ja paremal on identsed alamväljendid 'commandArguments.contains("-apikey")' operaator. 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");
}

Programmeerija, kes selle koodiosa kirjutas, kopeeris ja kleepis kaks viimast rida ning unustas neid redigeerida. Seetõttu ei saanud Chocolatey kasutajad parameetrit rakendada apikey veel paar viisi. Sarnaselt ülaltoodud parameetritele saan pakkuda järgmisi valikuid:

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

Kopeerimis-kleebi vigadel on suur tõenäosus varem või hiljem ilmneda igas suure lähtekoodihulga projektis ja üks parimaid vahendeid nende vastu võitlemiseks on staatiline analüüs.

PS Ja nagu ikka, kipub see viga tekkima mitmerealise tingimuse lõpus :). Vaata väljaannet "Viimase rea efekt".

Hoiatus N8

Analüsaatori hoiatus: V3095 [CWE-476] Objekti „installedPackage” kasutati enne, kui selle nullväärtuse suhtes kontrolliti. Kontrollread: 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)
  {
    ....
  }
  ....
}

Klassikaline viga: objekt enne installitud pakett kasutatakse ja seejärel kontrollitakse tühjaks. See diagnostika räägib meile ühest kahest programmi probleemist: kas installitud pakett kunagi võrdne tühjaks, mis on kaheldav, ja siis on kontroll üleliigne või võib-olla saame koodis tõsise vea - katse pääseda juurde nullviitele.

Järeldus

Seega oleme astunud veel ühe väikese sammu – nüüd on PVS-Studio kasutamine muutunud veelgi lihtsamaks ja mugavamaks. Samuti tahan öelda, et Chocolatey on hea paketihaldur, mille koodis on vähe vigu, mida PVS-Studio kasutamisel võiks veelgi vähem olla.

Kutsume teid alla laadima ja proovige PVS-Studiot. Regulaarne staatilise analüsaatori kasutamine parandab teie meeskonna arendatava koodi kvaliteeti ja usaldusväärsust ning aitab vältida paljusid nullpäeva haavatavused.

PS

Enne avaldamist saatsime artikli Chocolatey arendajatele ja nad võtsid selle hästi vastu. Me ei leidnud midagi kriitilist, kuid näiteks neile meeldis leitud viga, mis on seotud võtmega "api-key".

PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi alt

Kui soovite seda artiklit inglise keelt kõneleva publikuga jagada, kasutage tõlkelinki: Vladislav Stolyarov. PVS-Studio on nüüd Chocolateys: Chocolatey kontrollimine Azure DevOpsi all.

Allikas: www.habr.com

Lisa kommentaar