ProHoster > PVS-Studio tagad ir pieejams Chocolatey: pÄrbauda Chocolatey no Azure DevOps
PVS-Studio tagad ir pieejams Chocolatey: pÄrbauda Chocolatey no Azure DevOps
MÄs turpinÄm padarÄ«t PVS-Studio lietoÅ”anu ÄrtÄku. MÅ«su analizators tagad ir pieejams Chocolatey, Windows pakotÅu pÄrvaldniekÄ. MÄs uzskatÄm, ka tas atvieglos PVS-Studio izvietoÅ”anu, jo Ä«paÅ”i mÄkoÅpakalpojumos. Lai netiktu tÄlu, pÄrbaudÄ«sim tÄ paÅ”a Chocolatey pirmkodu. Azure DevOps darbosies kÄ CI sistÄma.
Å eit ir saraksts ar citiem mÅ«su rakstiem par integrÄciju ar mÄkoÅsistÄmÄm:
Es iesaku pievÄrst uzmanÄ«bu pirmajam rakstam par integrÄciju ar Azure DevOps, jo Å”ajÄ gadÄ«jumÄ daži punkti tiek izlaisti, lai tie netiktu dublÄti.
TÄtad, Ŕī raksta varoÅi:
PVS-studija ir statiskÄ koda analÄ«zes rÄ«ks, kas izstrÄdÄts, lai identificÄtu kļūdas un iespÄjamÄs ievainojamÄ«bas programmÄs, kas rakstÄ«tas C, C++, C# un Java valodÄs. Darbojas 64 bitu Windows, Linux un macOS sistÄmÄs un var analizÄt kodu, kas paredzÄts 32 bitu, 64 bitu un iegultajÄm ARM platformÄm. Ja Ŕī ir pirmÄ reize, kad mÄÄ£inÄt pÄrbaudÄ«t statisko kodu analÄ«zi, lai pÄrbaudÄ«tu savus projektus, iesakÄm iepazÄ«ties ar to rakstu par to, kÄ Ätri apskatÄ«t interesantÄkos PVS-Studio brÄ«dinÄjumus un novÄrtÄt Ŕī rÄ«ka iespÄjas.
Azure DevOps ā mÄkoÅpakalpojumu kopums, kas kopÄ«gi aptver visu izstrÄdes procesu. Å ajÄ platformÄ ir iekļauti tÄdi rÄ«ki kÄ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, kas ļauj paÄtrinÄt programmatÅ«ras izveides procesu un uzlabot tÄs kvalitÄti.
Chocolatey ir atvÄrtÄ koda pakotÅu pÄrvaldnieks operÄtÄjsistÄmai Windows. Projekta mÄrÄ·is ir automatizÄt visu programmatÅ«ras dzÄ«ves ciklu no instalÄÅ”anas lÄ«dz atjauninÄÅ”anai un atinstalÄÅ”anai Windows operÄtÄjsistÄmÄs.
Par Chocolatey lietoŔanu
Å eit varat redzÄt, kÄ instalÄt paÅ”u pakotÅu pÄrvaldnieku saite. Visa analizatora uzstÄdÄ«Å”anas dokumentÄcija ir pieejama vietnÄ saite Skatiet sadaļu InstalÄÅ”ana, izmantojot Chocolatey pakotÅu pÄrvaldnieku. Es Ä«si atkÄrtoÅ”u dažus punktus no turienes.
Komanda, lai instalÄtu jaunÄko analizatora versiju:
choco install pvs-studio
Komanda, lai instalÄtu noteiktu PVS-Studio pakotnes versiju:
PÄc noklusÄjuma ir instalÄts tikai analizatora kodols, Core komponents. Visus pÄrÄjos karogus (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) var nodot, izmantojot --package-parameters.
PiemÄrs komandai, kas instalÄs analizatoru ar Visual Studio 2019 spraudni:
Tagad apskatÄ«sim piemÄru par Ärtas analizatora izmantoÅ”anu zem Azure DevOps.
koriÄ£ÄÅ”ana
AtgÄdinÄÅ”u, ka ir atseviŔķa sadaļa par tÄdiem jautÄjumiem kÄ konta reÄ£istrÄÅ”ana, Build Pipeline izveide un konta sinhronizÄÅ”ana ar projektu, kas atrodas GitHub repozitorijÄ. raksts. MÅ«su iestatÄ«Å”ana nekavÄjoties sÄksies ar konfigurÄcijas faila rakstÄ«Å”anu.
Vispirms iestatÄ«sim palaiÅ”anas aktivizÄtÄju, kas norÄda, ka mÄs palaižam tikai, lai veiktu izmaiÅas meistars filiÄle:
trigger:
- master
TÄlÄk mums ir jÄizvÄlas virtuÄlÄ maŔīna. PagaidÄm tas bÅ«s Microsoft mitinÄts aÄ£ents ar Windows Server 2019 un Visual Studio 2019:
pool:
vmImage: 'windows-latest'
PÄrejam uz konfigurÄcijas faila pamattekstu (block pasÄkumi). Neskatoties uz to, ka virtuÄlajÄ maŔīnÄ nevar instalÄt patvaļīgu programmatÅ«ru, es nepievienoju Docker konteineru. MÄs varam pievienot Chocolatey kÄ Azure DevOps paplaÅ”inÄjumu. Lai to izdarÄ«tu, pÄriesim uz saite. KlikŔķis IegÅ«stiet to bez maksas. TÄlÄk, ja esat jau pilnvarots, vienkÄrÅ”i atlasiet savu kontu un, ja nÄ, pÄc autorizÄcijas dariet to paÅ”u.
Å eit jums ir jÄizvÄlas vieta, kur pievienosim paplaÅ”inÄjumu, un noklikŔķiniet uz pogas instalÄt.
PÄc veiksmÄ«gas instalÄÅ”anas noklikŔķiniet uz PÄrejiet uz organizÄciju:
NoklikŔķiniet uz Chocolatey un skatiet lauku sarakstu:
Å eit mums ir jÄizvÄlas uzstÄdÄ«t laukumÄ ar komandÄm. IN Nuspec faila nosaukums norÄdi vajadzÄ«gÄs paketes nosaukumu ā pvs-studio. Ja nenorÄdÄ«siet versiju, tiks instalÄta jaunÄkÄ, kas mums pilnÄ«bÄ atbilst. NospiedÄ«sim pogu pievienot un mÄs redzÄsim Ä£enerÄto uzdevumu konfigurÄcijas failÄ.
Tagad mums ir jÄizveido fails ar analizatora licenci. Å eit PVSNAME Šø PVSKEY ā mainÄ«go nosaukumi, kuru vÄrtÄ«bas norÄdÄm iestatÄ«jumos. Tie saglabÄs PVS-Studio pieteikuminformÄciju un licences atslÄgu. Lai iestatÄ«tu to vÄrtÄ«bas, atveriet izvÄlni MainÄ«gie-> Jauns mainÄ«gais. Izveidosim mainÄ«gos PVSNAME par pieteikÅ”anos un PVSKEY analizatora atslÄgai. Neaizmirstiet atzÄ«mÄt izvÄles rÅ«tiÅu SaglabÄjiet Å”o vÄrtÄ«bu noslÄpumÄ par PVSKEY. Komandas kods:
NoklikŔķinÄsim SaglabÄt->SaglabÄt->Palaist lai izpildÄ«tu uzdevumu. LejupielÄdÄsim pÄrskatu, atverot cilni Uzdevumi.
Chocolatey projektÄ ir tikai 37615 C# koda rindas. ApskatÄ«sim dažas no atrastajÄm kļūdÄm.
Testa rezultÄti
BrÄ«dinÄjums N1
Analizatora brÄ«dinÄjums: V3005 MainÄ«gais āProviderā tiek pieŔķirts sev. CrytpoHashProviderSpecs.cs 38
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
Analizators atklÄja mainÄ«gÄ pieŔķirÅ”anu sev, kam nav jÄgas. VisticamÄk, viena no Å”iem mainÄ«gajiem vietÄ vajadzÄtu bÅ«t kÄdam citam. Nu, vai arÄ« Ŕī ir drukas kļūda, un papildu uzdevumu var vienkÄrÅ”i noÅemt.
Operatoru atŔķirÄ«ba & no operatora && ir tas, ka, ja izteiksmes kreisÄ puse ir nepatiess, tad joprojÄm tiks aprÄÄ·inÄta labÄ puse, kas Å”ajÄ gadÄ«jumÄ nozÄ«mÄ nevajadzÄ«gus metožu izsaukumus system.directory_exists.
AplÅ«kotajÄ fragmentÄ tas ir neliels trÅ«kums. JÄ, Å”o nosacÄ«jumu var optimizÄt, aizstÄjot & operatoru ar && operatoru, taÄu no praktiskÄ viedokļa tas neko neietekmÄ. TomÄr citos gadÄ«jumos & un && sajaukÅ”ana var radÄ«t nopietnas problÄmas, ja izteiksmes labÄ puse tiek apstrÄdÄta ar nepareizÄm/nederÄ«gÄm vÄrtÄ«bÄm. PiemÄram, mÅ«su kļūdu kolekcijÄ identificÄts, izmantojot V3093 diagnostiku, ir Å”Äds gadÄ«jums:
if ((k < nct) & (s[k] != 0.0))
Pat ja indekss k ir nepareizs, tas tiks izmantots, lai piekļūtu masÄ«va elementam. RezultÄtÄ tiks izmests izÅÄmums IndexOutOfRangeException.
Å ajÄ gadÄ«jumÄ trÄ«skÄrÅ”Ä operatora darbÄ«bas pamatÄ ir dÄ«vaina loÄ£ika. PaskatÄ«simies tuvÄk: ja nosacÄ«jums, ko atzÄ«mÄju ar 1. numuru, ir izpildÄ«ts, tad mÄs pÄriesim uz nosacÄ«jumu 2, kas vienmÄr ir patiess, kas nozÄ«mÄ, ka tiks izpildÄ«ta rinda 3. Ja nosacÄ«jums 1 izrÄdÄ«sies nepatiess, tad mÄs pÄriesim uz rindu, kas apzÄ«mÄta ar numuru 4, kurÄ nosacÄ«jums arÄ« vienmÄr ir patiess, kas nozÄ«mÄ, ka tiks izpildÄ«ta rinda 5. TÄdÄjÄdi nosacÄ«jumi, kas atzÄ«mÄti ar komentÄru 0, nekad netiks izpildÄ«ti, kas var nebÅ«t tieÅ”i tÄda darbÄ«bas loÄ£ika, kÄdu programmÄtÄjs gaidÄ«ja.
BrÄ«dinÄjums N5
Analizatora brÄ«dinÄjums: V3123 [CWE-783] IespÄjams, operators "?:" darbojas savÄdÄk, nekÄ bija paredzÄts. TÄ prioritÄte ir zemÄka par citu operatoru prioritÄti savÄ stÄvoklÄ«. 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);
}
}
KopÅ” mainÄ«gÄ j dažas rindas augstÄk tiek inicializÄta uz nulli, trÄ«skÄrÅ”ais operators atgriezÄ«s vÄrtÄ«bu nepatiess. Å Ä« nosacÄ«juma dÄļ cilpas pamatteksts tiks izpildÄ«ts tikai vienu reizi. Man Ŕķiet, ka Å”is koda fragments nemaz nedarbojas tÄ, kÄ programmÄtÄjs bija iecerÄjis.
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);
}
....
}
....
}
Å eit ir dÄ«vains ligzdots nosacÄ«jums: InstallPackageVersions.Count != 1kas bÅ«s vienmÄr patiess. Bieži vien Å”Äds brÄ«dinÄjums norÄda uz loÄ£isku kļūdu kodÄ, bet citos gadÄ«jumos tas vienkÄrÅ”i norÄda uz lieku pÄrbaudi.
BrÄ«dinÄjums N7
Analizatora brÄ«dinÄjums: V3001 Ir identiskas apakÅ”izteiksmes 'commandArguments.contains("-apikey")' pa kreisi un pa labi no '||' operators. ArgumentsUtility.cs 42
ProgrammÄtÄjs, kurÅ” uzrakstÄ«ja Å”o koda sadaļu, nokopÄja un ielÄ«mÄja pÄdÄjÄs divas rindiÅas un aizmirsa tÄs rediÄ£Ät. Å Ä« iemesla dÄļ Chocolatey lietotÄji nevarÄja lietot parametru apikey vÄl pÄris veidi. LÄ«dzÄ«gi iepriekÅ” minÄtajiem parametriem es varu piedÄvÄt Å”Ädas iespÄjas:
KopÄÅ”anas un ielÄ«mÄÅ”anas kļūdÄm ir liela iespÄja agrÄk vai vÄlÄk parÄdÄ«ties jebkurÄ projektÄ ar lielu avota koda daudzumu, un viens no labÄkajiem rÄ«kiem to novÄrÅ”anai ir statiskÄ analÄ«ze.
Analizatora brÄ«dinÄjums: V3095 [CWE-476] Objekts "installedPackage" tika izmantots, pirms tas tika pÄrbaudÄ«ts pret nulli. Kontrolrindas: 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)
{
....
}
....
}
Klasiska kļūda: objekts vispirms instalÄta pakotne tiek izmantots un pÄc tam pÄrbaudÄ«ts nulle. Å Ä« diagnostika informÄ par vienu no divÄm programmas problÄmÄm: vai nu instalÄta pakotne nekad nav vienlÄ«dzÄ«gs nulle, kas ir apÅ”aubÄms, un tad pÄrbaude ir lieka, pretÄjÄ gadÄ«jumÄ kodÄ var rasties nopietna kļūda - mÄÄ£inÄjums piekļūt nulles atsaucei.
SecinÄjums
TÄpÄc esam spÄruÅ”i vÄl vienu nelielu soli ā tagad PVS-Studio lietoÅ”ana ir kļuvusi vÄl vienkÄrÅ”Äka un ÄrtÄka. VÄlos arÄ« teikt, ka Chocolatey ir labs pakotÅu pÄrvaldnieks ar nelielu skaitu kļūdu kodÄ, kuru varÄtu bÅ«t vÄl mazÄk, lietojot PVS-Studio.
MÄs jÅ«s aicinÄm download un izmÄÄ£iniet PVS-Studio. RegulÄra statiskÄ analizatora izmantoÅ”ana uzlabos jÅ«su komandas izstrÄdÄtÄ koda kvalitÄti un uzticamÄ«bu un palÄ«dzÄs novÄrst daudzas nulles dienas ievainojamÄ«bas.
PS
Pirms publicÄÅ”anas rakstu nosÅ«tÄ«jÄm Chocolatey izstrÄdÄtÄjiem, un viÅi to labi saÅÄma. MÄs neatradÄm neko kritisku, taÄu viÅiem, piemÄram, patika atrastÄ kļūda saistÄ«bÄ ar āapi-keyā atslÄgu.