PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps
Mir maachen weider PVS-Studio méi praktesch ze benotzen. Eis Analyser ass elo verfügbar a Chocolatey, e Package Manager fir Windows. Mir gleewen datt dëst den Détachement vum PVS-Studio erliichtert, besonnesch a Cloud Servicer. Fir net wäit ze goen, loosst eis de Quellcode vum selwechte Chocolatey iwwerpréiwen. Azure DevOps wäert als CI System handelen.

Hei ass eng Lëscht vun eisen aneren Artikelen zum Thema Integratioun mat Cloud Systemer:

Ech roden Iech op den éischten Artikel iwwer d'Integratioun mat Azure DevOps opmierksam ze maachen, well an dësem Fall sinn e puer Punkte ewechgelooss fir net duplizéiert ze ginn.

Also, d'Helden vun dësem Artikel:

PVS-Studio ass e statesche Code Analyse-Tool entwéckelt fir Feeler a potenziell Schwachstelle bei Programmer ze identifizéieren déi an C, C++, C# a Java geschriwwe sinn. Leeft op 64-Bit Windows, Linux, a MacOS Systemer, a kann Code analyséieren entworf fir 32-Bit, 64-Bit an embedded ARM Plattformen. Wann dëst Är éischte Kéier ass eng statesch Code Analyse ze probéieren fir Är Projeten z'iwwerpréiwen, empfeelen mir Iech vertraut ze maachen Artikel iwwer wéi séier déi interessantst PVS-Studio Warnungen ze gesinn an d'Fäegkeete vun dësem Tool bewäerten.

Azure DevOps - eng Rei vu Cloud Servicer déi de ganzen Entwécklungsprozess zesummen decken. Dës Plattform enthält Tools wéi Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Pläng, déi Iech erlaben de Prozess vun der Schafung vu Software ze beschleunegen an hir Qualitéit ze verbesseren.

Chocolaté ass en Open Source Package Manager fir Windows. D'Zil vum Projet ass de ganze Software Liewenszyklus vun der Installatioun bis zur Aktualiséierung an der Deinstallatioun op Windows Betribssystemer ze automatiséieren.

Iwwer d'Benotzung vu Chocolatey

Dir kënnt kucken wéi Dir de Package Manager selwer installéiert Link. Komplett Dokumentatioun fir den Analyser z'installéieren ass verfügbar op Link Kuckt d'Installatioun mam Chocolatey Package Manager Sektioun. Ech widderhuelen kuerz e puer Punkte vun do aus.

Kommando fir déi lescht Versioun vum Analysator z'installéieren:

choco install pvs-studio

Kommando fir eng spezifesch Versioun vum PVS-Studio Package z'installéieren:

choco install pvs-studio --version=7.05.35617.2075

Par défaut ass nëmmen de Kär vum Analysator, de Core Komponent, installéiert. All aner Fändelen (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) kënne mat --package-Parameteren passéiert ginn.

E Beispill vun engem Kommando deen en Analysator mat engem Plugin fir Visual Studio 2019 installéiere wäert:

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

Loosst eis elo e Beispill vun der praktescher Notzung vum Analyser ënner Azure DevOps kucken.

Upassung

Loosst mech Iech drun erënneren datt et eng separat Sektioun iwwer sou Themen ass wéi e Kont registréieren, eng Build Pipeline erstellen an Äre Kont synchroniséieren mat engem Projet am GitHub Repository. en Artikel. Eise Setup fänkt direkt un mat der Schreiwen vun enger Konfiguratiounsdatei.

Als éischt, loosst eis e Startausléiser opsetzen, wat beweist datt mir nëmme fir Ännerungen starten Meeschtesch branch:

trigger:
- master

Als nächst musse mir eng virtuell Maschinn auswielen. Fir de Moment ass et e Microsoft-hosted Agent mat Windows Server 2019 a Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Loosst eis op de Kierper vun der Konfiguratiounsdatei (Block Schrëtt). Trotz der Tatsaach datt Dir keng arbiträr Software an eng virtuell Maschinn installéiere kënnt, hunn ech keen Docker Container bäigefüügt. Mir kënnen Chocolatey als Extensioun fir Azure DevOps addéieren. Fir dëst ze maachen, loosst eis goen Link. Klickt Kritt et gratis. Als nächst, wann Dir schonn autoriséiert sidd, wielt einfach Äre Kont, a wann net, da maacht datselwecht no der Autorisatioun.

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

Hei musst Dir wielen wou mir d'Extensioun addéieren a klickt op de Knäppchen installéieren.

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

No erfollegräicher Installatioun, klickt Gitt weider an d'Organisatioun:

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

Dir kënnt elo d'Schabloun fir d'Chocolatey Task an der Fënster gesinn Aufgaben wann Dir eng Konfiguratiounsdatei ännert azure-pipelines.yml:

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

Klickt op Chocolatey a kuckt eng Lëscht vu Felder:

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

Hei musse mir wielen installéieren am Feld mat den Équipen. IN Nuspec Dateinumm gitt den Numm vum erfuerderleche Package un - pvs-studio. Wann Dir d'Versioun net spezifizéiert, gëtt déi lescht installéiert, wat eis komplett passt. Loosst eis de Knäppchen drécken Foto a mir wäerten déi generéiert Aufgab an der Konfiguratiounsdatei gesinn.

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

Als nächst, loosst eis op den Haaptdeel vun eiser Datei goen:

- task: CmdLine@2
  inputs:
    script: 

Elo musse mir e Fichier mat der Analyser Lizenz erstellen. Hei PVSNAME и PVSKEY - Nimm vu Variabelen deenen hir Wäerter mir an den Astellunge spezifizéieren. Si späicheren de PVS-Studio Login a Lizenzschlëssel. Fir hir Wäerter ze setzen, öffnen de Menü Variablen-> Nei Variabel. Loosst eis Variabelen erstellen PVSNAME fir Login an PVSKEY fir den Analyser Schlëssel. Vergiesst net d'Këscht ze kontrolléieren Halt dëse Wäert geheim fir PVSKEY. Kommando Code:

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

Loosst eis de Projet bauen mat der Fliedermausdatei am Repository:

сall build.bat

Loosst eis en Dossier erstellen wou Dateie mat de Resultater vum Analyser gespäichert ginn:

сall mkdir PVSTestResults

Loosst eis de Projet analyséieren:

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

Mir konvertéieren eise Bericht an HTML Format mam PlogСonverter Utility:

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

Elo musst Dir eng Aufgab erstellen fir datt Dir de Bericht eropluede kënnt.

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

Déi komplett Konfiguratiounsdatei gesäit esou aus:

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

Loosst eis klickt Späicheren->Späicheren-> Run fir d'Aufgab auszeféieren. Loosst eis de Bericht eroflueden andeems Dir op d'Aufgaben Tab gitt.

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

De Chocolatey Projet enthält nëmmen 37615 Zeilen C # Code. Loosst eis e puer vun de fonnte Feeler kucken.

Test Resultater

Warnung N1

Analyser Warnung: V3005 D'Variabel 'Provider' gëtt u sech selwer zougewisen. CrytpoHashProviderSpecs.cs 38

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

Den Analyser huet eng Uweisung vun der Variabel fir sech selwer entdeckt, wat net Sënn mécht. Wahrscheinlech, amplaz vun enger vun dëse Variabelen sollt et eng aner sinn. Gutt, oder dëst ass en Tippfeeler, an déi extra Aufgab kann einfach ewechgeholl ginn.

Warnung N2

Analyser Warnung: V3093 [CWE-480] Den '&' Bedreiwer evaluéiert béid Operander. Vläicht sollt amplaz e Kuerzschluss '&&' Bedreiwer benotzt ginn. Plattform.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;
  }
}

Bedreiwer Ënnerscheed & vum Bedreiwer && ass, datt wann déi lénks Säit vum Ausdrock ass falsch, da gëtt d'Recht Säit nach berechent, wat an dësem Fall onnéideg Method Appellen implizéiert system.directory_exists.

Am Fragment berücksichtegt ass dëst e klenge Feeler. Jo, dës Conditioun kann optiméiert ginn andeems den & Bedreiwer duerch den && Bedreiwer ersat gëtt, awer aus praktescher Siicht beaflosst dëst näischt. Wéi och ëmmer, an anere Fäll kann d'Verwirrung tëscht & an && sérieux Probleemer verursaachen wann déi riets Säit vum Ausdrock mat falschen/ongëlteg Wäerter behandelt gëtt. Zum Beispill, an eiser Feelersammlung, identifizéiert mat der V3093 Diagnostik, et gëtt dëse Fall:

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

Och wann den Index k falsch ass, gëtt et benotzt fir Zougang zu engem Arrayelement ze kréien. Als Resultat gëtt eng Ausnam geworf IndexOutOfRangeException.

Warnungen N3, N4

Analyser Warnung: V3022 [CWE-571] Ausdrock 'shortPrompt' ass ëmmer wouer. InteractivePrompt.cs 101
Analyser Warnung: V3022 [CWE-571] Ausdrock 'shortPrompt' ass ëmmer wouer. 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
    ....
  }
  ....
}

An dësem Fall gëtt et eng komesch Logik hannert der Operatioun vum ternäre Bedreiwer. Kucke mer méi genee: wann d'Konditioun erfëllt ass, déi ech mat der Nummer 1 markéiert hunn, da gi mer op d'Konditioun 2, déi ëmmer ass richteg, dat heescht datt d'Linn 3 ausgeführt gëtt. Wann d'Konditioun 1 falsch ass, da gi mer op d'Linn mat der Nummer 4 markéiert, an deem Zoustand ass och ëmmer richteg, dat heescht datt d'Linn ausgefouert gëtt 5. Sou ginn d'Konditioune markéiert mam Commentaire 0 ni erfëllt, wat vläicht net genau d'Logik vun der Operatioun ass, déi de Programméierer erwaart huet.

Warnung N5

Analyser Warnung: V3123 [CWE-783] Vläicht funktionnéiert den '?:' Bedreiwer op eng aner Manéier wéi et erwaart gouf. Seng Prioritéit ass manner wéi d'Prioritéit vun anere Betreiber a sengem Zoustand. 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);
  }
}

D'Diagnostik huet fir d'Linn geschafft:

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

Zënter der Variabel j e puer Zeilen uewen ass op Null initialiséiert, den ternäre Bedreiwer gëtt de Wäert zréck falsch. Wéinst dëser Konditioun gëtt de Kierper vun der Loop nëmmen eemol ausgefouert. Et schéngt mir datt dëst Stéck Code guer net funktionnéiert wéi de Programméierer geduecht huet.

Warnung N6

Analyser Warnung: V3022 [CWE-571] Ausdrock 'installedPackageVersions.Count != 1' ass ëmmer wouer. 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);
    }
    ....
  }
  ....
}

Et gëtt e komeschen nestéierten Zoustand hei: installedPackageVersions.Count != 1déi ëmmer wäert sinn richteg. Dacks weist esou eng Warnung e logesche Feeler am Code un, an an anere Fäll gëtt et einfach iwwerflësseg Kontrollen.

Warnung N7

Analyser Warnung: V3001 Et gi identesch Ënnerausdréck 'commandArguments.contains ("-apikey")' lénks a riets vum '||' Bedreiwer. 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");
}

De Programméierer, deen dës Sektioun vum Code geschriwwen huet, huet déi lescht zwou Zeilen kopéiert a gepecht a vergiess se z'änneren. Wéinst dësem konnten d'Chocolatey Benotzer de Parameter net applizéieren apikey e puer méi Weeër. Ähnlech wéi d'Parameteren hei uewen, kann ech déi folgend Optiounen ubidden:

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

Copy-Paste Feeler hunn eng héich Chance fir fréier oder spéider an all Projet mat enger grousser Quantitéit vu Quellcode ze erschéngen, an ee vun de beschten Tools fir se ze bekämpfen ass statesch Analyse.

PS A wéi ëmmer tendéiert dëse Feeler um Enn vun enger Multi-Line Conditioun ze erschéngen :). Kuckt d'Publikatioun "Last Linn Effekt".

Warnung N8

Analyser Warnung: V3095 [CWE-476] Den 'installedPackage' Objet gouf benotzt ier et géint null verifizéiert gouf. Kontroll Linnen: 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)
  {
    ....
  }
  ....
}

Klassesche Feeler: Objet éischt installéiertPackage gëtt benotzt an dann iwwerpréift wäert. Dës Diagnostik erzielt eis iwwer ee vun zwee Probleemer am Programm: entweder installéiertPackage ni gläich wäert, wat zweifelhaft ass, an dann ass de Scheck iwwerflësseg, oder mir kéinte potenziell e seriöse Feeler am Code kréien - e Versuch op eng Null Referenz ze kréien.

Konklusioun

Also hu mir e weidere klenge Schrëtt gemaach - elo ass d'Benotzung vum PVS-Studio nach méi einfach a méi praktesch ginn. Ech wéilt och soen datt Chocolatey e gudde Package Manager ass mat enger klenger Zuel vu Feeler am Code, déi nach manner kënne sinn wann Dir PVS-Studio benotzt.

Mir invitéieren Iech скачать a probéieren PVS-Studio. Regelméisseg Notzung vun engem statesche Analysator verbessert d'Qualitéit an Zouverlässegkeet vum Code deen Äert Team entwéckelt an hëlleft vill ze verhënneren. Null Dag Schwachstelle.

PS

Virun der Verëffentlechung hu mir den Artikel un d'Chocolatey Entwéckler geschéckt, a si kruten et gutt. Mir hunn näischt kritesch fonnt, awer si hunn zum Beispill de Käfer gefall, dee mir am Zesummenhang mam "api-key" Schlëssel fonnt hunn.

PVS-Studio ass elo am Chocolatey: Check Chocolatey vun ënner Azure DevOps

Wann Dir dësen Artikel mat engem engleschsproochege Publikum wëllt deelen, benotzt w.e.g. den Iwwersetzungslink: Vladislav Stolyarov. PVS-Studio ass elo a Chocolatey: Chocolatey iwwerpréift ënner Azure DevOps.

Source: will.com

Setzt e Commentaire