
JĂ€tkame PVS-Studio kasutamise mugavuse suurendamist. NĂŒĂŒd on meie analĂŒsaator saadaval Chocolatey's, Windowsi pakihalduris. Usume, et see lihtsustab PVS-Studio juurutamist, eriti pilveteenustes. Et mitte liiga kaugele minna, kontrollime Chocolatey puhaskoodi. CI sĂŒsteemina kasutatakse Azure DevOps'i.
Siin on loetelu teistest meie artiklitest pilvesĂŒsteemide integreerimise teemal:
Soovitan tutvuda esimesega artikliga Azure DevOps'i integreerimise kohta, kuna mÔned punktid on siin vÀlja jÀetud, et mitte korduda.
Nii et selle artikli kangelased on:
â staatiline koodi analĂŒĂŒsi tööriist, mis on mĂ”eldud C, C++, C# ja Java keeles kirjutatud programmide vigade ja vĂ”imalike haavatavuste tuvastamiseks. Toimib 64-bitistes sĂŒsteemides Windowsis, Linuxis ja macOS-is ning suudab analĂŒĂŒsida koodi, mis on mĂ”eldud 32-bitistele, 64-bitistele ja sisseehitatud ARM-plaatidele. Kui proovite kodu staatiset analĂŒĂŒsi esmakordselt oma projektide kontrollimiseks, soovitame tutvuda kuidas kiiresti vaadata kĂ”ige huvitavamaid PVS-Studio hoiatuseid ja hinnata selle tööriista vĂ”imalusi.
â kogum pilveteenuseid, mis katab kogu arendusprotsessi. Selle platvormi koosseisu kuuluvad sellised tööriistad nagu Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, mis aitavad kiirendada tarkvara loomise protsessi ja tĂ”sta selle kvaliteeti.
â avatud lĂ€htekoodiga paketihaldur Windowsile. Projekti eesmĂ€rk on automatiseerida kogu tarkvara elutsĂŒkkel alates installimisest kuni vĂ€rskendamise ja eemaldamiseni Windowsi operatsioonisĂŒsteemides.
Chocolatey kasutamisest
Vaata, kuidas installida paketihaldurit ise, leiate selle . TĂ€ielik installatsiooni dokumentatsioon analĂŒsaatori jaoks on saadaval jaotises âInstalleerimine Chocolatey paketihalduri abilâ. Kordan lĂŒhidalt mĂ”ned seal olevad punktid.
Viimane versioon analĂŒsaatori installimiseks kasutada kĂ€sku:
choco install pvs-studioKĂ€sku konkreetse versiooni PVS-Studio paketi installimiseks:
choco install pvs-studio --version=7.05.35617.2075Vaikimisi installitakse ainult analĂŒsaatori tuum â komponent Core. KĂ”iki teisi lippe (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) saab edastada âpackage-parameters abil.
KĂ€sku, mis installib analĂŒsaatori Visual Studio 2019 pistikprogrammiga:
choco install pvs-studio --package-parameters="'/MSVS2019'"NĂŒĂŒd vaatame analĂŒsaatori mugavat kasutamist Azure DevOps'i all.
Seadistamine
MĂ€letan, et selliste punktide, nagu konto registreerimine, Build Pipeline'i loomine ja konto sĂŒnkroonimine GitHub'is oleva projektiga, puhul on eraldi . Meie seadistus algab kohe konfiguratsioonifaili kirjutamisest.
Alustame kÀivitustriggeri seadistamisega, mÀrkides, et kÀivitame ainult muudatuste korral master haru:
trigger:
- masterJĂ€rgmiseks peame valima virtuaalmasina. Praegu on see Microsofti hostitud agent koos Windows Server 2019 ja Visual Studio 2019.
pool:
vmImage: 'windows-latest'Liigume edasi konfiguratsioonifaili (plokk steps). Kuigi virtuaalmasinasse ei saa paigaldada juhuslikku tarkvara, ei lisanud ma Docker konteinerit. Saame lisada Chocolatey laiendina Azure DevOpsi. Selleks liigume jÀrgmist mööda . Vajutame Saa tasuta. Edasi, kui olete juba sisse logitud, valige lihtsalt oma konto, kui ei, siis tehke kÔik see uuesti pÀrast sisselogimist.

Siin tuleb valida, kuhu me laienduse lisame, ja vajutada nuppu Installeerida.

PĂ€rast edukat installimist vajutame Proceed to organization:

NĂŒĂŒd on vĂ”imalik nĂ€ha Chocolatey ĂŒlesande mallimist aknas tasks konfiguratsioonifaili redigeerimise ajal azure-pipelines.yml:

Vajutame Chocolatey peale ja nÀeme vÀljade nimekirja:

Siin peame valima install kĂ€skude vĂ€ljal. VĂ€ljas Nuspec File Name mĂ€rgime vajaliku paketi nime â pvs-studio. Kui versiooni ei nĂ€idata, installitakse viimane, mis meile tĂ€ielikult sobib. Vajutame nuppu add ja nĂ€eme konfiguratsioonifailis moodustunud ĂŒlesannet.
steps:
- task: ChocolateyCommand@0
inputs:
command: 'install'
installPackageId: 'pvs-studio'Liigume edasi meie faili pÔhiosa juurde:
- task: CmdLine@2
inputs:
script: NĂŒĂŒd peame looma analĂŒsaatori litsentsifaili. Siin PVSNAME ja PVSKEY â muutujate nimed, mille vÀÀrtused mÀÀrame seadistustes. Need salvestavad PVS-Studio kasutajanime ja litsentsivĂ”tme. Nende vÀÀrtuste seadmiseks avame menĂŒĂŒ Variables->New variable. Loome muutujad PVSNAME kasutajanime ja PVSKEY analĂŒĂŒsi vĂ”tme jaoks. Ărge unustage mĂ€rkida Keep this value secret kuna PVSKEY. KĂ€skluse kood:
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials
âu $(PVSNAME) ân $(PVSKEY)Kogume projekti kokku bat-faili abil, mis asub hoidlas:
call build.batLoome kausta, kuhu paigutatakse analĂŒsaatori töö tulemused:
call mkdir PVSTestResultsKĂ€ivitame projekti analĂŒĂŒsi:
call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe"
ât .srcchocolatey.sln âo .PVSTestResultsChoco.plog Konverteerime meie raporti html formaati PlogConverteri utiliidi abil:
call "C:Program Files (x86)PVS-StudioPlogConverter.exe"
ât html âo PVSTestResults .PVSTestResultsChoco.plogNĂŒĂŒd tuleb luua ĂŒlesanne, et raport saaks eksportida.
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()TÀielik konfiguratsioonifail nÀeb vÀlja selline:
kÀivitus:
- master
hulk:
vmImage: 'windows-latest'
sammud:
- ĂŒlesanne: ChocolateyCommand@0
sisendid:
kÀsk: 'install'
installPackageId: 'pvs-studio'
- ĂŒlesanne: CmdLine@2
sisendid:
skript: |
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
- ĂŒlesanne: PublishBuildArtifacts@1
sisendid:
pathToPublish: PVSTestResults
artifactName: PVSTestResults
condition: always()KlĂ”psame Salvesta->Salvesta->KĂ€ivita ĂŒlesande kĂ€ivitamiseks. Laadime aruande alla, minnes ĂŒlesande vahele.
Chocolatey projekt sisaldab kokku 37615 rida C# koodi. Vaadake mÔningaid leitud vigu.
Kontrollimise tulemused
Hoiatus N1
AnalĂŒsaatori hoiatus: Muutuja 'Provider' on mÀÀratud iseendale. CrytpoHashProviderSpecs.cs 38
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}AnalĂŒsaator leidis, et muutuja on mÀÀratud iseendale, mis ei ole mĂ”ttekas. TĂ”enĂ€oliselt peaks ĂŒhe neist muutujatest olema mĂ”ni teine. VĂ”i on see trĂŒkkimisviga, ja ĂŒleliigse mÀÀramise saab lihtsalt kustutada.
Hoiatus N2
AnalĂŒsaatori hoiatus: [CWE-480] '&&' operaator hindab mĂ”lemat operand. VĂ”ib-olla tuleks kasutada hoopis lĂŒhikest '&&' operaatorit. 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;
}
}Operaatori erinevus & operaatorist && on see, et kui vasak pool vÀljendist on false, siis hinnatakse ikkagi paremat poolt, mis tÀhendab antud juhul liigseid meetodi kutsumise system.directory_exists.
KÀesolevas fragmentis on see pisike puudus. Jah, seda tingimust on vÔimalik optimeerida, asendades operaatori & amp; operaatoriga &&, kuid praktiliselt ei mÔjuta see midagi. Siiski, teistes olukordades vÔib segadus & amp; ja && vahel tekitada tÔsiseid probleeme, kui parempoolne vÀljend töötab vale/keelatud vÀÀrtustega. NÀiteks meie vigade kogus, , on selline juhtum:
if ((k < nct) & (s[k] != 0.0))Isegi kui indeks k on korrektne, seda kasutatakse massiivi elemendile juurdepÀÀsuks. Selle tulemusena genereeritakse erand IndexOutOfRangeException.
Hoiatused N3, N4
AnalĂŒsaatori hoiatus: [CWE-571] VĂ€ljend âshortPromptâ on alati tĂ”ene. InteractivePrompt.cs 101
AnalĂŒsaatori hoiatus: [CWE-571] VĂ€ljend âshortPromptâ on alati tĂ”ene. 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
....
}
....
}Antud juhul on olemas kummaline loogika ternaaroperaatori töö. Vaatame lÀhemalt: kui tingimus, mille ma tÀhistasin numbriga 1, tÀitub, siis liigume tingimusele 2, mis on alati true, seega tÀitub rida 3. Kui aga tingimus 1 osutub vale, liigume reale, mille ma mÀrkisin numbriga 4, mille tingimus on samuti alati true, seega tÀitub rida 5. Seega tingimused, mis on mÀrgitud kommentaariga 0, ei tÀitu kunagi, mis ei pruugi olla just see loogika, millele programmeerija lootis.
Hoiatus N5
AnalĂŒsaatori hoiatus: [CWE-783] VĂ”ib-olla töötas â?:â operaator ootamatult. Selle prioriteet on madalam kui teiste operaatorite prioriteet selle tingimuse osas. 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 = 0 && j != 0 ? description [j++ - 1] == '{' : false);
....
return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
}
}Diagnostika toimis read:
while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)Kuna muutuja j initsialiseeritakse paar rida ĂŒle nulliga, tagastab ternaarne operaator vÀÀrtuse false. Selle tingimuse tĂ”ttu tĂ€idetakse tsĂŒkli keha ainult ĂŒks kord. Tundub, et see koodijupp ei tööta nii, nagu arendaja mĂ”tles.
Hoiatamine N6
AnalĂŒsaatori hoiatus: [CWE-571] Avaldis âinstalledPackageVersions.Count != 1â on alati tĂ”ene. 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);
}
....
}
....
}Siin on kummaline sisemine tingimus: installedPackageVersions.Count != 1, mis saab alati olema true. Selline hoiatus viitab sageli koodis loogilisele veale ja teistes olukordades lihtsalt ĂŒleliigsele kontrollimisele.
Hoiatus N7
AnalĂŒsaatori hoiatus: Vasakul ja paremal â||â operaatori pool on identsed alamvĂ€ljendid â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");
}Koda kirjutanud programmeerija kopeeris kaks viimast rida ja unustas need redigeerida. SeetĂ”ttu kaotasid Chocolatey kasutajad vĂ”imaluse kasutada parameetrit apikey veel paari viisi. Sarnaselt ĂŒlaltoodud parameetritele, vĂ”in soovitada jĂ€rgmisi variante:
commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");Kopeerige ja kleepige vigu vĂ”ivad igasugustes projektides, millel on suur hulk lĂ€htekoodi, varem vĂ”i hiljem ilmneda ja ĂŒks parimaid viise nende vastu vĂ”itlemiseks on staatiline analĂŒĂŒs.
P.S. Ja nagu alati, kipub see viga ilmuma paljude ridade tingimuste lÔpus :). Vaadake postitust "".
Hoiatus N8
AnalĂŒsaatori hoiatus: [CWE-476] 'installedPackage' objekti kasutati enne, kui see oli nulliga vĂ”rreldud. Kontrollige ridu: 910, 917. NugetService.cs 910
public virtual ConcurrentDictionary 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)
{
....
}
....
}Klassikaline viga: kĂ”igepealt objekti installedPackage kasutatakse ja seejĂ€rel kontrollitakse null. See diagnostika rÀÀgib meile kahest vĂ”imalikust probleemist programmis: kas installedPackage ei ole kunagi vĂ”rdne null, mis on kahtlane, ja siis on kontroll ĂŒlearune, vĂ”i me vĂ”ime potentsiaalselt saada tĂ”sise vea koodis â katse nullviidale juurdepÀÀseda.
KokkuvÔte
Nii oleme teinud veel ĂŒhe vĂ€ikese sammu â nĂŒĂŒd on PVS-Studio kasutamine muutunud veelgi lihtsamaks ja mugavamaks. Samuti tahan mainida, et Chocolatey on hea pakihaldur, millel on ainult vĂ€heseid koodivigu, mida PVS-Studio kasutamine vĂ”iks veelgi vĂ€hendada.
Kutsume teid katsetama PVS-Studio't. Statilise analĂŒsaatori regulaarselt kasutamine parandab teie meeskonna arendatava koodi kvaliteeti ja usaldusvÀÀrsust ning aitab ennetada paljusid .
P.S.
Enne avaldamist saatsime artikli Chocolatey arendajatele ja nad vĂ”tsid selle hĂ€sti vastu. Meie poolt ei leitud midagi kriitilist, kuid nĂ€iteks neile meeldis meie leitud viga, mis oli seotud âapi-keyâ vĂ”tmega.
Kui soovite seda artiklit ingliskeelse publikuga jagada, kasutage palun tÔlke linki: Vladislav Stolyarov. .
Allikas: habr.com
