PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps
Nou kontinye fè lè l sèvi avèk PVS-Studio pi pratik. Analizè nou an disponib kounye a nan Chocolatey, yon manadjè pake pou Windows. Nou kwè ke sa a pral fasilite deplwaman PVS-Studio, an patikilye, nan sèvis nwaj yo. Pou nou pa ale lwen, ann tcheke kòd sous menm Chocolatey la. Azure DevOps pral aji kòm yon sistèm CI.

Men yon lis lòt atik nou yo sou sijè entegrasyon ak sistèm nwaj yo:

Mwen konseye w peye atansyon sou premye atik la sou entegrasyon ak Azure DevOps, paske nan ka sa a kèk pwen yo omisyon pou yo pa double.

Se konsa, ewo yo nan atik sa a:

PVS-estidyo se yon zouti analiz kòd estatik ki fèt pou idantifye erè ak frajilite potansyèl nan pwogram ki ekri nan C, C++, C# ak Java. Kouri sou 64-bit Windows, Linux, ak sistèm macOS, epi li ka analize kòd ki fèt pou 32-bit, 64-bit, ak platfòm ARM entegre. Si se premye fwa w ap eseye analiz kòd estatik pou tcheke pwojè w yo, nou rekòmande pou w familyarize w avèk yo atik sou fason pou byen vit wè avètisman PVS-Studio ki pi enteresan yo epi evalye kapasite zouti sa a.

Azure DevOps — yon seri sèvis nwaj ki kouvri ansanm tout pwosesis devlopman an. Platfòm sa a gen ladan zouti tankou Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, ki pèmèt ou akselere pwosesis pou kreye lojisyèl ak amelyore kalite li yo.

Chokola se yon manadjè pakè sous louvri pou Windows. Objektif la nan pwojè a se otomatize tout sik lavi lojisyèl an soti nan enstalasyon ak ajou ak dezenstalasyon sou sistèm opere Windows.

Konsènan itilize Chocolatey

Ou ka wè ki jan yo enstale manadjè a pake tèt li nan sa a lyen. Dokiman konplè pou enstale analizè a disponib nan lyen Gade Enstalasyon an lè l sèvi avèk seksyon manadjè pake Chocolatey. Mwen pral yon ti tan repete kèk pwen soti nan la.

Kòmand pou enstale dènye vèsyon analizè a:

choco install pvs-studio

Kòmand pou enstale yon vèsyon espesifik nan pake PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Pa default, se sèlman nwayo analizè a, eleman Nwayo a, enstale. Tout lòt drapo (Otonòm, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) ka pase lè l sèvi avèk --package-parameters.

Yon egzanp yon lòd ki pral enstale yon analizè ak yon Plugin pou Visual Studio 2019:

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

Koulye a, ann gade nan yon egzanp itilizasyon pratik nan analizè a anba Azure DevOps.

ajisteman

Kite m raple w ke gen yon seksyon separe sou pwoblèm tankou enskri yon kont, kreye yon Build Pipeline ak senkronize kont ou ak yon pwojè ki sitiye nan depo GitHub la. atik. Konfigirasyon nou an pral imedyatman kòmanse ak ekri yon dosye konfigirasyon.

Premyèman, ann mete kanpe yon deklanche lansman, ki endike ke nou lanse sèlman pou chanjman nan mèt branch:

trigger:
- master

Apre sa, nou bezwen chwazi yon machin vityèl. Pou kounye a, li pral yon ajan Microsoft akomode ak Windows Server 2019 ak Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Ann ale nan kò a nan dosye a konfigirasyon (blòk etap). Malgre lefèt ke ou pa ka enstale lojisyèl abitrè nan yon machin vityèl, mwen pa t 'ajoute yon veso Docker. Nou ka ajoute Chocolatey kòm yon ekstansyon pou Azure DevOps. Pou fè sa, ann ale nan lyen. Klike sou Jwenn li gratis. Apre sa, si ou deja otorize, tou senpleman chwazi kont ou, epi si se pa sa, Lè sa a, fè menm bagay la apre otorizasyon.

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Isit la ou bezwen chwazi kote nou pral ajoute ekstansyon an epi klike sou bouton an Enstale.

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Apre enstalasyon siksè, klike sou Kontinye nan òganizasyon an:

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Ou kapab kounye a wè modèl la pou travay Chocolatey nan fenèt la travay lè w ap modifye yon fichye konfigirasyon azure-pipelines.yml:

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Klike sou Chocolatey epi gade yon lis jaden:

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Isit la nou bezwen chwazi enstale nan teren an ak ekip yo. NAN Non dosye Nuspec endike non pake ki nesesè yo - pvs-studio. Si ou pa presize vèsyon an, dènye a pral enstale, ki kostim nou nèt. Ann peze bouton an ajoute epi nou pral wè travay la pwodwi nan dosye a konfigirasyon.

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

Apre sa, ann ale nan pati prensipal la nan dosye nou an:

- task: CmdLine@2
  inputs:
    script: 

Koulye a, nou bezwen kreye yon fichye ak lisans analizè a. Isit la PVSNAME и PVSKEY - non varyab ki gen valè nou presize nan paramèt yo. Yo pral estoke login PVS-Studio ak kle lisans lan. Pou mete valè yo, louvri meni an Varyab->Nouvo varyab. Ann kreye varyab PVSNAME pou konekte ak PVSKEY pou kle analizè a. Pa bliye tcheke bwat la Kenbe valè sa a sekrè pou PVSKEY. Kòd lòd:

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

Ann bati pwojè a lè l sèvi avèk fichye baton ki sitiye nan depo a:

сall build.bat

Ann kreye yon katab kote yo pral estoke dosye ki gen rezilta analizè a:

сall mkdir PVSTestResults

Ann kòmanse analize pwojè a:

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

Nou konvèti rapò nou an nan fòma html lè l sèvi avèk sèvis piblik PlogСonverter:

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

Koulye a, ou bezwen kreye yon travay pou ou ka Upload rapò a.

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

Fichye konfigirasyon konplè a sanble sa a:

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

Ann klike Sove->Save->Kouri pou kouri travay la. Ann telechaje rapò a lè w ale nan tab travay la.

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Pwojè Chocolatey a gen sèlman 37615 liy kòd C#. Ann gade kèk nan erè yo jwenn.

Rezilta tès yo

Avètisman N1

Avètisman analizè: V3005 Varyab 'Founisè' la bay tèt li. CrytpoHashProviderSpecs.cs 38

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

Analizè a detekte yon plasman nan varyab la nan tèt li, ki pa fè sans. Gen plis chans, nan plas youn nan varyab sa yo ta dwe gen kèk lòt youn. Oke, oswa sa a se yon typo, ak plasman siplemantè a ka tou senpleman retire.

Avètisman N2

Avètisman analizè: V3093 [CWE-480] Operatè '&' a evalye tou de operand yo. Petèt yon kout-sikwi '&&' operatè ta dwe itilize olye de sa. 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;
  }
}

Diferans operatè & soti nan operatè a && se ke si bò gòch nan ekspresyon an se fo, Lè sa a, bò dwat la ap toujou ap kalkile, ki nan ka sa a implique apèl metòd nesesè system.directory_exists.

Nan fragman konsidere a, sa a se yon defo minè. Wi, kondisyon sa a ka optimize pa ranplase & operatè a ak & & operatè a, men nan yon pwen de vi pratik, sa a pa afekte anyen. Sepandan, nan lòt ka, konfizyon ant & ak && ka lakòz pwoblèm grav lè yo trete bò dwat ekspresyon an ak valè ki pa kòrèk/pa valab. Pou egzanp, nan koleksyon erè nou an, idantifye lè l sèvi avèk dyagnostik V3093 la, gen ka sa a:

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

Menm si endèks la k pa kòrèk, li pral itilize pou jwenn aksè nan yon eleman etalaj. Kòm yon rezilta, yo pral jete yon eksepsyon IndexOutOfRangeException.

Avètisman N3, N4

Avètisman analizè: V3022 [CWE-571] Ekspresyon 'shortPrompt' toujou vre. InteractivePrompt.cs 101
Avètisman analizè: V3022 [CWE-571] Ekspresyon 'shortPrompt' toujou vre. 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
    ....
  }
  ....
}

Nan ka sa a, gen yon lojik etranj dèyè operasyon an nan operatè a ternary. Ann pran yon gade pi pre: si kondisyon mwen te make ak nimewo 1 la satisfè, Lè sa a, nou pral ale nan kondisyon 2, ki toujou vrè, ki vle di yo pral egzekite liy 3. Si kondisyon 1 vin fo, Lè sa a, nou pral ale nan liy ki make ak nimewo 4, kondisyon an nan ki tou toujou. vrè, ki vle di yo pral egzekite liy 5. Kidonk, kondisyon ki make ak kòmantè 0 p ap janm rive vre, ki ka pa egzakteman lojik operasyon pwogramè a te espere.

Avètisman N5

Avètisman analizè: V3123 [CWE-783] Petèt '?:' operatè a ap travay nan yon fason diferan ke li te espere. Priyorite li pi ba pase priyorite lòt operatè yo nan kondisyon li. 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);
  }
}

Dyagnostik la te travay pou liy lan:

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

Depi varyab la j kèk liy pi wo a inisyalize a zewo, operatè a ternary ap retounen valè a fo. Poutèt kondisyon sa a, kò bouk la pral egzekite yon sèl fwa. Li sanble m 'ke moso kòd sa a pa travay ditou jan pwogramè a gen entansyon.

Avètisman N6

Avètisman analizè: V3022 [CWE-571] Ekspresyon 'installedPackageVersions.Count != 1' toujou vre. 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);
    }
    ....
  }
  ....
}

Gen yon kondisyon enbrike etranj isit la: installPackageVersions.Count != 1ki ap toujou ye vrè. Souvan yon avètisman konsa endike yon erè lojik nan kòd la, ak nan lòt ka li tou senpleman endike redondants tcheke.

Avètisman N7

Avètisman analizè: V3001 Gen sous-ekspresyon ki idantik 'commandArguments.contains ("-apikey")' sou bò gòch la ak sou bò dwat la nan '||' operatè. 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");
}

Pwogramè ki te ekri seksyon kòd sa a te kopye epi kole de dènye liy yo epi li te bliye edite yo. Poutèt sa, itilizatè Chocolatey yo pa t kapab aplike paramèt la apikey yon koup plis fason. Menm jan ak paramèt ki anwo yo, mwen ka ofri opsyon sa yo:

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

Erè kopye-kole gen yon gwo chans pou yo parèt pi bonè oswa pita nan nenpòt pwojè ki gen yon gwo kantite kòd sous, ak youn nan pi bon zouti pou konbat yo se analiz estatik.

PS Epi kòm toujou, erè sa a gen tandans parèt nan fen yon kondisyon milti-liy :). Gade piblikasyon "Dènye efè liy".

Avètisman N8

Avètisman analizè: V3095 [CWE-476] Yo te itilize objè 'installedPackage' anvan li te verifye kont nil. Tcheke liy yo: 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)
  {
    ....
  }
  ....
}

Erè klasik: objè an premye InstallPackage se itilize ak Lè sa a tcheke pou nil. Dyagnostik sa a fè nou konnen youn nan de pwoblèm nan pwogram nan: swa InstallPackage pa janm egal nil, ki se endesi, ak Lè sa a, chèk la se redondants, oswa nou ta ka potansyèlman jwenn yon erè grav nan kòd la - yon tantativ jwenn aksè nan yon referans nil.

Konklizyon

Se konsa, nou te pran yon lòt ti etap - kounye a lè l sèvi avèk PVS-Studio te vin menm pi fasil ak pi pratik. Mwen ta renmen tou di ke Chocolatey se yon bon manadjè pake ak yon ti kantite erè nan kòd la, ki ta ka menm mwens lè w ap itilize PVS-Studio.

Nou envite ou telechaje epi eseye PVS-Studio. Itilizasyon regilye yon analizè estatik pral amelyore kalite ak fyab nan kòd ekip ou a devlope epi ede anpeche anpil moun vilnerabilite jou zewo.

PS

Anvan piblikasyon, nou te voye atik la bay devlopè Chocolatey yo, epi yo te resevwa li byen. Nou pa t 'jwenn anyen kritik, men yo, pou egzanp, te renmen ensèk nou jwenn ki gen rapò ak "api-key" kle a.

PVS-Studio se kounye a nan Chocolatey: tcheke Chocolatey anba Azure DevOps

Si ou vle pataje atik sa a ak yon odyans ki pale angle, tanpri itilize lyen tradiksyon an: Vladislav Stolyarov. PVS-Studio se kounye a nan Chocolatey: Tcheke Chocolatey anba Azure DevOps.

Sous: www.habr.com

Add nouvo kòmantè