ProHoster > 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 փաթեթի հատուկ տարբերակ տեղադրելու հրաման.
Լռելյայնորեն տեղադրված է միայն անալիզատորի միջուկը՝ Core բաղադրիչը: Բոլոր մյուս դրոշները (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) կարող են փոխանցվել՝ օգտագործելով --package-parameters:
Հրամանի օրինակ, որը կտեղադրի անալիզատոր՝ պլագինով Visual Studio 2019-ի համար.
Հիմա եկեք նայենք Azure DevOps-ի տակ անալիզատորի հարմար օգտագործման օրինակին:
հարմարեցում
Հիշեցնեմ, որ առանձին բաժին կա այնպիսի խնդիրների մասին, ինչպիսիք են հաշիվ գրանցելը, Build Pipeline-ի ստեղծումը և ձեր հաշիվը համաժամեցնելը GitHub պահեստում գտնվող նախագծի հետ։ հոդված. Մեր կարգավորումն անմիջապես կսկսվի կազմաձևման ֆայլ գրելով:
Նախ, եկեք ստեղծենք գործարկման գործարկիչ՝ նշելով, որ մենք գործարկում ենք միայն փոփոխությունների համար վարպետ մասնաճյուղ:
trigger:
- master
Հաջորդը մենք պետք է ընտրենք վիրտուալ մեքենա: Առայժմ այն կլինի Microsoft-ի հյուրընկալող գործակալ Windows Server 2019-ով և Visual Studio 2019-ով.
pool:
vmImage: 'windows-latest'
Եկեք անցնենք կազմաձևման ֆայլի մարմնին (բլոկ քայլեր) Չնայած այն հանգամանքին, որ դուք չեք կարող կամայական ծրագրակազմ տեղադրել վիրտուալ մեքենայի մեջ, ես չեմ ավելացրել Docker կոնտեյներ: Մենք կարող ենք Chocolatey-ը ավելացնել որպես Azure DevOps-ի ընդլայնում: Դա անելու համար եկեք գնանք ՈՒղեցույց. Սեղմել Ստացեք անվճար. Հաջորդը, եթե դուք արդեն լիազորված եք, պարզապես ընտրեք ձեր հաշիվը, իսկ եթե ոչ, ապա արեք նույնը լիազորումից հետո:
Այստեղ դուք պետք է ընտրեք, թե որտեղ կավելացնենք ընդլայնումը և սեղմեք կոճակը Տեղադրեք.
Հաջող տեղադրումից հետո սեղմեք Անցեք կազմակերպություն:
Այժմ պատուհանում կարող եք տեսնել Chocolatey առաջադրանքի ձևանմուշը խնդիրները երբ խմբագրում եք կազմաձևման ֆայլը azure-pipelines.yml:
Կտտացրեք Chocolatey-ին և տեսեք դաշտերի ցանկը.
Այստեղ մենք պետք է ընտրենք տեղադրել թիմերի հետ խաղադաշտում։ IN Nuspec ֆայլի անուն նշեք պահանջվող փաթեթի անվանումը՝ pvs-studio: Եթե չնշեք տարբերակը, ապա կտեղադրվի ամենավերջինը, որը լիովին համապատասխանում է մեզ։ Եկեք սեղմենք կոճակը ավելացնել և մենք կտեսնենք ստեղծված առաջադրանքը կազմաձևման ֆայլում:
Այժմ մենք պետք է ստեղծենք ֆայլ անալիզատորի լիցենզիայով: Այստեղ PVSNAME и PVSKEY - փոփոխականների անուններ, որոնց արժեքները մենք նշում ենք պարամետրերում: Նրանք կպահեն PVS-Studio մուտքի և լիցենզիայի բանալին: Նրանց արժեքները սահմանելու համար բացեք ընտրացանկը Variables->New variable. Եկեք ստեղծենք փոփոխականներ PVSNAME մուտքի համար և PVSKEY անալիզատորի բանալին: Մի մոռացեք ստուգել վանդակը Գաղտնի պահեք այս արժեքը համար PVSKEY. Հրամանի կոդը:
Եկեք սեղմենք Save->Save->Run առաջադրանքը կատարելու համար: Ներբեռնենք հաշվետվությունը՝ անցնելով առաջադրանքների ներդիր:
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
Օպերատորի տարբերություն & օպերատորից && այն է, որ եթե արտահայտության ձախ կողմն է սուտ, ապա աջ կողմը դեռ կհաշվարկվի, որն այս դեպքում ենթադրում է մեթոդի անհարկի զանգեր 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
Տվյալ դեպքում եռակի օպերատորի աշխատանքի հիմքում կա տարօրինակ տրամաբանություն. Եկեք մանրամասն նայենք՝ եթե 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);
}
}
Քանի որ փոփոխականը 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
Ծրագրավորողը, ով գրել է կոդի այս բաժինը, պատճենել և տեղադրել է վերջին երկու տողերը և մոռացել խմբագրել դրանք։ Այդ պատճառով Chocolatey-ի օգտատերերը չկարողացան կիրառել պարամետրը գագաթնակետ ևս մի երկու ճանապարհ: Վերը նշված պարամետրերի նման, ես կարող եմ առաջարկել հետևյալ տարբերակները.
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» ստեղնի հետ: