PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike
Em berdewam dikin ku karanîna PVS-Studio hêsantir bikin. Analîzatorê me naha li Chocolatey, rêveberek pakêtê ya Windows-ê heye. Em bawer dikin ku ev ê bicîhkirina PVS-Studio, bi taybetî, di karûbarên cloudê de hêsantir bike. Ji bo ku em dûr neçin, bila koda çavkaniyê ya heman Chocolatey kontrol bikin. Azure DevOps dê wekî pergalek CI tevbigere.

Li vir navnîşek gotarên me yên din ên li ser mijara yekbûna bi pergalên ewr re heye:

Ez ji we re şîret dikim ku hûn bala xwe bidin gotara yekem a di derbarê entegrasyonê de bi Azure DevOps re, ji ber ku di vê rewşê de hin xal têne derxistin da ku neyên dubare kirin.

Ji ber vê yekê, lehengên vê gotarê:

PVS Studio amûrek analîzkirina koda statîk e ku ji bo destnîşankirina xeletî û qelsiyên potansiyel ên di bernameyên ku bi C, C++, C# û Java hatine nivîsandin de hatî çêkirin. Li ser pergalên 64-bit Windows, Linux, û macOS-ê dixebite, û dikare koda ku ji bo platformên ARM-ê yên 32-bit, 64-bit, û bicîbûyî hatine çêkirin analîz bike. Ger ev cara yekem e ku hûn analîza koda statîkî diceribînin da ku projeyên xwe kontrol bikin, em pêşniyar dikin ku hûn xwe pê nas bikin tişt ka meriv çawa zû hişyariyên PVS-Studio yên herî balkêş temaşe dike û kapasîteyên vê amûrê binirxîne.

DevOps Azure - komek karûbarên cloudê ku bi hev re tevahiya pêvajoya pêşkeftinê vedigire. Vê platformê amûrên wekî Azure Pipelines, Boards Azure, Artifacts Azure, Azure Repos, Planên Testê Azure vedihewîne, ku dihêle hûn pêvajoya afirandina nermalavê bilezînin û kalîteya wê baştir bikin.

Chocolate ji bo Windows-ê rêveberek pakêtê ya çavkaniya vekirî ye. Armanca projeyê ew e ku ji sazkirinê heya nûvekirin û rakirina pergalên xebitandinê yên Windows-ê tevahiya çerxa jiyanê ya nermalavê otomatîk bike.

Di derbarê karanîna Chocolatey de

Hûn dikarin li ser vê yekê bibînin ka meriv çawa rêveberê pakêtê bixwe saz dike link. Belgeyên bêkêmasî yên ji bo sazkirina analîzer li vir heye link Binêre Sazkirinê bi karanîna beşa rêveberê pakêtê ya Chocolatey. Ez ê ji wir bi kurtasî çend xalan dubare bikim.

Fermana sazkirina guhertoya herî dawî ya analîzer:

choco install pvs-studio

Fermana sazkirina guhertoyek taybetî ya pakêta PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Ji hêla xwerû, tenê bingeha analîzer, pêkhateya Core, tê saz kirin. Hemî alayên din (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) dikarin bi karanîna -parametreyên pakêtê werin derbas kirin.

Nimûneyek fermanek ku dê analîzek bi pêvekek ji bo Visual Studio 2019 saz bike:

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

Naha em li mînakek karanîna hêsan a analîzerê di bin Azure DevOps de binêrin.

ligorî

Bihêle ku ez ji we re bi bîr bînim ku di derheqê mijarên wekî qeydkirina hesabek, afirandina Build Pipeline û hevdengkirina hesabê we bi projeyek ku di depoya GitHub-ê de ye, beşek cûda heye. gotara. Sazkirina me dê tavilê bi nivîsandina pelek vesazkirinê dest pê bike.

Pêşîn, bila em tetikek destpêkirinê saz bikin, ku destnîşan dike ku em tenê ji bo guhertinên di nav de dest pê dikin mamoste gûlî:

trigger:
- master

Piştre em hewce ne ku makîneyek virtual hilbijêrin. Heya nuha ew ê bi Windows Server 2019 û Visual Studio 2019 re nûnerek mêvandar a Microsoft-ê be:

pool:
  vmImage: 'windows-latest'

Ka em biçin ser bedena pelê veavakirinê (blok gavên). Tevî vê rastiyê ku hûn nekarin nermalava kêfî li makîneyek virtual saz bikin, min konteynirek Docker zêde nekir. Em dikarin Chocolatey wekî dirêjkirinek ji bo Azure DevOps zêde bikin. Ji bo vê yekê, em biçin link. Bikirtînin Xwe belaş bikin. Dûv re, heke hûn jixwe destûrdar in, tenê hesabê xwe hilbijêrin, û heke na, wê hingê piştî destûrnameyê heman tiştî bikin.

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Li vir hûn hewce ne ku hilbijêrin ku em ê pêvekê lê zêde bikin û bişkojkê bikirtînin Lêkirin.

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Piştî sazkirina serkeftî, bikirtînin Ber bi rêxistinê ve biçin:

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Naha hûn dikarin şablonê ji bo peywira Chocolatey di pencereyê de bibînin erkên dema ku pelek vesazkirinê diguherîne azure-pipelines.yml:

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Li Chocolatey bikirtînin û navnîşek qadan bibînin:

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Li vir divê em hilbijêrin lêkirin li qadê bi tîmên. LI Navê Pelê Nuspec navê pakêta pêwîst destnîşan bikin - pvs-studio. Ger hûn guhertoyê diyar nekin, ya herî dawî dê were saz kirin, ku bi tevahî li gorî me ye. Ka em bişkojê bixin lêzêdekirin û em ê di pelê veavakirinê de peywira hatî çêkirin bibînin.

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

Piştre, em biçin beşa sereke ya pelê xwe:

- task: CmdLine@2
  inputs:
    script: 

Naha em hewce ne ku pelek bi lîsansa analîstê biafirînin. Vir PVSNAME и PVSKEY - navên guhêrbarên ku em nirxên wan di mîhengan de diyar dikin. Ew ê têketin û mifteya lîsansê ya PVS-Studio hilînin. Ji bo danîna nirxên wan, menuyê vekin Guherbar-> Guherbara Nû. Werin em guherbaran biafirînin PVSNAME ji bo têketinê û PVSKEY ji bo mifteya analîzerê. Ji bîr nekin ku qutikê kontrol bikin Vê nirxê veşartî biparêze bo PVSKEY. Koda fermanê:

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

Ka em projeyê bi karanîna pelê batê ya ku di depoyê de ye ava bikin:

сall build.bat

Ka em peldankek biafirînin ku pelên bi encamên analîzkerê dê werin hilanîn:

сall mkdir PVSTestResults

Ka em dest bi analîzkirina projeyê bikin:

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

Em rapora xwe bi karanîna PlogСonverter veguherînin forma html:

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

Naha hûn hewce ne ku peywirek çêbikin da ku hûn raporê bar bikin.

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

Tevahiya pelê veavakirinê wiha xuya dike:

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

Werin em bitikînin Save-> Save-> Run ku peywirê bimeşîne. Ka em raporê bi çûna tabloya peywiran dakêşin.

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Projeya Chocolatey tenê 37615 rêzikên koda C# dihewîne. Ka em li hin xeletiyên hatine dîtin binêrin.

Encamên testê

Hişyarî N1

Hişyariya analyzer: V3005 Guherbara 'Pêşkêşker' ji xwe re tê veqetandin. CrytpoHashProviderSpecs.cs 38

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

Analîzker peywirek guhêrbar ji xwe re kifş kir, ku ne wate ye. Bi îhtîmaleke mezin, li şûna yek ji van guherbaran divê yekî din hebe. Belê, an ev xeletiyek tîpî ye, û peywira zêde dikare bi tenê were rakirin.

Hişyarî N2

Hişyariya analyzer: V3093 [CWE-480] Operatorê '&' her du operandeyan dinirxîne. Dibe ku di şûna wê de operatorek '&&' ya kurt-circuit were bikar anîn. 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;
  }
}

Cûdahiya operator & ji operator && e ku eger aliyê çepê yên îfadeyê ye şaş, wê hingê dê aliyê rast hîn jî were hesibandin, ku di vê rewşê de bangên rêbazê yên nepêwist tê wateya system.directory_exists.

Di beşê ku tê nirxandin de, ev xeletiyek piçûk e. Erê, ev rewş dikare bi guheztina operatorê bi && ve were xweşbîn kirin, lê ji hêla pratîkî ve, ev yek bandorê li tiştekî nake. Lêbelê, di rewşên din de, tevliheviya di navbera & û && de dikare bibe sedema pirsgirêkên cidî dema ku aliyê rastê yê bilêvkirinê bi nirxên çewt/nederbasdar were derman kirin. Mînakî, di berhevoka xeletiya me de, bi karanîna teşhîsa V3093 ve hatî nas kirin, ev rewş heye:

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

Tevî ku index k nerast e, ew ê ji bo gihîştina hêmanek rêzê were bikar anîn. Wekî encamek, îstîsnayek dê were avêtin IndexOutOfRangeException.

Hişyarî N3, N4

Hişyariya analyzer: V3022 [CWE-571] Daxuyaniya 'kurtPrompt' her gav rast e. InteractivePrompt.cs 101
Hişyariya analyzer: V3022 [CWE-571] Daxuyaniya 'kurtPrompt' her gav rast e. 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
    ....
  }
  ....
}

Di vê rewşê de, mantiqek ecêb li pişt operasyona operatorê sêdar heye. Ka em ji nêz ve lê binêre: heke şerta ku min bi hejmara 1 nîşan kir pêk hat, wê hingê em ê biçin ser şerta 2, ku her gav e. rast, ku tê wê maneyê rêza 3 were cîbicîkirin. Ger şerta 1 derew derkeve, wê gavê em ê biçin rêza ku bi hejmara 4 hatiye nîşankirin, rewşa ku tê de jî her dem e. rast, ku tê wateya rêza 5. Ji ber vê yekê, şertên ku bi şîroveya 0 hatine nîşankirin qet nayên cîbicîkirin, ku dibe ku tam ne mantiqa xebatê ya ku bernameçêker hêvî dikir be.

Hişyarî N5

Hişyariya analyzer: V3123 [CWE-783] Dibe ku operatorê '?:' ji ya ku dihat hêvîkirin bi rengek cûda dixebite. Pêşengiya wê di rewşa xwe de ji pêşengiya operatorên din kêmtir e. 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);
  }
}

Teşhîs ji bo rêzê xebitî:

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

Ji ber ku guherbar j çend rêzên li jor ji bo sifirê dest pê kirin, operatorê sêalî dê nirxê vegerîne şaş. Ji ber vê rewşê, laşê loopê dê tenê carekê were darve kirin. Ji min re xuya dike ku ev perçeya kodê bi tevahî wekî ku bernameçêker dixwest naxebite.

Hişyarî N6

Hişyariya analyzer: V3022 [CWE-571] Gotina 'installedPackageVersions.Count != 1' her dem rast e. 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);
    }
    ....
  }
  ....
}

Li vir rewşek hêlînek ecêb heye: installedPackageVersions.Count != 1ku dê her dem be rast. Bi gelemperî hişyariyek wusa di kodê de xeletiyek mentiqî nîşan dide, û di rewşên din de ew tenê kontrolkirina zêde nîşan dide.

Hişyarî N7

Hişyariya analyzer: V3001 Li milê çepê û li milê rastê yên '||'-ê 'commandArguments.contains("-apikey")' yên bi heman rengî hene. makînevan. 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");
}

Bernameçêkerê ku ev beşê kodê nivîsand, du rêzên dawîn kopî kir û pêxist û ji bîr kir ku wan biguherîne. Ji ber vê yekê, bikarhênerên Chocolatey nekarin pîvanê bicîh bikin apikey çend awayên din. Wekî pîvanên jorîn, ez dikarim vebijarkên jêrîn pêşkêşî bikim:

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

Çewtiyên kopî-paste xwedan şansek mezin e ku zû an dereng di her projeyek bi hejmareke mezin ji koda çavkaniyê de xuya bibin, û yek ji baştirîn amûrên ji bo şerkirina wan analîza statîk e.

PS Û wekî her gav, ev xeletî di dawiya şertek pir-xêz de xuya dike :). Binêre weşanê"Bandora xeta dawî".

Hişyarî N8

Hişyariya analyzer: V3095 [CWE-476] Tişta 'installedPackage' berî ku ew li dijî null were pejirandin hate bikar anîn. Rêzan kontrol bikin: 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)
  {
    ....
  }
  ....
}

Xeletiya klasîk: yekem tişt installedPackage tê bikaranîn û paşê tê kontrol kirin null. Ev tespît ji me re yek ji du pirsgirêkên di bernameyê de vedibêje: an installedPackage qet nebe wekhev null, ku guman e, û dûv re kontrol zêde ye, an jî em dikarin di kodê de xeletiyek cidî bi dest bixin - hewildanek ji bo gihîştina referansek betal.

encamê

Ji ber vê yekê me gavek din a piçûk avêt - naha karanîna PVS-Studio hê hêsantir û hêsantir bûye. Di heman demê de ez dixwazim bibêjim ku Chocolatey rêveberek pakêtê ya baş e ku di kodê de hejmareke piçûk xeletî heye, ku di dema karanîna PVS-Studio de dibe ku hêj kêmtir be.

Em we vedixwînin скачать û PVS-Studio biceribînin. Bikaranîna birêkûpêk a analîzerek statîk dê kalîte û pêbaweriya koda ku tîmê we pêş dixe baştir bike û bibe alîkar ku gelek qelsiyên roja sifir.

PS

Berî weşanê, me gotar ji pêşdebirên Chocolatey re şand, û wan ew baş wergirt. Me tiştek krîtîk nedît, lê wan, wek nimûne, xeletiya ku me dît ku bi bişkoja "api-key" ve girêdayî ye, eciband.

PVS-Studio naha li Chocolatey ye: Chocolatey ji binê Azure DevOps kontrol dike

Heke hûn dixwazin vê gotarê bi temaşevanên îngilîzîaxêv re parve bikin, ji kerema xwe lînka wergerê bikar bînin: Vladislav Stolyarov. PVS-Studio Naha li Chocolatey e: Chocolatey di bin Azure DevOps de kontrol dikin.

Source: www.habr.com

Add a comment