PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps
Aħna nkomplu nagħmlu l-użu ta 'PVS-Studio aktar konvenjenti. L-analizzatur tagħna issa huwa disponibbli f'Chocolatey, maniġer tal-pakketti għall-Windows. Aħna nemmnu li dan se jiffaċilita l-iskjerament ta 'PVS-Studio, b'mod partikolari, fis-servizzi cloud. Sabiex ma tmurx 'il bogħod, ejja niċċekkjaw il-kodiċi tas-sors tal-istess Chocolatey. Azure DevOps se jaġixxi bħala sistema CI.

Hawnhekk hawn lista tal-artikoli l-oħra tagħna dwar is-suġġett tal-integrazzjoni mas-sistemi tal-cloud:

Nagħtikom parir biex tagħti attenzjoni lill-ewwel artiklu dwar l-integrazzjoni ma 'Azure DevOps, peress li f'dan il-każ xi punti jitħallew barra sabiex ma jiġux duplikati.

Allura, l-eroj ta 'dan l-artikolu:

PVS-Istudjo hija għodda statika ta' analiżi tal-kodiċi mfassla biex tidentifika żbalji u vulnerabbiltajiet potenzjali fi programmi miktuba f'C, C++, C# u Java. Jimxi fuq sistemi Windows, Linux, u macOS ta’ 64 bit, u jista’ janalizza kodiċi ddisinjat għal pjattaformi ARM ta’ 32 bit, 64 bit u inkorporati. Jekk din hija l-ewwel darba li tipprova analiżi tal-kodiċi statiku biex tiċċekkja l-proġetti tiegħek, nirrakkomandaw li tiffamiljarizza ruħek magħhom artikolu dwar kif tara malajr l-aktar twissijiet interessanti tal-PVS-Studio u tevalwa l-kapaċitajiet ta 'din l-għodda.

Azure DevOps — sett ta’ servizzi tal-cloud li flimkien ikopru l-proċess ta’ żvilupp kollu. Din il-pjattaforma tinkludi għodod bħal Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, li jippermettulek tħaffef il-proċess tal-ħolqien ta’ softwer u ttejjeb il-kwalità tiegħu.

Chocolatey huwa maniġer tal-pakketti ta' sors miftuħ għall-Windows. L-għan tal-proġett huwa li awtomat iċ-ċiklu tal-ħajja tas-softwer kollu mill-installazzjoni sa l-aġġornament u d-diżinstallazzjoni fuq is-sistemi operattivi Windows.

Dwar l-użu Chocolatey

Tista 'tara kif tinstalla l-maniġer tal-pakkett innifsu f'dan rabta. Dokumentazzjoni kompleta għall-installazzjoni tal-analizzatur hija disponibbli fuq rabta Ara l-Installazzjoni billi tuża t-taqsima tal-maniġer tal-pakketti Chocolatey. Se nirrepeti fil-qosor xi punti minn hemm.

Kmand biex tinstalla l-aħħar verżjoni tal-analizzatur:

choco install pvs-studio

Kmand biex tinstalla verżjoni speċifika tal-pakkett PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

B'mod awtomatiku, il-qalba tal-analizzatur biss, il-komponent Core, hija installata. Il-bnadar l-oħra kollha (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) jistgħu jiġu mgħoddija bl-użu --package-parameters.

Eżempju ta' kmand li jinstalla analizzatur bi plugin għal Visual Studio 2019:

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

Issa ejja nħarsu lejn eżempju ta 'użu konvenjenti ta' l-analizzatur taħt Azure DevOps.

aġġustament

Ħa nfakkarkom li hemm sezzjoni separata dwar kwistjonijiet bħalma huma r-reġistrazzjoni ta' kont, il-ħolqien ta' Pipeline tal-Bini u s-sinkronizzazzjoni tal-kont tiegħek ma' proġett li jinsab fir-repożitorju ta' GitHub. artikolu. Is-setup tagħna se jibda immedjatament bil-kitba ta 'fajl ta' konfigurazzjoni.

L-ewwel, ejja nwaqqfu grillu tat-tnedija, li jindika li nniedu biss għal bidliet fi kaptan fergħa:

trigger:
- master

Sussegwentement irridu nagħżlu magna virtwali. Għalissa se jkun aġent ospitat minn Microsoft mal-Windows Server 2019 u Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Ejja ngħaddu għall-korp tal-fajl tal-konfigurazzjoni (blokk passi). Minkejja l-fatt li ma tistax tinstalla softwer arbitrarju f'magna virtwali, ma żidtx kontenitur Docker. Nistgħu nżidu Chocolatey bħala estensjoni għal Azure DevOps. Biex tagħmel dan, ejja mmorru rabta. Ikklikkja Ġġibu b'xejn. Sussegwentement, jekk inti diġà awtorizzat, sempliċement agħżel il-kont tiegħek, u jekk le, imbagħad agħmel l-istess ħaġa wara l-awtorizzazzjoni.

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Hawnhekk għandek bżonn tagħżel fejn se nżidu l-estensjoni u ikklikkja l-buttuna Installa.

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Wara l-installazzjoni b'suċċess, ikklikkja Ipproċedi għall-organizzazzjoni:

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Issa tista 'tara l-mudell għall-kompitu Chocolatey fit-tieqa kompiti meta teditja fajl ta' konfigurazzjoni azure-pipelines.yml:

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Ikklikkja fuq Chocolatey u ara lista ta' oqsma:

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Hawnhekk irridu nagħżlu jinstallaw fil-qasam mat-timijiet. IN Isem tal-Fajl Nuspec indika l-isem tal-pakkett meħtieġ – pvs-studio. Jekk ma tispeċifikax il-verżjoni, tiġi installata l-aħħar waħda, li jaqbel magħna kompletament. Ejja agħfas il-buttuna żid u se naraw il-kompitu ġġenerat fil-fajl tal-konfigurazzjoni.

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

Sussegwentement, ejja ngħaddu għall-parti prinċipali tal-fajl tagħna:

- task: CmdLine@2
  inputs:
    script: 

Issa għandna bżonn noħolqu fajl bil-liċenzja tal-analizzatur. Hawn PVSNAME и PVSKEY – ismijiet ta’ varjabbli li l-valuri tagħhom aħna nispeċifikaw fis-settings. Huma ser jaħżnu l-login PVS-Studio u ċ-ċavetta tal-liċenzja. Biex tissettja l-valuri tagħhom, iftaħ il-menu Varjabbli-> Varjabbli ġdid. Ejja noħolqu varjabbli PVSNAME għall-login u PVSKEY għaċ-ċavetta tal-analizzatur. Tinsiex tiċċekkja l-kaxxa Żomm dan il-valur sigriet għall- PVSKEY. Kodiċi tal-kmand:

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

Ejja nibnu l-proġett billi tuża l-fajl BAT li jinsab fir-repożitorju:

сall build.bat

Ejja noħolqu folder fejn se jinħażnu fajls bir-riżultati tal-analizzatur:

сall mkdir PVSTestResults

Ejja nibdew nanalizzaw il-proġett:

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

Aħna nikkonverti r-rapport tagħna għal format html billi tuża l-utilità PlogСonverter:

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

Issa għandek bżonn toħloq kompitu sabiex tkun tista 'ttella' r-rapport.

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

Il-fajl tal-konfigurazzjoni komplut jidher bħal dan:

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

Ejja ikklikkja Save-> Save-> Run biex imexxi l-kompitu. Ejja tniżżel ir-rapport billi tmur fit-tab tal-kompiti.

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Il-proġett Chocolatey fih biss 37615 linja ta 'kodiċi C#. Ejja nħarsu lejn uħud mill-iżbalji misjuba.

Riżultati tat-Test

Twissija N1

Twissija tal-analizzatur: V3005 Il-varjabbli 'Fornitur' hija assenjata lilha nnifisha. CrytpoHashProviderSpecs.cs 38

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

L-analizzatur skopra assenjazzjoni tal-varjabbli għalih innifsu, li ma jagħmilx sens. Ħafna probabbli, minflok waħda minn dawn il-varjabbli għandu jkun hemm xi waħda oħra. Ukoll, jew dan huwa typo, u l-assenjazzjoni żejda tista 'sempliċement titneħħa.

Twissija N2

Twissija tal-analizzatur: V3093 [CWE-480] L-operatur '&' jevalwa ż-żewġ operandi. Forsi operatur '&&' ta' short-circuit għandu jintuża minflok. 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 tal-operatur & mill-operatur && hija li jekk in-naħa tax-xellug tal-espressjoni hija falza, allura n-naħa tal-lemin xorta se tiġi kkalkulata, li f'dan il-każ jimplika sejħiet ta 'metodu mhux meħtieġa system.directory_exists.

Fil-framment meqjus, dan huwa difett minuri. Iva, din il-kundizzjoni tista 'tiġi ottimizzata billi tissostitwixxi l-operatur & bl-operatur &&, iżda mil-lat prattiku, dan ma jaffettwa xejn. Madankollu, f'każijiet oħra, il-konfużjoni bejn & u && tista' tikkawża problemi serji meta n-naħa tal-lemin tal-espressjoni tiġi ttrattata b'valuri skorretti/invalidi. Per eżempju, fil-ġbir ta 'żbalji tagħna, identifikati bl-użu tad-dijanjostiku V3093, hemm dan il-każ:

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

Anke jekk l-indiċi k mhix korretta, se tintuża biex taċċessa element ta’ firxa. Bħala riżultat, se titneħħa eċċezzjoni IndexOutOfRangeException.

Twissijiet N3, N4

Twissija tal-analizzatur: V3022 [CWE-571] L-espressjoni 'shortPrompt' hija dejjem vera. InteractivePrompt.cs 101
Twissija tal-analizzatur: V3022 [CWE-571] L-espressjoni 'shortPrompt' hija dejjem 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
    ....
  }
  ....
}

F'dan il-każ, hemm loġika stramba wara l-operat tal-operatur ternarju. Ejja nagħtu ħarsa aktar mill-qrib: jekk il-kundizzjoni li mmarkajt bin-numru 1 tiġi sodisfatta, allura ngħaddu għall-kundizzjoni 2, li hija dejjem veru, li jfisser li se tiġi esegwita l-linja 3. Jekk il-kundizzjoni 1 tirriżulta li hija falza, allura nimxu għal-linja mmarkata bin-numru 4, il-kundizzjoni li fiha hija wkoll dejjem veru, li jfisser li se tiġi eżegwita linja 5. Għalhekk, il-kundizzjonijiet immarkati bil-kumment 0 qatt mhu se jiġu sodisfatti, li jista 'ma jkunx eżattament il-loġika ta' operazzjoni li l-programmatur stenna.

Twissija N5

Twissija tal-analizzatur: V3123 [CWE-783] Forsi l-operatur '?:' jaħdem b'mod differenti milli kien mistenni. Il-prijorità tagħha hija inqas mill-prijorità ta' operaturi oħra fil-kundizzjoni tagħha. 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);
  }
}

Id-dijanjostika ħadmet għal-linja:

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

Peress li l-varjabbli j ftit linji hawn fuq huwa inizjalizzat għal żero, l-operatur ternarju se jirritorna l-valur falza. Minħabba din il-kundizzjoni, il-korp tal-linja se jiġi esegwit darba biss. Jidhirli li din il-biċċa kodiċi ma taħdimx xejn kif maħsub il-programmer.

Twissija N6

Twissija tal-analizzatur: V3022 [CWE-571] L-espressjoni 'installedPackageVersions.Count != 1' hija dejjem 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);
    }
    ....
  }
  ....
}

Hemm kundizzjoni stramba mnaqqsa hawn: installPackageVersions.Count != 1li dejjem se jkun veru. Ħafna drabi twissija bħal din tindika żball loġiku fil-kodiċi, u f'każijiet oħra sempliċement tindika verifika żejda.

Twissija N7

Twissija tal-analizzatur: V3001 Hemm subespressjonijiet identiċi 'commandArguments.contains("-apikey")' fuq ix-xellug u fuq il-lemin tal-'||' operatur. 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");
}

Il-programmatur li kiteb din it-taqsima tal-kodiċi kkupja u pejst l-aħħar żewġ linji u nesa jeditjahom. Minħabba dan, l-utenti Chocolatey ma setgħux japplikaw il-parametru apikey ftit modi oħra. Simili għall-parametri ta 'hawn fuq, nista' noffri l-għażliet li ġejjin:

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

L-iżbalji tal-copy-paste għandhom ċans kbir li jidhru illum jew għada fi kwalunkwe proġett b'ammont kbir ta 'kodiċi tas-sors, u waħda mill-aħjar għodod biex tiġġieledhom hija l-analiżi statika.

PS U bħal dejjem, dan l-iżball għandu tendenza li jidher fl-aħħar ta 'kondizzjoni b'ħafna linji :). Ara l-pubblikazzjoni "L-aħħar effett tal-linja".

Twissija N8

Twissija tal-analizzatur: V3095 [CWE-476] L-oġġett 'installedPackage' intuża qabel ma ġie vverifikat kontra null. Iċċekkja linji: 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)
  {
    ....
  }
  ....
}

Żball klassiku: oġġett l-ewwel Pakkett installat jintuża u mbagħad iċċekkjat għal null. Din id-dijanjostika tgħidilna dwar waħda minn żewġ problemi fil-programm: jew Pakkett installat qatt ugwali null, li huwa dubjuż, u mbagħad il-kontroll ikun żejjed, jew nistgħu potenzjalment niksbu żball serju fil-kodiċi - tentattiv biex naċċessaw referenza nulla.

Konklużjoni

Allura ħadna pass żgħir ieħor - issa l-użu ta 'PVS-Studio sar saħansitra aktar faċli u aktar konvenjenti. Nixtieq ngħid ukoll li Chocolatey huwa maniġer tal-pakkett tajjeb b'numru żgħir ta 'żbalji fil-kodiċi, li jista' jkun saħansitra inqas meta tuża PVS-Studio.

Nistednukom download u pprova PVS-Studio. L-użu regolari ta 'analizzatur statiku se jtejjeb il-kwalità u l-affidabbiltà tal-kodiċi li jiżviluppa t-tim tiegħek u jgħin biex jipprevjeni ħafna vulnerabbiltajiet ta' jum żero.

PS

Qabel il-pubblikazzjoni, bgħatna l-artiklu lill-iżviluppaturi Chocolatey, u rċevewh tajjeb. Aħna ma sibna xejn kritiku, iżda huma, pereżempju, għoġbu l-bug li sibna relatat maċ-ċavetta "api-key".

PVS-Studio issa jinsab f'Chocolatey: jiċċekkja Chocolatey minn taħt Azure DevOps

Jekk trid taqsam dan l-artikolu ma 'udjenza li titkellem bl-Ingliż, jekk jogħġbok uża l-link tat-traduzzjoni: Vladislav Stolyarov. PVS-Studio Is Now in Chocolatey: Iċċekkja Chocolatey taħt Azure DevOps.

Sors: www.habr.com

Żid kumment