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:

choco install pvs-studio --version=7.05.35617.2075

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:

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

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.

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

Itt ki kell választania, hogy hova adjuk hozzá a bővítményt, és kattintson a gombra felszerel.

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

A sikeres telepítés után kattintson a gombra Tovább a szervezéshez:

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

Most már láthatja a Chocolatey feladat sablonját az ablakban feladatok konfigurációs fájl szerkesztésekor azure-pipelines.yml:

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

Kattintson a Chocolatey-re, és tekintse meg a mezők listáját:

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

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.

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

Ezután térjünk át fájlunk fő részére:

- task: CmdLine@2
  inputs:
    script: 

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:

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

Építsük fel a projektet a lerakatban található bat fájl segítségével:

сall build.bat

Hozzon létre egy mappát, ahol az elemző eredményeit tartalmazó fájlok kerülnek tárolásra:

сall mkdir PVSTestResults

Kezdjük a projekt elemzésével:

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

Jelentésünket html formátumba konvertáljuk a PlogСonverter segédprogrammal:

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

Most létre kell hoznia egy feladatot, hogy feltölthesse a jelentést.

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

A teljes konfigurációs fájl így néz ki:

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

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 PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

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

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;
  }
}

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

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
    ....
  }
  ....
}

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);
  }
}

A diagnosztika a következő vonalon működött:

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

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

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");
}

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:

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

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.

A PVS-Studio már a Chocolateyben: a Chocolatey ellenőrzése az Azure DevOps alatt

Ha meg szeretné osztani ezt a cikket egy angolul beszélő közönséggel, használja a fordítási linket: Vladislav Stolyarov. A PVS-Studio már elérhető a Chocolateyben: A Chocolatey ellenőrzése az Azure DevOps alatt.

Forrás: will.com

Hozzászólás