PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps
Ons gaan voort om die gebruik van PVS-Studio geriefliker te maak. Ons ontleder is nou beskikbaar in Chocolatey, 'n pakketbestuurder vir Windows. Ons glo dat dit die ontplooiing van PVS-Studio, veral, in wolkdienste sal vergemaklik. Om nie ver te gaan nie, kom ons kyk na die bronkode van dieselfde Chocolatey. Azure DevOps sal as 'n CI-stelsel optree.

Hier is 'n lys van ons ander artikels oor die onderwerp van integrasie met wolkstelsels:

Ek raai u aan om aandag te gee aan die eerste artikel oor integrasie met Azure DevOps, aangesien in hierdie geval sommige punte weggelaat word om nie gedupliseer te word nie.

Dus, die helde van hierdie artikel:

PVS-ateljee is 'n statiese kode-analise-instrument wat ontwerp is om foute en potensiële kwesbaarhede te identifiseer in programme wat in C, C++, C# en Java geskryf is. Werk op 64-bis Windows-, Linux- en macOS-stelsels, en kan kode ontleed wat ontwerp is vir 32-bis, 64-bis en ingebedde ARM-platforms. As dit jou eerste keer is dat jy statiese kode-analise probeer om jou projekte na te gaan, beveel ons aan dat jy jouself vergewis van artikel oor hoe om vinnig die interessantste PVS-Studio-waarskuwings te sien en die vermoëns van hierdie instrument te evalueer.

Azure DevOps — 'n stel wolkdienste wat gesamentlik die hele ontwikkelingsproses dek. Hierdie platform bevat gereedskap soos Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, wat jou toelaat om die proses van die skep van sagteware te bespoedig en die kwaliteit daarvan te verbeter.

Chocolatey is 'n oopbronpakketbestuurder vir Windows. Die doel van die projek is om die hele sagteware-lewensiklus van installasie tot opdatering en deïnstallering op Windows-bedryfstelsels te outomatiseer.

Oor die gebruik van Chocolatey

U kan hier sien hoe om die pakketbestuurder self te installeer skakel. Volledige dokumentasie vir die installering van die ontleder is beskikbaar by skakel Sien die Installasie met behulp van die Chocolatey-pakketbestuurder-afdeling. Ek sal kortliks enkele punte van daar af herhaal.

Opdrag om die nuutste weergawe van die ontleder te installeer:

choco install pvs-studio

Opdrag om 'n spesifieke weergawe van die PVS-Studio-pakket te installeer:

choco install pvs-studio --version=7.05.35617.2075

By verstek is slegs die kern van die ontleder, die Core-komponent, geïnstalleer. Alle ander vlae (Selfstandig, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) kan deurgegee word deur --package-parameters te gebruik.

'n Voorbeeld van 'n opdrag wat 'n ontleder sal installeer met 'n inprop vir Visual Studio 2019:

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

Kom ons kyk nou na 'n voorbeeld van gerieflike gebruik van die ontleder onder Azure DevOps.

aanpassing

Laat ek jou daaraan herinner dat daar 'n aparte afdeling is oor kwessies soos die registrasie van 'n rekening, die skep van 'n Build Pipeline en die sinchronisering van jou rekening met 'n projek wat in die GitHub-bewaarplek geleë is. статья. Ons opstelling sal onmiddellik begin met die skryf van 'n konfigurasielêer.

Kom ons stel eers 'n bekendstellingsneller op, wat aandui dat ons slegs begin vir veranderinge in meester tak:

trigger:
- master

Vervolgens moet ons 'n virtuele masjien kies. Vir nou sal dit 'n agent wees wat deur Microsoft aangebied word met Windows Server 2019 en Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Kom ons gaan aan na die liggaam van die konfigurasielêer (blok stappe). Ten spyte van die feit dat u nie arbitrêre sagteware in 'n virtuele masjien kan installeer nie, het ek nie 'n Docker-houer bygevoeg nie. Ons kan Chocolatey byvoeg as 'n uitbreiding vir Azure DevOps. Om dit te doen, kom ons gaan na skakel. Klik Kry dit gratis. Volgende, as jy reeds gemagtig is, kies eenvoudig jou rekening, en indien nie, doen dan dieselfde ding na magtiging.

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Hier moet jy kies waar ons die uitbreiding sal byvoeg en op die knoppie klik installeer.

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Na suksesvolle installasie, klik Gaan voort na organisasie:

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Jy kan nou die sjabloon vir die Chocolatey-taak in die venster sien take wanneer 'n konfigurasielêer gewysig word azure-pipelines.yml:

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Klik op Chocolatey en sien 'n lys van velde:

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Hier moet ons kies installeer in die veld saam met die spanne. IN Nuspec-lêernaam dui die naam van die vereiste pakket aan – pvs-studio. As jy nie die weergawe spesifiseer nie, sal die nuutste een geïnstalleer word, wat ons heeltemal pas. Kom ons druk die knoppie voeg en ons sal die gegenereerde taak in die konfigurasielêer sien.

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

Kom ons gaan dan verder na die hoofgedeelte van ons lêer:

- task: CmdLine@2
  inputs:
    script: 

Nou moet ons 'n lêer skep met die ontlederlisensie. Hier PVSNAME и PVSKEY - name van veranderlikes wie se waardes ons spesifiseer in die instellings. Hulle sal die PVS-Studio-aanmelding en lisensiesleutel stoor. Maak die kieslys oop om hul waardes te stel Veranderlikes-> Nuwe veranderlike. Kom ons skep veranderlikes PVSNAME vir aanmelding en PVSKEY vir die ontledersleutel. Moenie vergeet om die blokkie te merk nie Hou hierdie waarde geheim vir PVSKEY. Opdrag kode:

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

Kom ons bou die projek deur die vlermuislêer in die bewaarplek te gebruik:

сall build.bat

Kom ons skep 'n gids waar lêers met die resultate van die ontleder gestoor sal word:

сall mkdir PVSTestResults

Kom ons begin om die projek te ontleed:

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

Ons skakel ons verslag om na HTML-formaat met behulp van die PlogСonverter-nutsding:

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

Nou moet jy 'n taak skep sodat jy die verslag kan oplaai.

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

Die volledige konfigurasielêer lyk soos volg:

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

Kom ons klik Stoor-> Stoor-> Hardloop om die taak uit te voer. Kom ons laai die verslag af deur na die take-oortjie te gaan.

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

Die Chocolatey-projek bevat slegs 37615 reëls C#-kode. Kom ons kyk na sommige van die foute wat gevind is.

Toets resultate

Waarskuwing N1

Ontleder waarskuwing: V3005 Die 'Verskaffer' veranderlike word aan homself toegewys. CrytpoHashProviderSpecs.cs 38

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

Die ontleder het 'n toewysing van die veranderlike aan homself opgespoor, wat nie sin maak nie. Waarskynlik, in die plek van een van hierdie veranderlikes behoort daar 'n ander een te wees. Wel, of dit is 'n tikfout, en die ekstra opdrag kan eenvoudig verwyder word.

Waarskuwing N2

Ontleder waarskuwing: V3093 [CWE-480] Die '&'-operateur evalueer beide operande. Miskien moet 'n kortsluiting '&&'-operateur eerder gebruik word. 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;
  }
}

Operator verskil & van die operateur && is dat as die linkerkant van die uitdrukking is valse, dan sal die regterkant steeds bereken word, wat in hierdie geval onnodige metode-oproepe impliseer stelsel.gids_bestaan.

In die fragment wat oorweeg word, is dit 'n geringe fout. Ja, hierdie toestand kan geoptimaliseer word deur die &-operateur met die &&-operateur te vervang, maar vanuit 'n praktiese oogpunt beïnvloed dit niks nie. In ander gevalle kan verwarring tussen & en && egter ernstige probleme veroorsaak wanneer die regterkant van die uitdrukking met verkeerde/ongeldige waardes behandel word. Byvoorbeeld, in ons foutversameling, geïdentifiseer met behulp van die V3093 diagnostiese, daar is hierdie geval:

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

Selfs al is die indeks k verkeerd is, sal dit gebruik word om toegang tot 'n skikkingselement te verkry. As gevolg hiervan sal 'n uitsondering gegooi word IndexOutOfRangeException.

Waarskuwings N3, N4

Ontleder waarskuwing: V3022 [CWE-571] Uitdrukking 'shortPrompt' is altyd waar. InteractivePrompt.cs 101
Ontleder waarskuwing: V3022 [CWE-571] Uitdrukking 'shortPrompt' is altyd waar. 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 hierdie geval is daar 'n vreemde logika agter die werking van die ternêre operateur. Kom ons kyk van naderby: as die voorwaarde wat ek met nommer 1 gemerk het nagekom word, gaan ons oor na voorwaarde 2, wat altyd waar, wat beteken dat reël 3 uitgevoer sal word. As voorwaarde 1 vals blyk te wees, gaan ons na die reël gemerk met nommer 4, die toestand waarin ook altyd waar, wat beteken dat reël 5 uitgevoer sal word. Dus sal die voorwaardes gemerk met kommentaar 0 nooit vervul word nie, wat dalk nie presies die logika van werking is wat die programmeerder verwag het nie.

Waarskuwing N5

Ontleder waarskuwing: V3123 [CWE-783] Miskien werk die '?:'-operateur op 'n ander manier as wat verwag is. Sy prioriteit is laer as die prioriteit van ander operateurs in sy toestand. 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);
  }
}

Die diagnose het vir die lyn gewerk:

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

Sedert die veranderlike j 'n paar reëls hierbo is geïnisialiseer na nul, die ternêre operateur sal die waarde terugstuur valse. As gevolg van hierdie toestand, sal die liggaam van die lus slegs een keer uitgevoer word. Dit lyk vir my of hierdie stukkie kode glad nie werk soos die programmeerder bedoel het nie.

Waarskuwing N6

Ontleder waarskuwing: V3022 [CWE-571] Uitdrukking 'installedPackageVersions.Count != 1' is altyd waar. 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);
    }
    ....
  }
  ....
}

Daar is 'n vreemde geneste toestand hier: installedPackageVersions.Count != 1wat altyd sal wees waar. Dikwels dui so 'n waarskuwing op 'n logiese fout in die kode, en in ander gevalle dui dit bloot op oortollige kontrolering.

Waarskuwing N7

Ontleder waarskuwing: V3001 Daar is identiese sub-uitdrukkings 'commandArguments.contains("-apikey")' links en regs van die '||' operateur. 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");
}

Die programmeerder wat hierdie afdeling kode geskryf het, het die laaste twee reëls gekopieer en geplak en vergeet om dit te redigeer. As gevolg hiervan kon Chocolatey-gebruikers nie die parameter toepas nie apiekey nog 'n paar maniere. Soortgelyk aan die parameters hierbo, kan ek die volgende opsies bied:

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

Kopieer-plak-foute het 'n groot kans om vroeër of later in enige projek met 'n groot hoeveelheid bronkode te verskyn, en een van die beste hulpmiddels om dit te bekamp, ​​is statiese analise.

NS En soos altyd, is hierdie fout geneig om aan die einde van 'n multi-lyn toestand te verskyn :). Sien publikasie "Laaste reël effek".

Waarskuwing N8

Ontleder waarskuwing: V3095 [CWE-476] Die 'installedPackage'-voorwerp is gebruik voordat dit teen nul geverifieer is. Kontroleer lyne: 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)
  {
    ....
  }
  ....
}

Klassieke fout: voorwerp eerste geïnstalleerde Pakket word gebruik en dan gekontroleer word nul. Hierdie diagnose vertel ons van een van twee probleme in die program: óf geïnstalleerde Pakket nooit gelyk nie nul, wat twyfelagtig is, en dan is die tjek oorbodig, of ons kan moontlik 'n ernstige fout in die kode kry - 'n poging om toegang tot 'n nulverwysing te verkry.

Gevolgtrekking

So ons het nog 'n klein stap geneem - nou het die gebruik van PVS-Studio selfs makliker en geriefliker geword. Ek wil ook sê dat Chocolatey 'n goeie pakketbestuurder is met 'n klein aantal foute in die kode, wat selfs minder kan wees wanneer PVS-Studio gebruik word.

Ons nooi jou download en probeer PVS-Studio. Gereelde gebruik van 'n statiese ontleder sal die kwaliteit en betroubaarheid van die kode wat jou span ontwikkel verbeter en help om baie nul dag kwesbaarhede.

PS

Voor publikasie het ons die artikel aan die Chocolatey-ontwikkelaars gestuur, en hulle het dit goed ontvang. Ons het niks krities gevind nie, maar hulle het byvoorbeeld gehou van die fout wat ons gevind het wat verband hou met die "api-key" sleutel.

PVS-Studio is nou in Chocolatey: kontroleer Chocolatey van onder Azure DevOps

As jy hierdie artikel met 'n Engelssprekende gehoor wil deel, gebruik asseblief die vertaalskakel: Vladislav Stolyarov. PVS-Studio is nou in Chocolatey: Kontroleer Chocolatey onder Azure DevOps.

Bron: will.com

Voeg 'n opmerking