PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps
Við höldum áfram að gera notkun PVS-Studio þægilegri. Greiningartækið okkar er nú fáanlegt í Chocolatey, pakkastjóra fyrir Windows. Við teljum að þetta muni auðvelda uppsetningu PVS-Studio, sérstaklega í skýjaþjónustu. Til þess að fara ekki langt skulum við athuga frumkóðann á sama súkkulaði. Azure DevOps mun virka sem CI kerfi.

Hér er listi yfir aðrar greinar okkar um efni samþættingar við skýjakerfi:

Ég ráðlegg þér að fylgjast með fyrstu greininni um samþættingu við Azure DevOps, þar sem í þessu tilfelli er sumum atriðum sleppt til að vera ekki afrit.

Svo, hetjurnar í þessari grein:

PVS-stúdíó er truflanir kóða greiningartæki hannað til að bera kennsl á villur og hugsanlega veikleika í forritum sem eru skrifuð í C, C++, C# og Java. Keyrir á 64 bita Windows, Linux og macOS kerfum og getur greint kóða sem hannaður er fyrir 32 bita, 64 bita og innbyggða ARM palla. Ef þetta er í fyrsta skipti sem þú reynir statíska kóðagreiningu til að athuga verkefnin þín, mælum við með að þú kynnir þér grein um hvernig á að skoða áhugaverðustu PVS-Studio viðvaranirnar fljótt og meta möguleika þessa tóls.

Azure DevOps — safn skýjaþjónustu sem ná sameiginlega yfir allt þróunarferlið. Þessi vettvangur inniheldur verkfæri eins og Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, sem gerir þér kleift að flýta fyrir því að búa til hugbúnað og bæta gæði hans.

Súkkulaði er opinn uppspretta pakkastjóri fyrir Windows. Markmið verkefnisins er að gera allan líftíma hugbúnaðarins sjálfvirkan frá uppsetningu til uppfærslu og fjarlægðar á Windows stýrikerfum.

Um að nota súkkulaði

Þú getur séð hvernig á að setja upp pakkastjórann sjálfan á þessu tengill. Fullkomin skjöl fyrir uppsetningu greiningartækisins eru fáanleg á tengill Sjá kaflann Uppsetning með því að nota Chocolatey pakkastjórnunarhlutann. Ég mun í stuttu máli endurtaka nokkur atriði þaðan.

Skipun til að setja upp nýjustu útgáfuna af greiningartækinu:

choco install pvs-studio

Skipun til að setja upp ákveðna útgáfu af PVS-Studio pakkanum:

choco install pvs-studio --version=7.05.35617.2075

Sjálfgefið er að aðeins kjarni greiningartækisins, kjarnahlutinn, er settur upp. Hægt er að fara framhjá öllum öðrum fánum (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) með því að nota --pakka-breytur.

Dæmi um skipun sem mun setja upp greiningartæki með viðbót fyrir Visual Studio 2019:

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

Nú skulum við skoða dæmi um þægilega notkun greiningartækisins undir Azure DevOps.

aðlögun

Leyfðu mér að minna þig á að það er sérstakur hluti um mál eins og að skrá reikning, búa til Build Pipeline og samstilla reikninginn þinn við verkefni sem staðsett er í GitHub geymslunni. grein. Uppsetningin okkar mun strax byrja með því að skrifa stillingarskrá.

Í fyrsta lagi skulum við setja upp ræsingu sem gefur til kynna að við ræsum aðeins fyrir breytingar á húsbóndi útibú:

trigger:
- master

Næst þurfum við að velja sýndarvél. Í bili mun það vera umboðsmaður sem hýst er af Microsoft með Windows Server 2019 og Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Við skulum halda áfram að meginmáli stillingarskrárinnar (blokk skref). Þrátt fyrir þá staðreynd að þú getur ekki sett upp handahófskenndan hugbúnað í sýndarvél, bætti ég ekki Docker gámi við. Við getum bætt Chocolatey við sem viðbót fyrir Azure DevOps. Til að gera þetta skulum við fara til tengill. Smellur Fáðu það ókeypis. Næst, ef þú hefur nú þegar heimild, veldu einfaldlega reikninginn þinn, og ef ekki, gerðu það sama eftir heimild.

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Hér þarftu að velja hvar við munum bæta við viðbótinni og smella á hnappinn setja.

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Eftir vel heppnaða uppsetningu, smelltu á Haltu áfram að skipulagningu:

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Þú getur nú séð sniðmátið fyrir Súkkulaðiverkefnið í glugganum verkefni þegar stillingarskrá er breytt azure-pipelines.yml:

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Smelltu á Chocolatey og sjáðu lista yfir reiti:

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Hér þurfum við að velja setja á vellinum með liðunum. IN Nuspec skráarheiti tilgreindu nafn nauðsynlegs pakka – pvs-studio. Ef þú tilgreinir ekki útgáfuna verður sú nýjasta sett upp, sem hentar okkur algjörlega. Við skulum ýta á takkann bæta við og við munum sjá myndað verkefni í stillingarskránni.

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

Næst skulum við halda áfram að meginhluta skráar okkar:

- task: CmdLine@2
  inputs:
    script: 

Nú þurfum við að búa til skrá með greiningarleyfinu. Hérna PVSNAME и PVSKEY - nöfn breyta sem við tilgreinum í stillingunum. Þeir munu geyma PVS-Studio innskráningu og leyfislykil. Til að stilla gildi þeirra skaltu opna valmyndina Breytur->Ný breyta. Búum til breytur PVSNAME fyrir innskráningu og PVSKEY fyrir greiningarlykilinn. Ekki gleyma að haka í reitinn Haltu þessu gildi leyndu í PVSKEY. Skipunarkóði:

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

Við skulum byggja verkefnið með því að nota kylfuskrána sem staðsett er í geymslunni:

сall build.bat

Við skulum búa til möppu þar sem skrár með niðurstöðum greiningartækisins verða geymdar:

сall mkdir PVSTestResults

Við skulum byrja að greina verkefnið:

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

Við umbreytum skýrslunni okkar í HTML snið með því að nota PlogСonverter tólið:

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

Nú þarftu að búa til verkefni svo þú getir hlaðið upp skýrslunni.

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

Heildar stillingarskráin lítur svona ú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()

Við skulum smella Vista->Vista-> Keyra til að keyra verkefnið. Sækjum skýrsluna með því að fara í verkefnaflipann.

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Chocolatey verkefnið inniheldur aðeins 37615 línur af C# kóða. Við skulum skoða nokkrar villur sem fundust.

Niðurstöður prófa

Viðvörun N1

Viðvörun greiningartækis: V3005 'Provider' breytan er úthlutað sjálfri sér. CrytpoHashProviderSpecs.cs 38

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

Greiningartækið fann úthlutun breytunnar á sjálfan sig, sem er ekki skynsamlegt. Líklegast ætti að vera einhver önnur í stað einnar af þessum breytum. Jæja, eða þetta er innsláttarvilla og aukaverkefnið er einfaldlega hægt að fjarlægja.

Viðvörun N2

Viðvörun greiningartækis: V3093 [CWE-480] '&' rekstraraðilinn metur báðar operendur. Kannski ætti að nota skammhlaups „&&“ stjórnanda í staðinn. 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;
  }
}

Munur á rekstraraðila & frá rekstraraðila && er að ef vinstri hlið tjáningarinnar er rangar, þá verður hægri hliðin samt reiknuð, sem í þessu tilfelli felur í sér óþarfa aðferðaköll system.directory_isists.

Í brotinu sem skoðað er er þetta smávægilegur galli. Já, þetta ástand er hægt að fínstilla með því að skipta um & stjórnanda fyrir && rekstraraðila, en frá hagnýtu sjónarhorni hefur þetta ekki áhrif á neitt. Hins vegar, í öðrum tilvikum, getur rugl á milli & og && valdið alvarlegum vandamálum þegar hægri hlið tjáningarinnar er meðhöndluð með röngum/ógildum gildum. Til dæmis, í villusafni okkar, auðkennt með V3093 greiningu, það er þetta mál:

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

Jafnvel þótt vísitalan k er rangt verður það notað til að fá aðgang að fylkiseiningu. Fyrir vikið verður undantekning hent IndexOutOfRangeException.

Viðvaranir N3, N4

Viðvörun greiningartækis: V3022 [CWE-571] Tjáning „shortPrompt“ er alltaf satt. InteractivePrompt.cs 101
Viðvörun greiningartækis: V3022 [CWE-571] Tjáning „shortPrompt“ er alltaf satt. 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
    ....
  }
  ....
}

Í þessu tilviki er undarleg rökfræði á bak við rekstur þrískiptsins. Skoðum nánar: ef skilyrðið sem ég merkti með númeri 1 er uppfyllt, þá förum við yfir í skilyrði 2, sem er alltaf satt, sem þýðir að lína 3 verður framkvæmd. Ef skilyrði 1 reynist rangt, þá förum við í línuna merkta með númerinu 4, ástandið sem er líka alltaf í satt, sem þýðir að lína 5 verður keyrð. Þannig munu skilyrðin merkt með athugasemd 0 aldrei verða uppfyllt, sem er kannski ekki nákvæmlega sú rökfræði sem forritarinn bjóst við.

Viðvörun N5

Viðvörun greiningartækis: V3123 [CWE-783] Kannski virkar '?:' stjórnandinn á annan hátt en búist var við. Forgangur þess er lægri en annarra rekstraraðila í ástandi þess. 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);
  }
}

Greiningin virkaði fyrir línuna:

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

Þar sem breyt j nokkrar línur fyrir ofan er frumstillt á núll, þá mun þrískiptur rekstraraðili skila gildinu rangar. Vegna þessa ástands verður meginmál lykkjunnar aðeins keyrt einu sinni. Mér sýnist að þetta stykki af kóða virki alls ekki eins og forritarinn ætlaði sér.

Viðvörun N6

Viðvörun greiningartækis: V3022 [CWE-571] Tjáningin 'installedPackageVersions.Count != 1' er alltaf satt. 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);
    }
    ....
  }
  ....
}

Það er undarlegt hreiður ástand hér: installedPackageVersions.Count != 1sem mun alltaf vera satt. Oft gefur slík viðvörun til kynna rökræna villu í kóðanum og í öðrum tilfellum gefur það einfaldlega til kynna óþarfa athugun.

Viðvörun N7

Viðvörun greiningartækis: V3001 Það eru eins undirtjáningar 'commandArguments.contains("-apikey")' vinstra megin og hægra megin við '||' rekstraraðili. 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");
}

Forritarinn sem skrifaði þennan hluta kóðans afritaði og límdi síðustu tvær línurnar og gleymdi að breyta þeim. Vegna þessa gátu Chocolatey notendur ekki notað færibreytuna apikey nokkrar leiðir í viðbót. Svipað og færibreyturnar hér að ofan get ég boðið upp á eftirfarandi valkosti:

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

Copy-paste villur hafa mikla möguleika á að birtast fyrr eða síðar í hvaða verkefni sem er með mikið magn af frumkóða og eitt besta tólið til að berjast gegn þeim er truflanir.

PS Og eins og alltaf hefur þessi villa tilhneigingu til að birtast í lok marglínu ástands :). Sjá rit "Síðasta lína áhrif".

Viðvörun N8

Viðvörun greiningartækis: V3095 [CWE-476] 'installedPackage' hluturinn var notaður áður en hann var staðfestur gegn núll. Athugaðu línur: 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)
  {
    ....
  }
  ....
}

Klassísk mistök: hlutur fyrst uppsettur pakki er notað og síðan athugað fyrir null. Þessi greining segir okkur frá einu af tveimur vandamálum í forritinu: annað hvort uppsettur pakki aldrei jafn null, sem er vafasamt, og þá er ávísunin óþörf, eða við gætum hugsanlega fengið alvarlega villu í kóðanum - tilraun til að fá aðgang að núlltilvísun.

Ályktun

Þannig að við höfum tekið annað lítið skref - nú er notkun PVS-Studio orðin enn auðveldari og þægilegri. Ég vil líka segja að Chocolatey er góður pakkastjóri með fáar villur í kóðanum, sem gætu verið enn færri þegar PVS-Studio er notað.

Við bjóðum þér sækja og prófaðu PVS-Studio. Regluleg notkun á kyrrstöðugreiningartæki mun bæta gæði og áreiðanleika kóðans sem teymið þitt þróar og koma í veg fyrir marga zero day varnarleysi.

PS

Fyrir birtingu sendum við greinina til Chocolatey hönnuða og tóku þeir vel við henni. Við fundum ekkert mikilvægt, en þeim líkaði til dæmis við villuna sem við fundum tengda „api-key“ lyklinum.

PVS-Studio er nú í Chocolatey: athugar Chocolatey undir Azure DevOps

Ef þú vilt deila þessari grein með enskumælandi áhorfendum, vinsamlegast notaðu þýðingartengilinn: Vladislav Stolyarov. PVS-Studio er nú í súkkulaði: Athugar súkkulaði undir Azure DevOps.

Heimild: www.habr.com

Bæta við athugasemd