ProHoster > A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt
A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt
Továbbra is kényelmesebbé tesszük a PVS-Studio használatát. Analizátorunk már elérhető a Chocolateyben, a Windows csomagkezelőjében. Úgy gondoljuk, hogy ez megkönnyíti a PVS-Studio telepítését, különösen a felhőszolgáltatásokban. Hogy ne menjünk messzire, nézzük meg ugyanannak a Chocolateynek a forráskódját. Az Azure DevOps CI-rendszerként fog működni.
Íme a felhőrendszerekkel való integráció témájában írt további cikkeink listája:
Azt tanácsolom, hogy figyeljen az Azure DevOps-szal való integrációról szóló első cikkre, mivel ebben az esetben néhány pontot kihagyunk, hogy ne duplikáljanak.
Tehát ennek a cikknek a hősei:
PVS-Stúdió egy statikus kódelemző eszköz, amely a C, C++, C# és Java nyelven írt programok hibáinak és lehetséges sebezhetőségeinek azonosítására szolgál. 64 bites Windows, Linux és macOS rendszereken fut, és képes elemezni a 32 bites, 64 bites és beágyazott ARM platformokhoz tervezett kódot. Ha ez az első alkalom, hogy statikus kódelemzést próbál ki projektjei ellenőrzésére, javasoljuk, hogy ismerkedjen meg cikk arról, hogyan tekintheti meg gyorsan a legérdekesebb PVS-Studio figyelmeztetéseket, és hogyan értékelheti ennek az eszköznek a képességeit.
Azure DevOps — a teljes fejlesztési folyamatot közösen lefedő felhőszolgáltatások összessége. Ez a platform olyan eszközöket tartalmaz, mint az Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, amelyek lehetővé teszik a szoftverek létrehozásának folyamatának felgyorsítását és minőségének javítását.
csokis egy nyílt forráskódú csomagkezelő Windowshoz. A projekt célja a teljes szoftver életciklus automatizálása a telepítéstől a frissítésig és eltávolításig Windows operációs rendszereken.
A Chocolatey használatáról
Itt láthatja, hogyan telepítheti magát a csomagkezelőt link. Az analizátor telepítéséhez szükséges teljes dokumentáció a következő címen érhető el link Lásd a Telepítés a Chocolatey csomagkezelő használatával című részt. Röviden megismétlem néhány pontot onnan.
Parancs az analizátor legújabb verziójának telepítéséhez:
choco install pvs-studio
A PVS-Studio csomag egy adott verziójának telepítésére szolgáló parancs:
Alapértelmezés szerint csak az analizátor magja, a Core komponens van telepítve. Az összes többi jelző (Önálló, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) a --package-parameters használatával továbbítható.
Példa egy parancsra, amely elemzőt telepít a Visual Studio 2019 beépülő moduljával:
Most nézzünk meg egy példát az elemző kényelmes használatára az Azure DevOps alatt.
beállítás
Hadd emlékeztesselek arra, hogy van egy külön szakasz az olyan problémákról, mint a fiók regisztrálása, a Build Pipeline létrehozása és a fiók szinkronizálása a GitHub-tárházban található projekttel. cikk. Beállításunk azonnal egy konfigurációs fájl írásával kezdődik.
Először állítsunk be egy indítási triggert, amely azt jelzi, hogy csak a változás miatt indítunk el mester ág:
trigger:
- master
Ezután ki kell választanunk egy virtuális gépet. Egyelőre Microsoft által üzemeltetett ügynök lesz a Windows Server 2019 és a Visual Studio 2019 rendszerrel:
pool:
vmImage: 'windows-latest'
Térjünk át a konfigurációs fájl törzsére (block lépések). Annak ellenére, hogy nem telepíthet tetszőleges szoftvert egy virtuális gépre, nem adtam hozzá Docker-tárolót. Hozzáadhatjuk a Chocolatey-t az Azure DevOps bővítményeként. Ehhez menjünk a link. Kattintson Ingyen megkapni. Ezután, ha már feljogosított, egyszerűen válassza ki a fiókját, és ha nem, tegye meg ugyanezt az engedélyezés után.
Itt ki kell választania, hogy hova adjuk hozzá a bővítményt, és kattintson a gombra felszerel.
A sikeres telepítés után kattintson a gombra Tovább a szervezéshez:
Most már láthatja a Chocolatey feladat sablonját az ablakban feladatok konfigurációs fájl szerkesztésekor azure-pipelines.yml:
Kattintson a Chocolatey-re, és tekintse meg a mezők listáját:
Itt kell kiválasztanunk telepíteni mezőnyben a csapatokkal. BAN BEN Nuspec fájlnév adja meg a kívánt csomag nevét – pvs-studio. Ha nem adja meg a verziót, akkor a legfrissebb lesz telepítve, ami teljesen megfelel nekünk. Nyomjuk meg a gombot hozzá és látni fogjuk a generált feladatot a konfigurációs fájlban.
Most létre kell hoznunk egy fájlt az analizátor licencével. Itt PVSNAME и PVSKEY – azoknak a változóknak a neve, amelyek értékeit a beállításokban adjuk meg. Ők fogják tárolni a PVS-Studio bejelentkezési adatait és licenckulcsát. Az értékek beállításához nyissa meg a menüt Változók->Új változó. Hozzunk létre változókat PVSNAME a bejelentkezéshez és PVSKEY az elemző kulcshoz. Ne felejtse el bejelölni a négyzetet Tartsa titokban ezt az értéket a PVSKEY. Parancs kód:
Kattintsunk Mentés->Mentés->Futtatás a feladat futtatásához. Töltsük le a jelentést a feladatok lapra lépve.
A Chocolatey projekt mindössze 37615 sornyi C# kódot tartalmaz. Nézzünk meg néhány talált hibát.
Vizsgálati eredmények
Figyelmeztetés N1
Az elemző figyelmeztetése: V3005 A „Provider” változó önmagához van hozzárendelve. CrytpoHashProviderSpecs.cs 38
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
Az analizátor a változó önmagához való hozzárendelését észlelte, aminek nincs értelme. Valószínűleg ezen változók egyike helyett egy másiknak kell lennie. Nos, vagy ez elírás, és az extra hozzárendelés egyszerűen eltávolítható.
Figyelmeztetés N2
Az elemző figyelmeztetése: V3093 [CWE-480] Az '&' operátor mindkét operandust kiértékeli. Talán egy rövidzárlatos '&&' operátort kellene helyette használni. Platform.cs 64
Operátori különbség & az üzemeltetőtől && az, hogy ha a kifejezés bal oldala az hamis, akkor továbbra is a jobb oldal kerül kiszámításra, ami ebben az esetben szükségtelen metódushívásokat jelent system.directory_exists.
A vizsgált töredékben ez egy kisebb hiba. Igen, ez a feltétel optimalizálható, ha az & operátort lecseréljük az && operátorra, de gyakorlati szempontból ez semmit nem befolyásol. Más esetekben azonban az & és a && összetévesztése komoly problémákat okozhat, ha a kifejezés jobb oldalát helytelen/érvénytelen értékekkel kezelik. Például a hibagyűjteményünkben A V3093 diagnosztika segítségével azonosították, van ez az eset:
if ((k < nct) & (s[k] != 0.0))
Még akkor is, ha az index k hibás, akkor egy tömbelem eléréséhez fogja használni. Ennek eredményeként kivételt tesznek IndexOutOfRangeException.
Figyelmeztetések N3, N4
Az elemző figyelmeztetése: V3022 [CWE-571] A 'shortPrompt' kifejezés mindig igaz. InteractivePrompt.cs 101
Az elemző figyelmeztetése: V3022 [CWE-571] A 'shortPrompt' kifejezés mindig igaz. InteractivePrompt.cs 105
Ebben az esetben a hármas operátor működése mögött furcsa logika húzódik meg. Nézzük meg közelebbről: ha az általam 1-es számmal jelölt feltétel teljesül, akkor áttérünk a 2. feltételre, ami mindig igaz, ami azt jelenti, hogy a 3. sor kerül végrehajtásra Ha az 1. feltétel hamisnak bizonyul, akkor a 4-es sorra megyünk, aminek a feltétele is mindig igaz, ami azt jelenti, hogy az 5. sor kerül végrehajtásra, így a 0-s megjegyzéssel jelölt feltételek soha nem teljesülnek, ami nem biztos, hogy pontosan a programozó által elvárt működési logikát jelenti.
Figyelmeztetés N5
Az elemző figyelmeztetése: V3123 [CWE-783] Talán a '?:' operátor a várttól eltérő módon működik. Prioritása alacsonyabb, mint a többi üzemeltető prioritása állapotában. 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);
}
}
Mivel a változó j néhány sorral feljebb nullára inicializálódik, a hármas operátor visszaadja az értéket hamis. Emiatt a ciklus törzse csak egyszer kerül végrehajtásra. Nekem úgy tűnik, hogy ez a kódrészlet egyáltalán nem úgy működik, ahogy a programozó tervezte.
Figyelmeztetés N6
Az elemző figyelmeztetése: V3022 [CWE-571] Az 'installedPackageVersions.Count != 1' kifejezés mindig igaz. 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);
}
....
}
....
}
Van itt egy furcsa beágyazott feltétel: installPackageVersions.Count != 1ami mindig is lesz igaz. Az ilyen figyelmeztetések gyakran logikai hibát jeleznek a kódban, más esetekben pedig egyszerűen redundáns ellenőrzést jeleznek.
Figyelmeztetés N7
Az elemző figyelmeztetése: V3001 Azonos 'commandArguments.contains("-apikey")' részkifejezések találhatók a '||' bal és jobb oldalán. operátor. ArgumentsUtility.cs 42
A programozó, aki ezt a kódrészletet írta, kimásolta és beillesztette az utolsó két sort, és elfelejtette szerkeszteni. Emiatt a Chocolatey felhasználók nem tudták alkalmazni a paramétert apikey még pár módon. A fenti paraméterekhez hasonlóan a következő lehetőségeket tudom ajánlani:
A másolási-beillesztési hibák nagy eséllyel előbb-utóbb megjelennek minden nagy mennyiségű forráskóddal rendelkező projektben, és az egyik legjobb eszköz a leküzdésre a statikus elemzés.
PS És mint mindig, ez a hiba általában egy többsoros feltétel végén jelenik meg :). Lásd a "kiadványt"Utolsó sor effektus".
Figyelmeztetés N8
Az elemző figyelmeztetése: V3095 [CWE-476] Az 'installedPackage' objektumot használták, mielőtt ellenőrizték volna a nullával szemben. Ellenőrző sorok: 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)
{
....
}
....
}
Klasszikus hiba: tárgy az első telepített csomag használják, majd ellenőrzik null. Ez a diagnosztika a program két problémájának egyikéről szól: bármelyikről telepített csomag soha nem egyenlő null, ami kétséges, és akkor az ellenőrzés redundáns, különben komoly hibát kaphatunk a kódban - egy nulla hivatkozás elérésére tett kísérletet.
Következtetés
Tehát újabb kis lépést tettünk – most a PVS-Studio használata még könnyebbé és kényelmesebbé vált. Azt is szeretném elmondani, hogy a Chocolatey egy jó csomagkezelő, kevés kódhibával, ami a PVS-Studio használatakor még kevesebb is lehet.
Meghívjuk Önt letöltése és próbáld ki a PVS-Studiót. A statikus elemző rendszeres használata javítja a csapat által kifejlesztett kód minőségét és megbízhatóságát, és segít megelőzni sok nulladik napi sebezhetőség.
PS
Megjelenés előtt elküldtük a cikket a Chocolatey fejlesztőinek, akik jól fogadták. Nem találtunk semmi kritikát, de nekik például tetszett az a hiba, amit az „api-key” kulcshoz kapcsolódóan találtunk.