PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps
Wy bliuwe it gebrûk fan PVS-Studio handiger te meitsjen. Us analysator is no beskikber yn Chocolatey, in pakketbehearder foar Windows. Wy leauwe dat dit de ynset fan PVS-Studio sil fasilitearje, benammen yn wolktsjinsten. Om net fier te gean, litte wy de boarnekoade fan deselde Chocolatey kontrolearje. Azure DevOps sil fungearje as in CI-systeem.

Hjir is in list fan ús oare artikels oer it ûnderwerp fan yntegraasje mei wolksystemen:

Ik advisearje jo om omtinken te jaan oan it earste artikel oer yntegraasje mei Azure DevOps, om't yn dit gefal guon punten binne weilitten om net te duplikearjen.

Dat, de helden fan dit artikel:

PVS-Studio is in statyske koade analyze ark ûntwurpen foar in identifisearje flaters en potinsjele kwetsberens yn programma skreaun yn C, C ++, C # en Java. Rint op 64-bit Windows-, Linux- en macOS-systemen, en kin koade analysearje ûntworpen foar 32-bit, 64-bit en ynbêde ARM-platfoarms. As dit de earste kear is dat jo statyske koade-analyse besykje om jo projekten te kontrolearjen, riede wy oan dat jo josels fertroud meitsje mei lidwurd oer hoe't jo fluch de meast nijsgjirrige PVS-Studio warskôgings kinne besjen en de mooglikheden fan dit ark evaluearje.

Azure DevOps - in set wolktsjinsten dy't tegearre it heule ûntwikkelingsproses dekke. Dit platfoarm omfettet ark lykas Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, wêrtroch jo it proses fan it meitsjen fan software kinne fersnelle en de kwaliteit ferbetterje.

Chocolade is in iepen boarne pakketbehearder foar Windows. It doel fan it projekt is om de hiele software-libbenssyklus te automatisearjen fan ynstallaasje oant bywurkjen en de-ynstallaasje op Windows-bestjoeringssystemen.

Oer it brûken fan Chocolatey

Jo kinne hjir sjen hoe't jo de pakketbehearder sels kinne ynstallearje link. Folsleine dokumintaasje foar it ynstallearjen fan de analysator is beskikber op link Sjoch de Ynstallaasje mei de seksje Chocolatey-pakketbehearder. Ik sil dêr koart wat punten werhelje.

Kommando om de lêste ferzje fan 'e analysator te ynstallearjen:

choco install pvs-studio

Kommando om in spesifike ferzje fan it pakket PVS-Studio te ynstallearjen:

choco install pvs-studio --version=7.05.35617.2075

Standert is allinich de kearn fan 'e analysator, de Core-komponint, ynstalleare. Alle oare flaggen (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) kinne wurde trochjûn mei --package-parameters.

In foarbyld fan in kommando dat in analysator sil ynstallearje mei in plugin foar Visual Studio 2019:

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

Litte wy no sjen nei in foarbyld fan handich gebrûk fan 'e analysator ûnder Azure DevOps.

oanpassing

Lit my jo herinnerje dat d'r in aparte seksje is oer sokke problemen as it registrearjen fan in akkount, it meitsjen fan in Build Pipeline en syngronisearje fan jo akkount mei in projekt yn it GitHub-repository. artikel. Us opset sil fuortendaliks begjinne mei it skriuwen fan in konfiguraasjetriem.

Litte wy earst in starttrigger ynstelle, wat oanjout dat wy allinich starte foar feroaringen yn master tûke:

trigger:
- master

Folgjende moatte wy in firtuele masine selektearje. Foar no sil it in Microsoft-hosted agent wêze mei Windows Server 2019 en Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Litte wy trochgean nei it lichem fan it konfiguraasjetriem (blok stappen). Nettsjinsteande it feit dat jo gjin willekeurige software kinne ynstallearje yn in firtuele masine, haw ik gjin Docker-kontener tafoege. Wy kinne Chocolatey tafoegje as in útwreiding foar Azure DevOps. Om dit te dwaan, litte wy nei link. Klikje Krij it fergees. Folgjende, as jo al autorisearre binne, selektearje jo akkount gewoan, en sa net, doch dan itselde ding nei autorisaasje.

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

Hjir moatte jo selektearje wêr't wy de tafoeging sille tafoegje en klikje op de knop Ynstallearje.

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

Nei suksesfolle ynstallaasje, klikje Trochgean nei organisaasje:

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

Jo kinne no it sjabloan foar de Chocolatey-taak yn it finster sjen taken by it bewurkjen fan in konfiguraasjetriem azure-pipelines.yml:

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

Klikje op Chocolatey en sjoch in list mei fjilden:

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

Hjir moatte wy selektearje ynstallearje yn it fjild mei de teams. YN Nuspec triemnamme jouwe de namme fan it fereaske pakket oan - pvs-studio. As jo ​​de ferzje net oantsjutte, sil de lêste ynstalleare wurde, wat ús folslein past. Lit ús op de knop drukke add en wy sille sjen de oanmakke taak yn de konfiguraasje triem.

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

Litte wy dan nei it haaddiel fan ús bestân gean:

- task: CmdLine@2
  inputs:
    script: 

No moatte wy in bestân meitsje mei de analyzer-lisinsje. Hjir PVSNAME и PVSKEY - nammen fan fariabelen waans wearden wy spesifisearje yn 'e ynstellings. Se sille de PVS-Studio login en lisinsjekaai opslaan. Om har wearden yn te stellen, iepenje it menu Fariabelen-> Nije fariabele. Litte wy fariabelen oanmeitsje PVSNAME foar oanmelde en PVSKEY foar de analyzer kaai. Ferjit net it fakje te kontrolearjen Hâld dizze wearde geheim foar PVSKEY. Kommando koade:

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

Litte wy it projekt bouwe mei it batbestân dat yn it repository leit:

сall build.bat

Litte wy in map meitsje wêr't bestannen mei de resultaten fan 'e analysator sille wurde opslein:

сall mkdir PVSTestResults

Litte wy begjinne mei it analysearjen fan it projekt:

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

Wy konvertearje ús rapport nei html-formaat mei it hulpprogramma PlogСonverter:

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

No moatte jo in taak meitsje sadat jo it rapport uploade kinne.

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

It folsleine konfiguraasjetriem sjocht der sa út:

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

Litte wy klikke Bewarje-> Bewarje-> Run om de taak út te fieren. Litte wy it rapport downloade troch nei it ljepblêd Taken te gean.

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

It Chocolatey-projekt befettet allinich 37615 rigels fan C #-koade. Litte wy nei guon fan 'e fûnen flaters sjen.

Testresultaten

Warskôging N1

Analyzer warskôging: V3005 De fariabele 'Provider' wurdt oan himsels tawiisd. CrytpoHashProviderSpecs.cs 38

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

De analysator ûntdekt in tawizing fan 'e fariabele oan himsels, wat gjin sin hat. Meast wierskynlik, yn plak fan ien fan dizze fariabelen soe d'r in oare wêze moatte. No, of dit is in typflater, en de ekstra opdracht kin gewoan fuortsmiten wurde.

Warskôging N2

Analyzer warskôging: V3093 [CWE-480] De '&' operator evaluearret beide operanden. Miskien moat ynstee in koartsluting '&&' operator brûkt wurde. 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 ferskil & fan de operator && is dat as de linker kant fan 'e útdrukking is falsk, dan sil de rjochterkant noch berekkene wurde, wat yn dit gefal ûnnedige metoadeoproppen betsjut system.directory_bestean.

Yn it beskôge fragmint is dit in lytse flater. Ja, dizze betingst kin optimalisearre wurde troch de &-operator te ferfangen troch de &&-operator, mar út in praktysk eachpunt hat dit neat oan. Yn oare gefallen kin betizing tusken & en && lykwols serieuze problemen feroarsaakje as de rjochterkant fan 'e útdrukking behannele wurdt mei ferkearde/ûnjildiche wearden. Bygelyks, yn ús flaterkolleksje, identifisearre mei help fan de V3093 diagnostyk, der is dit gefal:

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

Sels as de yndeks k is ferkeard, sil it brûkt wurde om tagong te krijen ta in array-elemint. As gefolch, in útsûndering wurdt smiten IndexOutOfRangeException.

Warskôgings N3, N4

Analyzer warskôging: V3022 [CWE-571] Ekspresje 'shortPrompt' is altyd wier. InteractivePrompt.cs 101
Analyzer warskôging: V3022 [CWE-571] Ekspresje 'shortPrompt' is altyd wier. 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
    ....
  }
  ....
}

Yn dit gefal is d'r in frjemde logika efter de wurking fan 'e ternêre operator. Litte wy neier sjen: as de betingst foldien is dy't ik markearre haw mei nûmer 1, dan geane wy ​​troch nei betingst 2, dat is altyd wier, wat betsjut dat rigel 3 útfierd wurdt. As betingst 1 falsk blykt te wêzen, dan geane wy ​​nei de rigel markearre mei nûmer 4, de betingst wêryn ek altyd is wier, wat betsjut dat rigel 5 útfierd wurdt. Sa wurde de betingsten markearre mei opmerking 0 nea foldien, wat miskien net krekt de logika fan operaasje is dy't de programmeur ferwachte.

Warskôging N5

Analyzer warskôging: V3123 [CWE-783] Miskien wurket de operator '?:' op in oare manier dan ferwachte. Syn prioriteit is leger as prioriteit fan oare operators yn syn tastân. 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);
  }
}

De diagnostyk wurke foar de line:

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

Sûnt de fariabele j in pear rigels boppe wurdt inisjalisearre op nul, de ternêre operator sil weromkomme de wearde falsk. Fanwegen dizze betingst sil it lichem fan 'e loop mar ien kear útfierd wurde. It liket my ta dat dit stikje koade hielendal net wurket lykas de programmeur bedoeld hat.

Warskôging N6

Analyzer warskôging: V3022 [CWE-571] Ekspresje 'installedPackageVersions.Count != 1' is altyd wier. 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);
    }
    ....
  }
  ....
}

D'r is hjir in frjemde geneste betingst: installedPackageVersions.Count != 1dy't altyd wêze sil wier. Faak jout sa'n warskôging in logyske flater yn 'e koade oan, en yn oare gefallen jout it gewoan oerstallige kontrôle oan.

Warskôging N7

Analyzer warskôging: V3001 D'r binne identike sub-ekspresjes 'commandArguments.contains("-apikey")' links en rjochts fan '||' operator. 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 programmeur dy't dizze seksje koade skreau, kopiearre en plakke de lêste twa rigels en fergeat se te bewurkjen. Hjirtroch koene Chocolatey-brûkers de parameter net tapasse apikey noch in pear manieren. Fergelykber mei de boppesteande parameters kin ik de folgjende opsjes biede:

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

Kopiearje-plakke flaters hawwe in hege kâns op in ferskine ier of letter yn elts projekt mei in grutte hoemannichte boarne koade, en ien fan de bêste ark foar it bestriden fan harren is statyske analyze.

PS En lykas altyd hat dizze flater de neiging om te ferskinen oan 'e ein fan in multi-line betingst :). Sjoch publikaasje "Lêste line effekt".

Warskôging N8

Analyzer warskôging: V3095 [CWE-476] It 'installedPackage'-objekt waard brûkt foardat it waard ferifiearre tsjin nul. Kontrolearje rigels: 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)
  {
    ....
  }
  ....
}

Klassike flater: objekt earst ynstallearrePackage wurdt brûkt en dan kontrolearre foar null. Dizze diagnostyk fertelt ús oer ien fan twa problemen yn it programma: beide ynstallearrePackage nea gelyk null, dat is twifelich, en dan is de kontrôle oerstallich, of wy kinne mooglik in serieuze flater yn 'e koade krije - in besykjen om tagong te krijen ta in nulreferinsje.

konklúzje

Dat wy hawwe in oare lytse stap nommen - no is it brûken fan PVS-Studio noch makliker en handiger wurden. Ik wol ek sizze dat Chocolatey in goede pakketbehearder is mei in lyts oantal flaters yn 'e koade, dy't noch minder wêze kinne by it brûken fan PVS-Studio.

Wy noegje út скачать en besykje PVS-Studio. Regelmjittich gebrûk fan in statyske analysator sil de kwaliteit en betrouberens ferbetterje fan 'e koade dy't jo team ûntwikkelet en helpt in protte te foarkommen nul dei kwetsberens.

PS

Foar publikaasje hawwe wy it artikel stjoerd nei de Chocolatey-ûntwikkelders, en se hawwe it goed ûntfongen. Wy fûnen neat kritysk, mar se fûnen bygelyks de brek dy't wy fûn hawwe relatearre oan 'e "api-key" kaai.

PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps

As jo ​​​​dit artikel wolle diele mei in Ingelsktalig publyk, brûk dan de oersettingskeppeling: Vladislav Stolyarov. PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje ûnder Azure DevOps.

Boarne: www.habr.com

Add a comment