PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps
Continuemu à fà l'usu di PVS-Studio più convenientu. U nostru analizzatore hè avà dispunibule in Chocolatey, un gestore di pacchetti per Windows. Cridemu chì questu facilitarà l'implementazione di PVS-Studio, in particulare, in i servizii di nuvola. Per ùn andà luntanu, andemu à verificà u codice fonte di u listessu Chocolatey. Azure DevOps agirà cum'è un sistema CI.

Eccu una lista di i nostri altri articuli nantu à u tema di l'integrazione cù i sistemi di nuvola:

Vi cunsigliu di attentu à u primu articulu nantu à l'integrazione cù Azure DevOps, postu chì in questu casu alcuni punti sò omessi per ùn esse duplicati.

Allora, l'eroi di stu articulu:

PVS Studio hè un strumentu d'analisi di codice staticu pensatu per identificà errori è vulnerabili potenziali in i prugrammi scritti in C, C++, C# è Java. Funziona in sistemi Windows, Linux è macOS 64-bit, è pò analizà u codice cuncepitu per e piattaforme ARM 32-bit, 64-bit è embedded. Se questa hè a prima volta chì pruvate l'analisi di codice staticu per verificà i vostri prughjetti, ricumandemu di familiarizàvi articulu quantu à vede rapidamente l'avvirtimenti PVS-Studio più interessanti è evaluà e capacità di questu strumentu.

Azure DevOps - un inseme di servizii nuvola chì copre inseme tuttu u prucessu di sviluppu. Questa piattaforma include strumenti cum'è Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, chì permettenu di accelerà u prucessu di creazione di software è migliurà a so qualità.

Chocolatey hè un gestore di pacchetti open source per Windows. L'obiettivu di u prugettu hè di automatizà tuttu u ciclu di vita di u software da a stallazione à l'aghjurnamentu è a disinstallazione in i sistemi operativi Windows.

Circa l'usu di Chocolatey

Pudete vede cumu installà u gestore di pacchetti stessu in questu a lea. A documentazione cumpleta per installà l'analizzatore hè dispunibule à a lea Vede l'installazione cù a sezione di gestione di pacchetti Chocolatey. Ripeteraghju brevemente alcuni punti da quì.

Cumanda per installà l'ultima versione di l'analizzatore:

choco install pvs-studio

Cumanda per installà una versione specifica di u pacchettu PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Per automaticamente, solu u core di l'analizzatore, u cumpunente Core, hè stallatu. Tutti l'altri bandieri (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) ponu esse passati cù --package-parameters.

Un esempiu di un cumandamentu chì installerà un analizatore cù un plugin per Visual Studio 2019:

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

Avà fighjemu un esempiu di usu convenientu di l'analizzatore sottu Azure DevOps.

cutter

Lasciami ricurdà chì ci hè una sezione separata nantu à questi prublemi cum'è registrà un contu, creà un Pipeline di Build è sincronizà u vostru contu cù un prughjettu situatu in u repository GitHub. un articulu. A nostra installazione principia immediatamente cù scrive un schedariu di cunfigurazione.

Prima, cunfiguremu un trigger di lanciamentu, chì indica chì lanciamu solu per i cambiamenti Maestru ramu:

trigger:
- master

Dopu avemu bisognu di selezziunà una macchina virtuale. Per avà serà un agente ospitatu da Microsoft cù Windows Server 2019 è Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Passemu à u corpu di u schedariu di cunfigurazione (block passi). Malgradu u fattu chì ùn pudete micca installà software arbitrariu in una macchina virtuale, ùn aghju micca aghjustatu un containeru Docker. Pudemu aghjunghje Chocolatey cum'è estensione per Azure DevOps. Per fà questu, andemu à a lea. Cliccate Uttene gratis. Dopu, s'è vo site digià autorizatu, simpricimenti selezziunà u vostru contu, è s'ellu ùn hè micca, tandu fate a stessa cosa dopu l'autorizazione.

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Quì avete bisognu di selezziunà induve aghjunghje l'estensione è cliccate u buttone stallà.

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Dopu à a stallazione successu, cliccate Avanzate à l'urganizazione:

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Pudete avà vede u mudellu per u travagliu Chocolatey in a finestra fatti quandu editate un schedariu di cunfigurazione azure-pipelines.yml:

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Cliccate nantu à Chocolatey è vede una lista di campi:

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Quì avemu bisognu di selezziunà stallà in u campu cù e squadre. IN Nuspec File Name indicà u nome di u pacchettu necessariu - pvs-studio. Se ùn specificate micca a versione, serà installata l'ultima, chì ci cunvene cumplettamente. Prememu u buttone aghjunghje è vedemu u compitu generatu in u schedariu di cunfigurazione.

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

Dopu, andemu à a parte principale di u nostru schedariu:

- task: CmdLine@2
  inputs:
    script: 

Avà avemu bisognu di creà un schedariu cù a licenza di l'analizzatore. Quì PVSNAME и PVSKEY - nomi di variàbili chì i valori specifiemu in i paràmetri. Guardanu u login PVS-Studio è a chjave di licenza. Per stabilisce i so valori, apre u menu Variabili-> Variabile nova. Creemu variàbili PVSNAME per login è PVSKEY per a chjave di l'analizzatore. Ùn vi scurdate di verificà a casella Mantene stu valore sicretu di PVSKEY. Codice di cumanda:

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

Custruemu u prughjettu usendu u bat file situatu in u repository:

сall build.bat

Creemu un cartulare induve i fugliali cù i risultati di l'analizzatore seranu guardati:

сall mkdir PVSTestResults

Cuminciamu à analizà u prugettu:

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

Cunvertemu u nostru rapportu in formatu html utilizendu l'utilità PlogСonverter:

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

Avà vi tocca à creà un compitu in modu chì vi pò cullà u rapportu.

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

U schedariu di cunfigurazione cumpletu s'assumiglia cusì:

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

Facemu cliccà Salvà-> Salvà-> Esegui per eseguisce u compitu. Scaricate u rapportu andendu à a tabulazione di i travaglii.

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

U prughjettu Chocolatey cuntene solu 37615 linee di codice C#. Fighjemu un pocu di l'errori truvati.

I risultati di a prova

Avvertimentu N1

Avvisu di l'analizzatore: V3005 A variabile "Provider" hè attribuita à sè stessu. CrytpoHashProviderSpecs.cs 38

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

L'analizzatore hà rilevatu una assignazione di a variàbile à ellu stessu, chì ùn hà micca sensu. Hè assai prubabile, in u locu di una di sti variàbili ci deve esse un altru. Ebbè, o questu hè un typo, è l'assignazione extra pò esse simplicemente eliminata.

Avvertimentu N2

Avvisu di l'analizzatore: V3093 [CWE-480] L'operatore '&' valuta i dui operandi. Forsi un operatore di cortu-circuit '&&' deve esse usatu invece. 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;
  }
}

Differenza di l'operatore & da l'operatore && hè chì se u latu manca di l'espressione hè sbagliate, allura u latu drittu serà sempre calculatu, chì in questu casu implica chjamate di metudu inutile system.directory_exists.

In u frammentu cunsideratu, questu hè un difettu minore. Iè, sta cundizione pò esse ottimisata rimpiazzendu l'operatore & cù l'operatore &&, ma da un puntu di vista praticu, questu ùn affetta nunda. In ogni casu, in altri casi, a cunfusione trà & è && pò causà seri prublemi quandu u latu drittu di l'espressione hè trattatu cù valori incorrecti / invalidi. Per esempiu, in a nostra cullizzioni di errore, identificatu cù u diagnosticu V3093, ci hè stu casu:

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

Ancu s'è l'indici k hè incorrectu, serà utilizatu per accede à un elementu array. In u risultatu, una eccezzioni serà ghjittata IndexOutOfRangeException.

Avvertimenti N3, N4

Avvisu di l'analizzatore: V3022 [CWE-571] L'espressione 'shortPrompt' hè sempre vera. InteractivePrompt.cs 101
Avvisu di l'analizzatore: V3022 [CWE-571] L'espressione 'shortPrompt' hè sempre vera. 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
    ....
  }
  ....
}

In questu casu, ci hè una logica strana daretu à l'operazione di l'operatore ternariu. Fighjemu un sguardu più vicinu: se a cundizione ch'e aghju marcatu cù u numeru 1 hè cumpleta, allora andemu à a cundizione 2, chì hè sempre vera, chì significa chì a linea 3 serà eseguita. Se a cundizione 1 hè falsa, allora andemu à a linea marcata cù u numeru 4, a cundizione in quale hè ancu sempre. vera, chì significheghja esse eseguita a linea 5. Cusì, i cundizioni marcati cù u cummentariu 0 ùn saranu mai cumpiiti, chì pò esse micca esattamente a logica di l'operazione chì u programatore aspittava.

Avvertimentu N5

Avvisu di l'analizzatore: V3123 [CWE-783] Forse l'operatore '?:' funziona in una manera diversa da ciò chì era previstu. A so priorità hè più bassu di a priorità di l'altri operatori in a so cundizione. Opzioni.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);
  }
}

U diagnosticu hà travagliatu per a linea:

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

Dapoi a variabile j uni pochi di linii sopra hè inizializatu à cero, l'operatore ternariu restituverà u valore sbagliate. A causa di sta cundizione, u corpu di u ciclu serà eseguitu solu una volta. Mi pari chì stu pezzu di codice ùn funziona micca in tuttu cum'è u prugrammatore hà intesu.

Avvertimentu N6

Avvisu di l'analizzatore: V3022 [CWE-571] L'espressione 'installedPackageVersions.Count != 1' hè sempre vera. 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);
    }
    ....
  }
  ....
}

Ci hè una strana cundizione nidificata quì: installatuPackageVersions.Count != 1chì sarà sempre vera. Spessu un tali avvistu indica un errore logicu in u codice, è in altri casi solu indica una verificazione redundante.

Avvertimentu N7

Avvisu di l'analizzatore: V3001 Ci sò sub-espressioni idèntica 'commandArguments.contains ("-apikey")' à a manca è à a diritta di u '||' operatore. 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");
}

U programatore chì hà scrittu sta rùbbrica di codice hà copiatu è incollatu l'ultimi dui linii è scurdatu di edità. Per via di questu, l'utilizatori di Chocolatey ùn anu pussutu applicà u paràmetru apikey un paru di modi più. Simile à i paràmetri sopra, possu offre e seguenti opzioni:

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

L'errore di copia-incolla anu una grande probabilità di apparisce prima o dopu in ogni prughjettu cù una grande quantità di codice fonte, è unu di i meglii strumenti per cummattiri hè l'analisi statica.

PS È cum'è sempre, questu errore tende à apparisce à a fine di una cundizione multi-linea :). Vede a publicazione "Effettu di l'ultima linea".

Avvertimentu N8

Avvisu di l'analizzatore: V3095 [CWE-476] L'ughjettu "installedPackage" hè statu utilizatu prima di esse verificatu contru null. Verificate e linee: 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)
  {
    ....
  }
  ....
}

Errore classicu: ughjettu prima Pacchettu installatu hè utilizatu è dopu verificatu null null. Stu diagnosticu ci parla di unu di dui prublemi in u prugramma: o Pacchettu installatu mai uguali null null, chì hè dubbitu, è tandu u cuntrollu hè redundante, o pudemu avè un errore seriu in u codice - un tentativu di accede à una riferenza nulla.

cunchiusioni

Allora avemu fattu un altru picculu passu - avà aduprà PVS-Studio hè diventatu ancu più faciule è più còmode. Vulariu ancu dì chì Chocolatey hè un bonu gestore di pacchetti cù un pocu di errore in u codice, chì puderia esse ancu menu quandu si usa PVS-Studio.

Vi invitemu скачать è pruvate PVS-Studio. L'usu regulare di un analizatore staticu migliurà a qualità è l'affidabilità di u codice chì u vostru squadra sviluppa è aiuta à prevene parechji vulnerabilità di ghjornu zero.

PS

Prima di a publicazione, avemu mandatu l'articulu à i sviluppatori Chocolatey, è anu ricevutu bè. Ùn avemu micca truvatu nunda di criticu, ma elli, per esempiu, li piacia u bug chì avemu trovu in relazione cù a chjave "api-key".

PVS-Studio hè avà in Chocolatey: verificate Chocolatey da sottu Azure DevOps

Se vulete sparte stu articulu cù un publicu anglofonu, per piacè utilizate u ligame di traduzzione: Vladislav Stolyarov. PVS-Studio hè avà in Chocolatey: Verificate Chocolatey sottu Azure DevOps.

Source: www.habr.com

Add a comment