PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist
JĂ€tkame PVS-Studio kasutamise mugavuse suurendamist. NĂŒĂŒd on meie analĂŒsaator saadaval Chocolatey's, Windowsi pakihalduris. Usume, et see lihtsustab PVS-Studio juurutamist, eriti pilveteenustes. Et mitte liiga kaugele minna, kontrollime Chocolatey puhaskoodi. CI sĂŒsteemina kasutatakse Azure DevOps'i.

Siin on loetelu teistest meie artiklitest pilvesĂŒsteemide integreerimise teemal:

Soovitan tutvuda esimesega artikliga Azure DevOps'i integreerimise kohta, kuna mÔned punktid on siin vÀlja jÀetud, et mitte korduda.

Nii et selle artikli kangelased on:

PVS-Studio — staatiline koodi analĂŒĂŒsi tööriist, mis on mĂ”eldud C, C++, C# ja Java keeles kirjutatud programmide vigade ja vĂ”imalike haavatavuste tuvastamiseks. Toimib 64-bitistes sĂŒsteemides Windowsis, Linuxis ja macOS-is ning suudab analĂŒĂŒsida koodi, mis on mĂ”eldud 32-bitistele, 64-bitistele ja sisseehitatud ARM-plaatidele. Kui proovite kodu staatiset analĂŒĂŒsi esmakordselt oma projektide kontrollimiseks, soovitame tutvuda artiklit kuidas kiiresti vaadata kĂ”ige huvitavamaid PVS-Studio hoiatuseid ja hinnata selle tööriista vĂ”imalusi.

Azure DevOps — kogum pilveteenuseid, mis katab kogu arendusprotsessi. Selle platvormi koosseisu kuuluvad sellised tööriistad nagu Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, mis aitavad kiirendada tarkvara loomise protsessi ja tĂ”sta selle kvaliteeti.

Chocolatey – avatud lĂ€htekoodiga paketihaldur Windowsile. Projekti eesmĂ€rk on automatiseerida kogu tarkvara elutsĂŒkkel alates installimisest kuni vĂ€rskendamise ja eemaldamiseni Windowsi operatsioonisĂŒsteemides.

Chocolatey kasutamisest

Vaata, kuidas installida paketihaldurit ise, leiate selle lingi kaudu. TĂ€ielik installatsiooni dokumentatsioon analĂŒsaatori jaoks on saadaval lingi kaudu jaotises „Installeerimine Chocolatey paketihalduri abil“. Kordan lĂŒhidalt mĂ”ned seal olevad punktid.

Viimane versioon analĂŒsaatori installimiseks kasutada kĂ€sku:

choco install pvs-studio

KĂ€sku konkreetse versiooni PVS-Studio paketi installimiseks:

choco install pvs-studio --version=7.05.35617.2075

Vaikimisi installitakse ainult analĂŒsaatori tuum — komponent Core. KĂ”iki teisi lippe (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) saab edastada —package-parameters abil.

KĂ€sku, mis installib analĂŒsaatori Visual Studio 2019 pistikprogrammiga:

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

NĂŒĂŒd vaatame analĂŒsaatori mugavat kasutamist Azure DevOps'i all.

Seadistamine

MĂ€letan, et selliste punktide, nagu konto registreerimine, Build Pipeline'i loomine ja konto sĂŒnkroonimine GitHub'is oleva projektiga, puhul on eraldi artikkel. Meie seadistus algab kohe konfiguratsioonifaili kirjutamisest.

Alustame kÀivitustriggeri seadistamisega, mÀrkides, et kÀivitame ainult muudatuste korral master haru:

trigger:
- master

JĂ€rgmiseks peame valima virtuaalmasina. Praegu on see Microsofti hostitud agent koos Windows Server 2019 ja Visual Studio 2019.

pool:
  vmImage: 'windows-latest'

Liigume edasi konfiguratsioonifaili (plokk steps). Kuigi virtuaalmasinasse ei saa paigaldada juhuslikku tarkvara, ei lisanud ma Docker konteinerit. Saame lisada Chocolatey laiendina Azure DevOpsi. Selleks liigume jÀrgmist mööda lingi kaudu. Vajutame Saa tasuta. Edasi, kui olete juba sisse logitud, valige lihtsalt oma konto, kui ei, siis tehke kÔik see uuesti pÀrast sisselogimist.

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

Siin tuleb valida, kuhu me laienduse lisame, ja vajutada nuppu Installeerida.

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

PĂ€rast edukat installimist vajutame Proceed to organization:

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

NĂŒĂŒd on vĂ”imalik nĂ€ha Chocolatey ĂŒlesande mallimist aknas tasks konfiguratsioonifaili redigeerimise ajal azure-pipelines.yml:

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

Vajutame Chocolatey peale ja nÀeme vÀljade nimekirja:

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

Siin peame valima install kĂ€skude vĂ€ljal. VĂ€ljas Nuspec File Name mĂ€rgime vajaliku paketi nime – pvs-studio. Kui versiooni ei nĂ€idata, installitakse viimane, mis meile tĂ€ielikult sobib. Vajutame nuppu add ja nĂ€eme konfiguratsioonifailis moodustunud ĂŒlesannet.

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

Liigume edasi meie faili pÔhiosa juurde:

- task: CmdLine@2
  inputs:
    script: 

NĂŒĂŒd peame looma analĂŒsaatori litsentsifaili. Siin PVSNAME ja PVSKEY – muutujate nimed, mille vÀÀrtused mÀÀrame seadistustes. Need salvestavad PVS-Studio kasutajanime ja litsentsivĂ”tme. Nende vÀÀrtuste seadmiseks avame menĂŒĂŒ Variables->New variable. Loome muutujad PVSNAME kasutajanime ja PVSKEY analĂŒĂŒsi vĂ”tme jaoks. Ärge unustage mĂ€rkida Keep this value secret kuna PVSKEY. KĂ€skluse kood:

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

Kogume projekti kokku bat-faili abil, mis asub hoidlas:

call build.bat

Loome kausta, kuhu paigutatakse analĂŒsaatori töö tulemused:

call mkdir PVSTestResults

KĂ€ivitame projekti analĂŒĂŒsi:

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

Konverteerime meie raporti html formaati PlogConverteri utiliidi abil:

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

NĂŒĂŒd tuleb luua ĂŒlesanne, et raport saaks eksportida.

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

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

kÀivitus:
- master

hulk:
  vmImage: 'windows-latest'

sammud:
- ĂŒlesanne: ChocolateyCommand@0
  sisendid:
    kÀsk: 'install'
    installPackageId: 'pvs-studio'

- ĂŒlesanne: CmdLine@2
  sisendid:
    skript: |
      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

- ĂŒlesanne: PublishBuildArtifacts@1
  sisendid:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

KlĂ”psame Salvesta->Salvesta->KĂ€ivita ĂŒlesande kĂ€ivitamiseks. Laadime aruande alla, minnes ĂŒlesande vahele.

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

Chocolatey projekt sisaldab kokku 37615 rida C# koodi. Vaadake mÔningaid leitud vigu.

Kontrollimise tulemused

Hoiatus N1

AnalĂŒsaatori hoiatus: V3005 Muutuja 'Provider' on mÀÀratud iseendale. CrytpoHashProviderSpecs.cs 38

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

AnalĂŒsaator leidis, et muutuja on mÀÀratud iseendale, mis ei ole mĂ”ttekas. TĂ”enĂ€oliselt peaks ĂŒhe neist muutujatest olema mĂ”ni teine. VĂ”i on see trĂŒkkimisviga, ja ĂŒleliigse mÀÀramise saab lihtsalt kustutada.

Hoiatus N2

AnalĂŒsaatori hoiatus: V3093 [CWE-480] '&&' operaator hindab mĂ”lemat operand. VĂ”ib-olla tuleks kasutada hoopis lĂŒhikest '&&' operaatorit. 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;
  }
}

Operaatori erinevus & operaatorist && on see, et kui vasak pool vÀljendist on false, siis hinnatakse ikkagi paremat poolt, mis tÀhendab antud juhul liigseid meetodi kutsumise system.directory_exists.

KÀesolevas fragmentis on see pisike puudus. Jah, seda tingimust on vÔimalik optimeerida, asendades operaatori & amp; operaatoriga &&, kuid praktiliselt ei mÔjuta see midagi. Siiski, teistes olukordades vÔib segadus & amp; ja && vahel tekitada tÔsiseid probleeme, kui parempoolne vÀljend töötab vale/keelatud vÀÀrtustega. NÀiteks meie vigade kogus, mille avastas diagnostika V3093, on selline juhtum:

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

Isegi kui indeks k on korrektne, seda kasutatakse massiivi elemendile juurdepÀÀsuks. Selle tulemusena genereeritakse erand IndexOutOfRangeException.

Hoiatused N3, N4

AnalĂŒsaatori hoiatus: V3022 [CWE-571] VĂ€ljend ‘shortPrompt’ on alati tĂ”ene. InteractivePrompt.cs 101
AnalĂŒsaatori hoiatus: V3022 [CWE-571] VĂ€ljend ‘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
    ....
  }
  ....
}

Antud juhul on olemas kummaline loogika ternaaroperaatori töö. Vaatame lÀhemalt: kui tingimus, mille ma tÀhistasin numbriga 1, tÀitub, siis liigume tingimusele 2, mis on alati true, seega tÀitub rida 3. Kui aga tingimus 1 osutub vale, liigume reale, mille ma mÀrkisin numbriga 4, mille tingimus on samuti alati true, seega tÀitub rida 5. Seega tingimused, mis on mÀrgitud kommentaariga 0, ei tÀitu kunagi, mis ei pruugi olla just see loogika, millele programmeerija lootis.

Hoiatus N5

AnalĂŒsaatori hoiatus: V3123 [CWE-783] VĂ”ib-olla töötas ‘?:’ operaator ootamatult. Selle prioriteet on madalam kui teiste operaatorite prioriteet selle tingimuse osas. 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 = 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

Diagnostika toimis read:

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

Kuna muutuja j initsialiseeritakse paar rida ĂŒle nulliga, tagastab ternaarne operaator vÀÀrtuse false. Selle tingimuse tĂ”ttu tĂ€idetakse tsĂŒkli keha ainult ĂŒks kord. Tundub, et see koodijupp ei tööta nii, nagu arendaja mĂ”tles.

Hoiatamine 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 sisemine tingimus: installedPackageVersions.Count != 1, mis saab alati olema true. Selline hoiatus viitab sageli koodis loogilisele veale ja teistes olukordades lihtsalt ĂŒleliigsele kontrollimisele.

Hoiatus N7

AnalĂŒsaatori hoiatus: V3001 Vasakul ja paremal ‘||’ operaatori pool on identsed alamvĂ€ljendid ‘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");
}

Koda kirjutanud programmeerija kopeeris kaks viimast rida ja unustas need redigeerida. SeetĂ”ttu kaotasid Chocolatey kasutajad vĂ”imaluse kasutada parameetrit apikey veel paari viisi. Sarnaselt ĂŒlaltoodud parameetritele, vĂ”in soovitada jĂ€rgmisi variante:

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

Kopeerige ja kleepige vigu vĂ”ivad igasugustes projektides, millel on suur hulk lĂ€htekoodi, varem vĂ”i hiljem ilmneda ja ĂŒks parimaid viise nende vastu vĂ”itlemiseks on staatiline analĂŒĂŒs.

P.S. Ja nagu alati, kipub see viga ilmuma paljude ridade tingimuste lÔpus :). Vaadake postitust "Viimase rea efekt".

Hoiatus N8

AnalĂŒsaatori hoiatus: V3095 [CWE-476] 'installedPackage' objekti kasutati enne, kui see oli nulliga vĂ”rreldud. Kontrollige ridu: 910, 917. NugetService.cs 910

public virtual ConcurrentDictionary 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: kĂ”igepealt objekti installedPackage kasutatakse ja seejĂ€rel kontrollitakse null. See diagnostika rÀÀgib meile kahest vĂ”imalikust probleemist programmis: kas installedPackage ei ole kunagi vĂ”rdne null, mis on kahtlane, ja siis on kontroll ĂŒlearune, vĂ”i me vĂ”ime potentsiaalselt saada tĂ”sise vea koodis – katse nullviidale juurdepÀÀseda.

KokkuvÔte

Nii oleme teinud veel ĂŒhe vĂ€ikese sammu – nĂŒĂŒd on PVS-Studio kasutamine muutunud veelgi lihtsamaks ja mugavamaks. Samuti tahan mainida, et Chocolatey on hea pakihaldur, millel on ainult vĂ€heseid koodivigu, mida PVS-Studio kasutamine vĂ”iks veelgi vĂ€hendada.

Kutsume teid lae alla katsetama PVS-Studio't. Statilise analĂŒsaatori regulaarselt kasutamine parandab teie meeskonna arendatava koodi kvaliteeti ja usaldusvÀÀrsust ning aitab ennetada paljusid nullpĂ€eva haavatavusi.

P.S.

Enne avaldamist saatsime artikli Chocolatey arendajatele ja nad vĂ”tsid selle hĂ€sti vastu. Meie poolt ei leitud midagi kriitilist, kuid nĂ€iteks neile meeldis meie leitud viga, mis oli seotud „api-key“ vĂ”tmega.

PVS-Studio nĂŒĂŒd Chocolatey’s: Chocolatey kontrollimine Azure DevOps'ist

Kui soovite seda artiklit ingliskeelse publikuga jagada, kasutage palun tĂ”lke linki: Vladislav Stolyarov. PVS-Studio on nĂŒĂŒd Chocolatey: Chocolatey kontrollimine Azure DevOps'is.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster