PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից
Մենք շարունակում ենք ավելի հարմար դարձնել PVS-Studio-ի օգտագործումը: Մեր անալիզատորն այժմ հասանելի է Chocolatey-ում, որը Windows-ի փաթեթների կառավարիչ է: Մենք կարծում ենք, որ դա կհեշտացնի PVS-Studio-ի տեղակայումը, մասնավորապես, ամպային ծառայություններում: Հեռու չգնալու համար ստուգենք նույն Chocolatey-ի սկզբնական կոդը։ Azure DevOps-ը կգործի որպես CI համակարգ:

Ահա մեր մյուս հոդվածների ցանկը ամպային համակարգերի հետ ինտեգրման թեմայով.

Խորհուրդ եմ տալիս ուշադրություն դարձնել Azure DevOps-ի հետ ինտեգրման մասին առաջին հոդվածին, քանի որ այս դեպքում որոշ կետեր բաց են թողնվում, որպեսզի չկրկնվեն:

Այսպիսով, այս հոդվածի հերոսները.

PVS- ստուդիա ստատիկ կոդի վերլուծության գործիք է, որը նախատեսված է C, C++, C# և Java-ով գրված ծրագրերում սխալներն ու հնարավոր խոցելիությունները հայտնաբերելու համար: Աշխատում է 64-բիթանոց Windows, Linux և macOS համակարգերով և կարող է վերլուծել կոդը, որը նախատեսված է 32-բիթանոց, 64-բիթանոց և ներկառուցված ARM հարթակների համար: Եթե ​​առաջին անգամ եք փորձում ստատիկ կոդի վերլուծություն՝ ստուգելու ձեր նախագծերը, խորհուրդ ենք տալիս ծանոթանալ հոդված այն մասին, թե ինչպես արագ դիտել PVS-Studio-ի ամենահետաքրքիր նախազգուշացումները և գնահատել այս գործիքի հնարավորությունները:

Azure DevOps — ամպային ծառայությունների մի շարք, որոնք համատեղ ընդգրկում են զարգացման ողջ գործընթացը: Այս հարթակը ներառում է այնպիսի գործիքներ, ինչպիսիք են Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, որոնք թույլ են տալիս արագացնել ծրագրային ապահովման ստեղծման գործընթացը և բարելավել դրա որակը:

Chocolatey- ը Windows-ի համար բաց կոդով փաթեթների կառավարիչ է: Նախագծի նպատակն է ավտոմատացնել ծրագրային ապահովման ողջ ցիկլը՝ տեղադրումից մինչև թարմացում և տեղահանում Windows օպերացիոն համակարգերում:

Շոկոլադե օգտագործելու մասին

Այստեղ դուք կարող եք տեսնել, թե ինչպես տեղադրել փաթեթի կառավարիչը ՈՒղեցույց. Անալիզատորի տեղադրման ամբողջական փաստաթղթերը հասանելի են այստեղ ՈՒղեցույց Տես «Տեղադրումը՝ օգտագործելով Chocolatey փաթեթի կառավարիչ» բաժինը: Այնտեղից հակիրճ կկրկնեմ որոշ կետեր.

Անալիզատորի վերջին տարբերակը տեղադրելու հրաման.

choco install pvs-studio

PVS-Studio փաթեթի հատուկ տարբերակ տեղադրելու հրաման.

choco install pvs-studio --version=7.05.35617.2075

Լռելյայնորեն տեղադրված է միայն անալիզատորի միջուկը՝ Core բաղադրիչը: Բոլոր մյուս դրոշները (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) կարող են փոխանցվել՝ օգտագործելով --package-parameters:

Հրամանի օրինակ, որը կտեղադրի անալիզատոր՝ պլագինով Visual Studio 2019-ի համար.

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

Հիմա եկեք նայենք Azure DevOps-ի տակ անալիզատորի հարմար օգտագործման օրինակին:

հարմարեցում

Հիշեցնեմ, որ առանձին բաժին կա այնպիսի խնդիրների մասին, ինչպիսիք են հաշիվ գրանցելը, Build Pipeline-ի ստեղծումը և ձեր հաշիվը համաժամեցնելը GitHub պահեստում գտնվող նախագծի հետ։ հոդված. Մեր կարգավորումն անմիջապես կսկսվի կազմաձևման ֆայլ գրելով:

Նախ, եկեք ստեղծենք գործարկման գործարկիչ՝ նշելով, որ մենք գործարկում ենք միայն փոփոխությունների համար վարպետ մասնաճյուղ:

trigger:
- master

Հաջորդը մենք պետք է ընտրենք վիրտուալ մեքենա: Առայժմ այն ​​կլինի Microsoft-ի հյուրընկալող գործակալ Windows Server 2019-ով և Visual Studio 2019-ով.

pool:
  vmImage: 'windows-latest'

Եկեք անցնենք կազմաձևման ֆայլի մարմնին (բլոկ քայլեր) Չնայած այն հանգամանքին, որ դուք չեք կարող կամայական ծրագրակազմ տեղադրել վիրտուալ մեքենայի մեջ, ես չեմ ավելացրել Docker կոնտեյներ: Մենք կարող ենք Chocolatey-ը ավելացնել որպես Azure DevOps-ի ընդլայնում: Դա անելու համար եկեք գնանք ՈՒղեցույց. Սեղմել Ստացեք անվճար. Հաջորդը, եթե դուք արդեն լիազորված եք, պարզապես ընտրեք ձեր հաշիվը, իսկ եթե ոչ, ապա արեք նույնը լիազորումից հետո:

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Այստեղ դուք պետք է ընտրեք, թե որտեղ կավելացնենք ընդլայնումը և սեղմեք կոճակը Տեղադրեք.

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Հաջող տեղադրումից հետո սեղմեք Անցեք կազմակերպություն:

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Այժմ պատուհանում կարող եք տեսնել Chocolatey առաջադրանքի ձևանմուշը խնդիրները երբ խմբագրում եք կազմաձևման ֆայլը azure-pipelines.yml:

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Կտտացրեք Chocolatey-ին և տեսեք դաշտերի ցանկը.

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Այստեղ մենք պետք է ընտրենք տեղադրել թիմերի հետ խաղադաշտում։ IN Nuspec ֆայլի անուն նշեք պահանջվող փաթեթի անվանումը՝ pvs-studio: Եթե ​​չնշեք տարբերակը, ապա կտեղադրվի ամենավերջինը, որը լիովին համապատասխանում է մեզ։ Եկեք սեղմենք կոճակը ավելացնել և մենք կտեսնենք ստեղծված առաջադրանքը կազմաձևման ֆայլում:

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

Հաջորդը, եկեք անցնենք մեր ֆայլի հիմնական մասին.

- task: CmdLine@2
  inputs:
    script: 

Այժմ մենք պետք է ստեղծենք ֆայլ անալիզատորի լիցենզիայով: Այստեղ PVSNAME и PVSKEY - փոփոխականների անուններ, որոնց արժեքները մենք նշում ենք պարամետրերում: Նրանք կպահեն PVS-Studio մուտքի և լիցենզիայի բանալին: Նրանց արժեքները սահմանելու համար բացեք ընտրացանկը Variables->New variable. Եկեք ստեղծենք փոփոխականներ PVSNAME մուտքի համար և PVSKEY անալիզատորի բանալին: Մի մոռացեք ստուգել վանդակը Գաղտնի պահեք այս արժեքը համար PVSKEY. Հրամանի կոդը:

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

Եկեք կառուցենք նախագիծը, օգտագործելով bat ֆայլը, որը գտնվում է պահեստում.

сall build.bat

Եկեք ստեղծենք մի թղթապանակ, որտեղ կպահվեն անալիզատորի արդյունքներով ֆայլերը.

сall mkdir PVSTestResults

Սկսենք վերլուծել նախագիծը.

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

Մենք մեր զեկույցը փոխակերպում ենք html ձևաչափի, օգտագործելով PlogСonverter կոմունալը.

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

Այժմ դուք պետք է առաջադրանք ստեղծեք, որպեսզի կարողանաք վերբեռնել հաշվետվությունը:

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

Ամբողջական կազմաձևման ֆայլն ունի հետևյալ տեսքը.

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

Եկեք սեղմենք Save->Save->Run առաջադրանքը կատարելու համար: Ներբեռնենք հաշվետվությունը՝ անցնելով առաջադրանքների ներդիր:

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Chocolatey նախագիծը պարունակում է ընդամենը 37615 տող C# կոդ: Դիտարկենք հայտնաբերված որոշ սխալներ:

Թեստի արդյունքները

Զգուշացում N1

Անալիզատորի նախազգուշացում. V3005 «Մատուցող» փոփոխականը վերագրված է իրեն: CrytpoHashProviderSpecs.cs 38

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

Անալիզատորը հայտնաբերել է փոփոխականի վերագրում իրեն, ինչը իմաստ չունի: Ամենայն հավանականությամբ, այս փոփոխականներից մեկի փոխարեն պետք է լինի մեկ ուրիշը: Դե, կամ սա տառասխալ է, և հավելյալ հանձնարարությունը պարզապես կարելի է հեռացնել:

Զգուշացում N2

Անալիզատորի նախազգուշացում. V3093 [CWE-480] «&» օպերատորը գնահատում է երկու օպերանդները: Միգուցե դրա փոխարեն պետք է օգտագործվի կարճ միացման «&&» օպերատորը: 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;
  }
}

Օպերատորի տարբերություն & օպերատորից && այն է, որ եթե արտահայտության ձախ կողմն է սուտ, ապա աջ կողմը դեռ կհաշվարկվի, որն այս դեպքում ենթադրում է մեթոդի անհարկի զանգեր system.directory_exists.

Դիտարկված հատվածում սա չնչին թերություն է։ Այո, այս պայմանը կարելի է օպտիմիզացնել՝ & օպերատորը && օպերատորով փոխարինելով, բայց գործնական տեսանկյունից դա ոչ մի բանի վրա չի ազդում։ Այնուամենայնիվ, այլ դեպքերում &-ի և &&-ի շփոթությունը կարող է լուրջ խնդիրներ առաջացնել, երբ արտահայտության աջ կողմը վերաբերվում է սխալ/անվավեր արժեքներին: Օրինակ, մեր սխալների հավաքածուում, նույնականացվել է V3093 ախտորոշման միջոցով, կա այս դեպքը.

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

Նույնիսկ եթե ցուցանիշը k սխալ է, այն կօգտագործվի զանգվածի տարր մուտք գործելու համար: Արդյունքում բացառություն է գցվելու IndexOutOfRangeException.

Զգուշացումներ N3, N4

Անալիզատորի նախազգուշացում. V3022 [CWE-571] «shortPrompt» արտահայտությունը միշտ ճիշտ է: InteractivePrompt.cs 101
Անալիզատորի նախազգուշացում. V3022 [CWE-571] «shortPrompt» արտահայտությունը միշտ ճիշտ է: 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
    ....
  }
  ....
}

Տվյալ դեպքում եռակի օպերատորի աշխատանքի հիմքում կա տարօրինակ տրամաբանություն. Եկեք մանրամասն նայենք՝ եթե 1 համարով նշածս պայմանը կատարվի, ապա կանցնենք 2-րդ պայմանին, որը միշտ. ճիշտ, ինչը նշանակում է, որ 3-րդ տողը կկատարվի: Եթե 1-ին պայմանը սխալ է, ապա մենք կտեղափոխվենք 4-ով նշված տողը, որի պայմանը նույնպես միշտ է. ճիշտ, ինչը նշանակում է, որ 5-րդ տողը կկատարվի։Այսպիսով, 0-ով նշված պայմանները երբեք չեն կատարվի, ինչը կարող է չհամընկնել ծրագրավորողի ակնկալած գործողության տրամաբանության հետ։

Զգուշացում N5

Անալիզատորի նախազգուշացում. V3123 [CWE-783] Հավանաբար «?:» օպերատորն աշխատում է այլ կերպ, քան սպասվում էր: Նրա առաջնահերթությունը ավելի ցածր է, քան իր վիճակում գտնվող այլ օպերատորների առաջնահերթությունը: 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);
  }
}

Ախտորոշիչն աշխատել է գծի համար.

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

Քանի որ փոփոխականը j վերևում գտնվող մի քանի տող նախաստորագրված է զրոյի, եռակի օպերատորը կվերադարձնի արժեքը սուտ. Այս պայմանի պատճառով հանգույցի մարմինը կկատարվի միայն մեկ անգամ: Ինձ թվում է, որ այս կոդն ընդհանրապես չի աշխատում այնպես, ինչպես նախատեսել էր ծրագրավորողը։

Զգուշացում N6

Անալիզատորի նախազգուշացում. V3022 [CWE-571] «installedPackageVersions.Count != 1» արտահայտությունը միշտ ճիշտ է: 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);
    }
    ....
  }
  ....
}

Այստեղ կա մի տարօրինակ բնադրված պայման. installedPackageVersions.Count != 1որը միշտ կլինի ճիշտ. Հաճախ նման նախազգուշացումը ցույց է տալիս կոդի տրամաբանական սխալը, իսկ մյուս դեպքերում՝ պարզապես ավելորդ ստուգում։

Զգուշացում N7

Անալիզատորի նախազգուշացում. V3001 Կան միանման ենթարտահայտություններ «commandArguments.contains(«-apikey»)» «||»-ի ձախ և աջ կողմում: օպերատոր. 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");
}

Ծրագրավորողը, ով գրել է կոդի այս բաժինը, պատճենել և տեղադրել է վերջին երկու տողերը և մոռացել խմբագրել դրանք։ Այդ պատճառով Chocolatey-ի օգտատերերը չկարողացան կիրառել պարամետրը գագաթնակետ ևս մի երկու ճանապարհ: Վերը նշված պարամետրերի նման, ես կարող եմ առաջարկել հետևյալ տարբերակները.

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

Copy-paste-ի սխալները վաղ թե ուշ մեծ քանակությամբ կոդով ցանկացած նախագծում հայտնվելու մեծ հնարավորություն ունեն, և դրանց դեմ պայքարելու լավագույն գործիքներից մեկը ստատիկ վերլուծությունն է:

Հ.Գ. Եվ ինչպես միշտ, այս սխալը հակված է ի հայտ գալ մի քանի տողային պայմանի վերջում :): Տես հրապարակումը»Վերջին տողի էֆեկտը".

Զգուշացում N8

Անալիզատորի նախազգուշացում. V3095 [CWE-476] «installedPackage» օբյեկտը օգտագործվել է նախքան այն չվավերացվելը: Ստուգեք տողերը՝ 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)
  {
    ....
  }
  ....
}

Դասական սխալ. նախ առարկեք տեղադրված փաթեթ օգտագործվում է, այնուհետև ստուգվում է զրո. Այս ախտորոշիչը մեզ ասում է ծրագրի երկու խնդիրներից մեկի մասին տեղադրված փաթեթ երբեք հավասար զրո, որը կասկածելի է, և այդ դեպքում ստուգումը ավելորդ է, կամ մենք կարող ենք պոտենցիալ կոդի մեջ լուրջ սխալ ստանալ՝ զրոյական հղում մուտք գործելու փորձ:

Ամփոփում

Այսպիսով, մենք կատարեցինք ևս մեկ փոքր քայլ. այժմ PVS-Studio-ն օգտագործելն ավելի հեշտ և հարմար է դարձել: Կցանկանայի նաև ասել, որ Chocolatey-ը լավ փաթեթների կառավարիչ է՝ կոդի մեջ փոքր քանակությամբ սխալներով, որոնք կարող են էլ ավելի քիչ լինել PVS-Studio-ից օգտվելիս։

Հրավիրում ենք Ձեզ բեռնել և փորձեք PVS-Studio-ն: Ստատիկ անալիզատորի կանոնավոր օգտագործումը կբարելավի ձեր թիմի մշակած կոդի որակը և հուսալիությունը և կօգնի կանխել բազմաթիվ զրոյական օրվա խոցելիություններ.

PS

Մինչ հրապարակումը մենք հոդվածն ուղարկեցինք Chocolatey մշակողներին, և նրանք այն լավ ընդունեցին։ Մենք ոչ մի կարևոր բան չգտանք, բայց նրանց, օրինակ, դուր եկավ այն սխալը, որը մենք գտանք՝ կապված «api-key» ստեղնի հետ:

PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում Chocolatey-ը Azure DevOps-ի տակից

Եթե ​​ցանկանում եք կիսվել այս հոդվածով անգլիախոս լսարանի հետ, խնդրում ենք օգտագործել թարգմանության հղումը՝ Վլադիսլավ Ստոլյարով: PVS-Studio-ն այժմ Chocolatey-ում է՝ ստուգում ենք շոկոլադը Azure DevOps-ի ներքո.

Source: www.habr.com

Добавить комментарий