Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps
Gipadayon namo ang paggamit sa PVS-Studio nga mas sayon. Anaa na ang among analisador sa Chocolatey, usa ka manager sa package alang sa Windows. Kami nagtuo nga kini makapadali sa pag-deploy sa PVS-Studio, ilabina, sa mga serbisyo sa panganod. Para di na magpalayo, atong susihon ang source code sa mao gihapong Chocolatey. Ang Azure DevOps molihok isip usa ka sistema sa CI.

Ania ang usa ka lista sa among uban pang mga artikulo bahin sa hilisgutan sa panagsama sa mga sistema sa panganod:

Gitambagan ko ikaw nga hatagan pagtagad ang una nga artikulo bahin sa paghiusa sa Azure DevOps, tungod kay sa kini nga kaso ang pipila nga mga punto wala iapil aron dili madoble.

Busa, ang mga bayani niini nga artikulo:

PVS Studio kay usa ka static code analysis tool nga gidesinyo sa pag-ila sa mga kasaypanan ug potensyal nga mga kahuyangan sa mga programa nga gisulat sa C, C++, C# ug Java. Nagdagan sa 64-bit Windows, Linux, ug macOS system, ug maka-analisar sa code nga gidisenyo para sa 32-bit, 64-bit, ug naka-embed nga ARM nga mga plataporma. Kung kini ang imong unang higayon nga pagsulay sa static code analysis aron masusi ang imong mga proyekto, among girekomenda nga pamilyar ka sa imong kaugalingon artikulo mahitungod sa unsa nga paagi sa dali nga pagtan-aw sa labing makapaikag nga PVS-Studio nga mga pasidaan ug pagtimbang-timbang sa mga kapabilidad niini nga himan.

Mga Azure DevOps — usa ka hugpong sa mga serbisyo sa panganod nga dungan nga naglangkob sa tibuuk nga proseso sa pag-uswag. Kini nga plataporma naglakip sa mga himan sama sa Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, nga nagtugot kanimo sa pagpadali sa proseso sa paghimo sa software ug pagpalambo sa kalidad niini.

Chocolatey mao ang usa ka open source package manager alang sa Windows. Ang tumong sa proyekto mao ang pag-automate sa tibuok software lifecycle gikan sa pag-instalar ngadto sa pag-update ug pag-uninstall sa Windows operating system.

Mahitungod sa paggamit sa Chocolatey

Makita nimo kung giunsa ang pag-install sa manager sa package mismo niini link. Ang kompleto nga dokumentasyon para sa pag-instalar sa analisador anaa sa link Tan-awa ang Pag-instalar gamit ang seksyon sa Chocolatey package manager. Akong balikon sa makadiyot ang pipila ka mga punto gikan didto.

Sugo sa pag-instalar sa pinakabag-o nga bersyon sa analisador:

choco install pvs-studio

Sugo sa pag-instalar sa usa ka piho nga bersyon sa PVS-Studio nga pakete:

choco install pvs-studio --version=7.05.35617.2075

Sa kasagaran, ang kinauyokan lamang sa analista, ang Core component, ang na-install. Ang tanan nga ubang mga bandila (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) mahimong ipasa gamit ang --package-parameters.

Usa ka pananglitan sa usa ka sugo nga mag-install sa usa ka analista nga adunay usa ka plugin alang sa Visual Studio 2019:

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

Karon atong tan-awon ang usa ka pananglitan sa sayon ​​​​nga paggamit sa analista ubos sa Azure DevOps.

kausaban

Pahinumdum ko nimo nga adunay lahi nga seksyon bahin sa mga isyu sama sa pagrehistro sa usa ka account, paghimo og Build Pipeline ug pag-synchronize sa imong account sa usa ka proyekto nga nahimutang sa GitHub repository. nga artikulo. Ang among setup magsugod dayon sa pagsulat og configuration file.

Una, mag-set up ta ug launch trigger, nga nagpakita nga maglansad lang ta para sa mga kausaban agalon sanga:

trigger:
- master

Sunod kita kinahanglan nga mopili sa usa ka virtual nga makina. Sa pagkakaron kini usa ka ahente nga gi-host sa Microsoft nga adunay Windows Server 2019 ug Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Mopadayon kita ngadto sa lawas sa configuration file (block mga lakang). Bisan pa sa kamatuoran nga dili nimo ma-install ang arbitraryong software sa usa ka virtual nga makina, wala ako magdugang usa ka sudlanan sa Docker. Mahimo natong idugang ang Chocolatey isip extension alang sa Azure DevOps. Aron mahimo kini, moadto kita sa link. Pag-klik Kinuha kini libre. Sunod, kung awtorisado ka na, pilia lang ang imong account, ug kung dili, buhata ang parehas pagkahuman sa pagtugot.

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Dinhi kinahanglan nimo nga pilion kung asa namon idugang ang extension ug i-klik ang buton Pag-instalar.

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Human sa malampuson nga pag-instalar, i-klik Mopadayon sa organisasyon:

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Makita na nimo ang template para sa Chocolatey nga buluhaton sa bintana buluhaton sa pag-edit sa usa ka configuration file azure-pipelines.yml:

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Pag-klik sa Chocolatey ug tan-awa ang usa ka lista sa mga natad:

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Dinhi kita kinahanglan nga mopili pag-instalar sa field kauban ang mga team. SA Ngalan sa File sa Nuspec ipakita ang ngalan sa gikinahanglan nga pakete - pvs-studio. Kung dili nimo ipiho ang bersyon, ang pinakabag-o i-install, nga mohaum kanamo sa hingpit. Atong i-press ang buton sa pagdugang ug atong makita ang namugna nga buluhaton sa configuration file.

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

Sunod, magpadayon kita sa panguna nga bahin sa among file:

- task: CmdLine@2
  inputs:
    script: 

Karon kinahanglan namon nga maghimo usa ka file nga adunay lisensya sa analisador. Dinhi PVSNAME и PVSKEY - mga ngalan sa mga variable kansang mga kantidad among gitino sa mga setting. Ilang tipigan ang PVS-Studio login ug license key. Aron mabutang ang ilang mga kantidad, ablihi ang menu Variables-> Bag-ong variable. Magbuhat ta ug mga variable PVSNAME para sa login ug PVSKEY para sa analisador yawe. Ayaw kalimot ug check sa kahon Itago kini nga bili nga sekreto alang sa PVSKEY. Command code:

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

Atong tukuron ang proyekto gamit ang bat file nga nahimutang sa repository:

сall build.bat

Maghimo kita og usa ka folder diin ang mga file nga adunay mga resulta sa analista itago:

сall mkdir PVSTestResults

Magsugod kita sa pag-analisar sa proyekto:

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

Among gi-convert ang among report ngadto sa html format gamit ang PlogConverter utility:

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

Karon kinahanglan ka nga maghimo usa ka buluhaton aron ma-upload nimo ang taho.

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

Ang kompleto nga configuration file ingon niini:

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

Atong i-klik Save-> Save-> Run sa pagpadagan sa buluhaton. Atong i-download ang report pinaagi sa pag-adto sa tab nga mga buluhaton.

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Ang Chocolatey nga proyekto naglangkob lamang sa 37615 ka linya sa C# code. Atong tan-awon ang pipila sa mga sayup nga nakit-an.

Mga resulta sa pagsulay

Pasidaan N1

Pahimangno sa tig-analisar: V3005 Ang variable nga 'Provider' gi-assign sa iyang kaugalingon. CrytpoHashProviderSpecs.cs 38

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

Ang analista nakamatikod sa usa ka buluhaton sa variable sa iyang kaugalingon, nga dili makatarunganon. Lagmit, puli sa usa niini nga mga variable kinahanglan nga adunay lain. Aw, o kini usa ka typo, ug ang dugang nga buluhaton mahimo nga tangtangon.

Pasidaan N2

Pahimangno sa tig-analisar: V3093 [CWE-480] Ang '&' operator nag-evaluate sa duha ka operand. Tingali ang usa ka short-circuit '&&' operator kinahanglan nga gamiton sa baylo. 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;
  }
}

Ang kalainan sa operator & gikan sa operator && mao nga kung ang wala nga bahin sa ekspresyon mao ang bakak nga mga, unya ang tuo nga kilid kalkulado gihapon, nga sa kini nga kaso nagpasabut nga wala kinahanglana nga mga tawag sa pamaagi system.directory_exists.

Sa tipik nga gikonsiderar, kini usa ka gamay nga sayup. Oo, kini nga kondisyon mahimong ma-optimize pinaagi sa pag-ilis sa & operator sa && operator, apan gikan sa praktikal nga punto sa pagtan-aw, wala kini makaapekto sa bisan unsang butang. Bisan pa, sa ubang mga kaso, ang kalibog tali sa & ug && mahimong hinungdan sa grabe nga mga problema kung ang tuo nga bahin sa ekspresyon gitagad nga adunay dili husto / dili balido nga mga kantidad. Pananglitan, sa among koleksyon sa sayup, giila gamit ang V3093 diagnostic, adunay kini nga kaso:

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

Bisan kung ang indeks k dili husto, kini gamiton sa pag-access sa usa ka elemento sa array. Ingon usa ka sangputanan, usa ka eksepsiyon ang ilabay IndexOutOfRangeException.

Mga Pasidaan N3, N4

Pahimangno sa tig-analisar: V3022 [CWE-571] Ang ekspresyong 'shortPrompt' kanunay tinuod. InteractivePrompt.cs 101
Pahimangno sa tig-analisar: V3022 [CWE-571] Ang ekspresyong 'shortPrompt' kanunay tinuod. 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
    ....
  }
  ....
}

Sa kini nga kaso, adunay usa ka katingad-an nga lohika sa luyo sa operasyon sa ternary operator. Atong tan-awon pag-ayo: kung ang kondisyon nga akong gimarkahan sa numero 1 matuman, nan kita magpadayon sa kondisyon 2, nga kanunay tinuod nga, nga nagpasabot nga ang linya 3 ipatuman. Kung ang kondisyon 1 mahimong bakak, nan moadto kita sa linya nga gimarkahan sa numero 4, ang kondisyon diin kanunay usab tinuod nga, nga nagpasabot nga ang linya 5 ipatuman. Busa, ang mga kondisyon nga gimarkahan sa komentaryo 0 dili gayud matuman, nga mahimong dili eksakto sa lohika sa operasyon nga gilauman sa programmer.

Pasidaan N5

Pahimangno sa tig-analisar: V3123 [CWE-783] Tingali ang operator nga '?:' nagtrabaho sa lahi nga paagi kaysa sa gilauman. Ang prayoridad niini mas ubos kaysa prayoridad sa ubang mga operator sa kondisyon niini. 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);
  }
}

Ang diagnostic nagtrabaho alang sa linya:

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

Sukad sa variable j pipila ka mga linya sa ibabaw gisugdan sa zero, ibalik sa ternary operator ang kantidad bakak nga mga. Tungod niini nga kondisyon, ang lawas sa loop ipatuman kausa ra. Para nako kini nga piraso sa code dili molihok sama sa gituyo sa programmer.

Pasidaan N6

Pahimangno sa tig-analisar: V3022 [CWE-571] Ang ekspresyong 'installedPackageVersions.Count != 1' kay kanunay tinuod. 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);
    }
    ....
  }
  ....
}

Adunay usa ka katingad-an nga nested nga kahimtang dinhi: installPackageVersions.Count != 1nga mao sa kanunay tinuod nga. Kasagaran ang ingon nga pasidaan nagpaila sa usa ka lohikal nga sayup sa code, ug sa ubang mga kaso kini nagpaila lamang sa sobra nga pagsusi.

Pasidaan N7

Pahimangno sa tig-analisar: V3001 Adunay managsama nga mga sub-expression nga 'commandArguments.contains("-apikey")' sa wala ug sa tuo sa '||' 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");
}

Ang programmer nga nagsulat niini nga seksyon sa code mikopya ug midikit sa kataposang duha ka linya ug nakalimot sa pag-edit niini. Tungod niini, ang mga tiggamit sa Chocolatey wala makahimo sa paggamit sa parameter apikey duha pa ka paagi. Susama sa mga parametro sa ibabaw, mahimo nakong itanyag ang mosunod nga mga kapilian:

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

Ang mga kasaypanan sa pagkopya-paste adunay taas nga tsansa nga makita dayon o ulahi sa bisan unsang proyekto nga adunay daghang gigikanan nga code, ug usa sa labing kaayo nga himan aron mabuntog kini mao ang static nga pagtuki.

PS Ug sama sa kanunay, kini nga sayup lagmit nga makita sa katapusan sa usa ka multi-line nga kondisyon :). Tan-awa ang publikasyon "Katapusan nga linya nga epekto".

Pasidaan N8

Pahimangno sa tig-analisar: V3095 [CWE-476] Ang butang nga 'installedPackage' gigamit sa wala pa kini mapamatud-an batok sa null. Susiha ang mga linya: 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)
  {
    ....
  }
  ....
}

Classic nga sayop: butang una na-install ngaPackage gigamit ug dayon gisusi alang sa bili. Kini nga diagnostic nagsulti kanato mahitungod sa usa sa duha ka mga problema sa programa: bisan na-install ngaPackage dili gayud managsama bili, nga maduhaduhaon, ug unya ang tseke kay redundant, o mahimo kitang makakuha og seryoso nga sayop sa code - usa ka pagsulay sa pag-access sa usa ka null reference.

konklusyon

Mao nga naghimo kami usa pa ka gamay nga lakang - karon ang paggamit sa PVS-Studio nahimong labi kadali ug labi ka dali. Gusto usab nako isulti nga ang Chocolatey usa ka maayo nga manager sa package nga adunay gamay nga gidaghanon sa mga sayup sa code, nga mahimo’g mas gamay kung gigamit ang PVS-Studio.

Gidapit ka namo скачать ug sulayi ang PVS-Studio. Ang kanunay nga paggamit sa usa ka static analyzer makapauswag sa kalidad ug kasaligan sa code nga gihimo sa imong team ug makatabang sa pagpugong sa daghang zero day vulnerabilities.

PS

Sa wala pa imantala, gipadala namo ang artikulo ngadto sa mga nag-develop sa Chocolatey, ug nadawat nila kini pag-ayo. Wala kami nakit-an nga bisan unsa nga kritikal, apan sila, pananglitan, ganahan sa bug nga among nakit-an nga may kalabutan sa "api-key" nga yawe.

Ang PVS-Studio naa na karon sa Chocolatey: pagsusi sa Chocolatey gikan sa ilawom sa Azure DevOps

Kung gusto nimong ipaambit kini nga artikulo sa usa ka tigpaminaw nga nagsultig English, palihug gamita ang link sa paghubad: Vladislav Stolyarov. Ang PVS-Studio Anaa Karon sa Chocolatey: Pagsusi sa Chocolatey ubos sa Azure DevOps.

Source: www.habr.com

Idugang sa usa ka comment