PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps
Mēs turpinām padarÄ«t PVS-Studio lietoÅ”anu ērtāku. MÅ«su analizators tagad ir pieejams Chocolatey, Windows pakotņu pārvaldniekā. Mēs uzskatām, ka tas atvieglos PVS-Studio izvietoÅ”anu, jo Ä«paÅ”i mākoņpakalpojumos. Lai netiktu tālu, pārbaudÄ«sim tā paÅ”a Chocolatey pirmkodu. Azure DevOps darbosies kā CI sistēma.

Šeit ir saraksts ar citiem mūsu rakstiem par integrāciju ar mākoņsistēmām:

Es iesaku pievērst uzmanÄ«bu pirmajam rakstam par integrāciju ar Azure DevOps, jo Å”ajā gadÄ«jumā daži punkti tiek izlaisti, lai tie netiktu dublēti.

Tātad, Ŕī raksta varoņi:

PVS-studija ir statiskā koda analÄ«zes rÄ«ks, kas izstrādāts, lai identificētu kļūdas un iespējamās ievainojamÄ«bas programmās, kas rakstÄ«tas C, C++, C# un Java valodās. Darbojas 64 bitu Windows, Linux un macOS sistēmās un var analizēt kodu, kas paredzēts 32 bitu, 64 bitu un iegultajām ARM platformām. Ja Ŕī ir pirmā reize, kad mēģināt pārbaudÄ«t statisko kodu analÄ«zi, lai pārbaudÄ«tu savus projektus, iesakām iepazÄ«ties ar to rakstu par to, kā ātri apskatÄ«t interesantākos PVS-Studio brÄ«dinājumus un novērtēt Ŕī rÄ«ka iespējas.

Azure DevOps ā€” mākoņpakalpojumu kopums, kas kopÄ«gi aptver visu izstrādes procesu. Å ajā platformā ir iekļauti tādi rÄ«ki kā Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, kas ļauj paātrināt programmatÅ«ras izveides procesu un uzlabot tās kvalitāti.

Chocolatey ir atvērtā koda pakotņu pārvaldnieks operētājsistēmai Windows. Projekta mērÄ·is ir automatizēt visu programmatÅ«ras dzÄ«ves ciklu no instalÄ“Å”anas lÄ«dz atjaunināŔanai un atinstalÄ“Å”anai Windows operētājsistēmās.

Par Chocolatey lietoŔanu

Å eit varat redzēt, kā instalēt paÅ”u pakotņu pārvaldnieku saite. Visa analizatora uzstādÄ«Å”anas dokumentācija ir pieejama vietnē saite Skatiet sadaļu InstalÄ“Å”ana, izmantojot Chocolatey pakotņu pārvaldnieku. Es Ä«si atkārtoÅ”u dažus punktus no turienes.

Komanda, lai instalētu jaunāko analizatora versiju:

choco install pvs-studio

Komanda, lai instalētu noteiktu PVS-Studio pakotnes versiju:

choco install pvs-studio --version=7.05.35617.2075

Pēc noklusējuma ir instalēts tikai analizatora kodols, Core komponents. Visus pārējos karogus (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) var nodot, izmantojot --package-parameters.

Piemērs komandai, kas instalēs analizatoru ar Visual Studio 2019 spraudni:

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

Tagad apskatÄ«sim piemēru par ērtas analizatora izmantoÅ”anu zem Azure DevOps.

koriģēŔana

AtgādināŔu, ka ir atseviŔķa sadaļa par tādiem jautājumiem kā konta reÄ£istrÄ“Å”ana, Build Pipeline izveide un konta sinhronizÄ“Å”ana ar projektu, kas atrodas GitHub repozitorijā. raksts. MÅ«su iestatÄ«Å”ana nekavējoties sāksies ar konfigurācijas faila rakstÄ«Å”anu.

Vispirms iestatÄ«sim palaiÅ”anas aktivizētāju, kas norāda, ka mēs palaižam tikai, lai veiktu izmaiņas meistars filiāle:

trigger:
- master

Tālāk mums ir jāizvēlas virtuālā maŔīna. Pagaidām tas bÅ«s Microsoft mitināts aÄ£ents ar Windows Server 2019 un Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Pārejam uz konfigurācijas faila pamattekstu (block pasākumi). Neskatoties uz to, ka virtuālajā maŔīnā nevar instalēt patvaļīgu programmatÅ«ru, es nepievienoju Docker konteineru. Mēs varam pievienot Chocolatey kā Azure DevOps paplaÅ”inājumu. Lai to izdarÄ«tu, pāriesim uz saite. KlikŔķis IegÅ«stiet to bez maksas. Tālāk, ja esat jau pilnvarots, vienkārÅ”i atlasiet savu kontu un, ja nē, pēc autorizācijas dariet to paÅ”u.

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Å eit jums ir jāizvēlas vieta, kur pievienosim paplaÅ”inājumu, un noklikŔķiniet uz pogas instalēt.

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Pēc veiksmÄ«gas instalÄ“Å”anas noklikŔķiniet uz Pārejiet uz organizāciju:

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Tagad logā varat redzēt Chocolatey uzdevuma veidni uzdevumi rediģējot konfigurācijas failu azure-pipelines.yml:

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

NoklikŔķiniet uz Chocolatey un skatiet lauku sarakstu:

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Å eit mums ir jāizvēlas uzstādÄ«t laukumā ar komandām. IN Nuspec faila nosaukums norādi vajadzÄ«gās paketes nosaukumu ā€“ pvs-studio. Ja nenorādÄ«siet versiju, tiks instalēta jaunākā, kas mums pilnÄ«bā atbilst. NospiedÄ«sim pogu pievienot un mēs redzēsim Ä£enerēto uzdevumu konfigurācijas failā.

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

Tālāk pāriesim uz mūsu faila galveno daļu:

- task: CmdLine@2
  inputs:
    script: 

Tagad mums ir jāizveido fails ar analizatora licenci. Å eit PVSNAME Šø PVSKEY ā€“ mainÄ«go nosaukumi, kuru vērtÄ«bas norādām iestatÄ«jumos. Tie saglabās PVS-Studio pieteikuminformāciju un licences atslēgu. Lai iestatÄ«tu to vērtÄ«bas, atveriet izvēlni MainÄ«gie-> Jauns mainÄ«gais. Izveidosim mainÄ«gos PVSNAME par pieteikÅ”anos un PVSKEY analizatora atslēgai. Neaizmirstiet atzÄ«mēt izvēles rÅ«tiņu Saglabājiet Å”o vērtÄ«bu noslēpumā par PVSKEY. Komandas kods:

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

Veidosim projektu, izmantojot repozitorijā esoŔo bat failu:

сall build.bat

Izveidosim mapi, kurā tiks saglabāti faili ar analizatora rezultātiem:

сall mkdir PVSTestResults

Sāksim analizēt projektu:

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

Mēs pārveidojam savu pārskatu html formātā, izmantojot utilÄ«tu PlogŠ”onverter:

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

Tagad jums ir jāizveido uzdevums, lai varētu augÅ”upielādēt pārskatu.

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

Pilns konfigurācijas fails izskatās Ŕādi:

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

NoklikŔķināsim Saglabāt->Saglabāt->Palaist lai izpildÄ«tu uzdevumu. Lejupielādēsim pārskatu, atverot cilni Uzdevumi.

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Chocolatey projektā ir tikai 37615 C# koda rindas. Apskatīsim dažas no atrastajām kļūdām.

Testa rezultāti

Brīdinājums N1

Analizatora brÄ«dinājums: V3005 MainÄ«gais ā€œProviderā€ tiek pieŔķirts sev. CrytpoHashProviderSpecs.cs 38

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

Analizators atklāja mainÄ«gā pieŔķirÅ”anu sev, kam nav jēgas. Visticamāk, viena no Å”iem mainÄ«gajiem vietā vajadzētu bÅ«t kādam citam. Nu, vai arÄ« Ŕī ir drukas kļūda, un papildu uzdevumu var vienkārÅ”i noņemt.

Brīdinājums N2

Analizatora brÄ«dinājums: V3093 [CWE-480] Operators '&' novērtē abus operandus. VarbÅ«t tā vietā jāizmanto Ä«ssavienojuma operators &&. 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;
  }
}

Operatoru atŔķirÄ«ba & no operatora && ir tas, ka, ja izteiksmes kreisā puse ir nepatiess, tad joprojām tiks aprēķināta labā puse, kas Å”ajā gadÄ«jumā nozÄ«mē nevajadzÄ«gus metožu izsaukumus system.directory_exists.

AplÅ«kotajā fragmentā tas ir neliels trÅ«kums. Jā, Å”o nosacÄ«jumu var optimizēt, aizstājot & operatoru ar && operatoru, taču no praktiskā viedokļa tas neko neietekmē. Tomēr citos gadÄ«jumos & un && sajaukÅ”ana var radÄ«t nopietnas problēmas, ja izteiksmes labā puse tiek apstrādāta ar nepareizām/nederÄ«gām vērtÄ«bām. Piemēram, mÅ«su kļūdu kolekcijā identificēts, izmantojot V3093 diagnostiku, ir Ŕāds gadÄ«jums:

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

Pat ja indekss k ir nepareizs, tas tiks izmantots, lai piekļūtu masīva elementam. Rezultātā tiks izmests izņēmums IndexOutOfRangeException.

Brīdinājumi N3, N4

Analizatora brÄ«dinājums: V3022 [CWE-571] Izteiksme ā€œshortPromptā€ vienmēr ir patiesa. InteractivePrompt.cs 101
Analizatora brÄ«dinājums: V3022 [CWE-571] Izteiksme ā€œshortPromptā€ vienmēr ir patiesa. 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
    ....
  }
  ....
}

Å ajā gadÄ«jumā trÄ«skārŔā operatora darbÄ«bas pamatā ir dÄ«vaina loÄ£ika. PaskatÄ«simies tuvāk: ja nosacÄ«jums, ko atzÄ«mēju ar 1. numuru, ir izpildÄ«ts, tad mēs pāriesim uz nosacÄ«jumu 2, kas vienmēr ir patiess, kas nozÄ«mē, ka tiks izpildÄ«ta rinda 3. Ja nosacÄ«jums 1 izrādÄ«sies nepatiess, tad mēs pāriesim uz rindu, kas apzÄ«mēta ar numuru 4, kurā nosacÄ«jums arÄ« vienmēr ir patiess, kas nozÄ«mē, ka tiks izpildÄ«ta rinda 5. Tādējādi nosacÄ«jumi, kas atzÄ«mēti ar komentāru 0, nekad netiks izpildÄ«ti, kas var nebÅ«t tieÅ”i tāda darbÄ«bas loÄ£ika, kādu programmētājs gaidÄ«ja.

Brīdinājums N5

Analizatora brīdinājums: V3123 [CWE-783] Iespējams, operators "?:" darbojas savādāk, nekā bija paredzēts. Tā prioritāte ir zemāka par citu operatoru prioritāti savā stāvoklī. 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);
  }
}

Diagnostika strādāja līnijai:

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

KopÅ” mainÄ«gā j dažas rindas augstāk tiek inicializēta uz nulli, trÄ«skārÅ”ais operators atgriezÄ«s vērtÄ«bu nepatiess. Å Ä« nosacÄ«juma dēļ cilpas pamatteksts tiks izpildÄ«ts tikai vienu reizi. Man Ŕķiet, ka Å”is koda fragments nemaz nedarbojas tā, kā programmētājs bija iecerējis.

Brīdinājums N6

Analizatora brÄ«dinājums: V3022 [CWE-571] Izteiksme ā€œinstalledPackageVersions.Count != 1ā€ vienmēr ir patiesa. 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);
    }
    ....
  }
  ....
}

Å eit ir dÄ«vains ligzdots nosacÄ«jums: InstallPackageVersions.Count != 1kas bÅ«s vienmēr patiess. Bieži vien Ŕāds brÄ«dinājums norāda uz loÄ£isku kļūdu kodā, bet citos gadÄ«jumos tas vienkārÅ”i norāda uz lieku pārbaudi.

Brīdinājums N7

Analizatora brīdinājums: V3001 Ir identiskas apakŔizteiksmes 'commandArguments.contains("-apikey")' pa kreisi un pa labi no '||' operators. 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");
}

Programmētājs, kurÅ” uzrakstÄ«ja Å”o koda sadaļu, nokopēja un ielÄ«mēja pēdējās divas rindiņas un aizmirsa tās rediģēt. Å Ä« iemesla dēļ Chocolatey lietotāji nevarēja lietot parametru apikey vēl pāris veidi. LÄ«dzÄ«gi iepriekÅ” minētajiem parametriem es varu piedāvāt Ŕādas iespējas:

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

KopÄ“Å”anas un ielÄ«mÄ“Å”anas kļūdām ir liela iespēja agrāk vai vēlāk parādÄ«ties jebkurā projektā ar lielu avota koda daudzumu, un viens no labākajiem rÄ«kiem to novērÅ”anai ir statiskā analÄ«ze.

PS Un kā vienmēr, Ŕī kļūda mēdz parādÄ«ties vairāku rindu nosacÄ«juma beigās :). SkatÄ«t publikāciju "Pēdējās rindas efekts".

Brīdinājums N8

Analizatora brīdinājums: V3095 [CWE-476] Objekts "installedPackage" tika izmantots, pirms tas tika pārbaudīts pret nulli. Kontrolrindas: 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)
  {
    ....
  }
  ....
}

Klasiska kļūda: objekts vispirms instalēta pakotne tiek izmantots un pēc tam pārbaudÄ«ts nulle. Å Ä« diagnostika informē par vienu no divām programmas problēmām: vai nu instalēta pakotne nekad nav vienlÄ«dzÄ«gs nulle, kas ir apÅ”aubāms, un tad pārbaude ir lieka, pretējā gadÄ«jumā kodā var rasties nopietna kļūda - mēģinājums piekļūt nulles atsaucei.

Secinājums

Tāpēc esam spēruÅ”i vēl vienu nelielu soli ā€“ tagad PVS-Studio lietoÅ”ana ir kļuvusi vēl vienkārŔāka un ērtāka. Vēlos arÄ« teikt, ka Chocolatey ir labs pakotņu pārvaldnieks ar nelielu skaitu kļūdu kodā, kuru varētu bÅ«t vēl mazāk, lietojot PVS-Studio.

Mēs jÅ«s aicinām download un izmēģiniet PVS-Studio. Regulāra statiskā analizatora izmantoÅ”ana uzlabos jÅ«su komandas izstrādātā koda kvalitāti un uzticamÄ«bu un palÄ«dzēs novērst daudzas nulles dienas ievainojamÄ«bas.

PS

Pirms publicÄ“Å”anas rakstu nosÅ«tÄ«jām Chocolatey izstrādātājiem, un viņi to labi saņēma. Mēs neatradām neko kritisku, taču viņiem, piemēram, patika atrastā kļūda saistÄ«bā ar ā€œapi-keyā€ atslēgu.

PVS-Studio tagad ir pieejams Chocolatey: pārbauda Chocolatey no Azure DevOps

Ja vēlaties dalÄ«ties ar Å”o rakstu ar angliski runājoÅ”u auditoriju, lÅ«dzu, izmantojiet tulkoÅ”anas saiti: Vladislavs Stoļarovs. PVS-Studio tagad ir pieejams Chocolatey: Chocolatey pārbaude pakalpojumā Azure DevOps.

Avots: www.habr.com

Pievieno komentāru