PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps
Vi fortsÀtter att göra det bekvÀmare att anvÀnda PVS-Studio. VÄr analysator Àr nu tillgÀnglig i Chocolatey, en pakethanterare för Windows. Vi tror att detta kommer att underlÀtta utbyggnaden av PVS-Studio, sÀrskilt i molntjÀnster. För att inte gÄ lÄngt, lÄt oss kolla kÀllkoden för samma Chocolatey. Azure DevOps kommer att fungera som ett CI-system.

HÀr Àr en lista över vÄra andra artiklar om integration med molnsystem:

Jag rÄder dig att vara uppmÀrksam pÄ den första artikeln om integration med Azure DevOps, eftersom i det hÀr fallet vissa punkter utelÀmnas för att inte dupliceras.

SÄ, hjÀltarna i denna artikel:

PVS-studio Àr ett statiskt kodanalysverktyg utformat för att identifiera fel och potentiella sÄrbarheter i program skrivna i C, C++, C# och Java. Körs pÄ 64-bitars Windows-, Linux- och macOS-system och kan analysera kod designad för 32-bitars, 64-bitars och inbÀddade ARM-plattformar. Om det hÀr Àr första gÄngen du provar statisk kodanalys för att kontrollera dina projekt rekommenderar vi att du bekantar dig med artikel om hur du snabbt kan se de mest intressanta PVS-Studio-varningarna och utvÀrdera det hÀr verktygets funktioner.

Azure DevOps — en uppsĂ€ttning molntjĂ€nster som gemensamt tĂ€cker hela utvecklingsprocessen. Den hĂ€r plattformen innehĂ„ller verktyg som Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, som lĂ„ter dig pĂ„skynda processen att skapa programvara och förbĂ€ttra dess kvalitet.

Chocolaty Àr en öppen kÀllkodspakethanterare för Windows. MÄlet med projektet Àr att automatisera hela mjukvarans livscykel frÄn installation till uppdatering och avinstallation pÄ Windows operativsystem.

Om att anvÀnda Chocolatey

Du kan se hur du installerar sjÀlva pakethanteraren hÀr lÀnk. FullstÀndig dokumentation för installation av analysatorn finns pÄ lÀnk Se avsnittet Installation med Chocolatey Package Manager. Jag ska kort upprepa nÄgra punkter dÀrifrÄn.

Kommando för att installera den senaste versionen av analysatorn:

choco install pvs-studio

Kommando för att installera en specifik version av PVS-Studio-paketet:

choco install pvs-studio --version=7.05.35617.2075

Som standard Àr bara kÀrnan i analysatorn, Core-komponenten, installerad. Alla andra flaggor (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) kan skickas med --package-parametrar.

Ett exempel pÄ ett kommando som installerar en analysator med en plugin för Visual Studio 2019:

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

LÄt oss nu titta pÄ ett exempel pÄ bekvÀm anvÀndning av analysatorn under Azure DevOps.

justering

LÄt mig pÄminna dig om att det finns ett separat avsnitt om sÄdana problem som att registrera ett konto, skapa en Build Pipeline och synkronisera ditt konto med ett projekt som finns i GitHub-förvaret. artikel. VÄr installation kommer omedelbart att börja med att skriva en konfigurationsfil.

LÄt oss först stÀlla in en startutlösare, vilket indikerar att vi endast startar för Àndringar i Master gren:

trigger:
- master

DÀrefter mÄste vi vÀlja en virtuell maskin. För tillfÀllet kommer det att vara en Microsoft-vÀrd agent med Windows Server 2019 och Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

LÄt oss gÄ vidare till brödtexten i konfigurationsfilen (block steg). Trots det faktum att du inte kan installera godtycklig programvara i en virtuell maskin, har jag inte lagt till en Docker-behÄllare. Vi kan lÀgga till Chocolatey som en förlÀngning för Azure DevOps. För att göra detta, lÄt oss gÄ till lÀnk. Klick FÄ det gratis. DÀrefter, om du redan Àr auktoriserad, vÀlj helt enkelt ditt konto, och om inte, gör sedan samma sak efter auktorisering.

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

HÀr mÄste du vÀlja var vi ska lÀgga till tillÀgget och klicka pÄ knappen installera.

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

Efter lyckad installation, klicka FortsÀtt till organisation:

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

Du kan nu se mallen för Chokladuppgiften i fönstret uppgifter nÀr du redigerar en konfigurationsfil azure-pipelines.yml:

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

Klicka pÄ Choklad och se en lista med fÀlt:

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

HĂ€r mĂ„ste vi vĂ€lja installera i fĂ€lt med lagen. I Nuspec filnamn ange namnet pĂ„ det önskade paketet – pvs-studio. Om du inte anger version kommer den senaste att installeras, vilket passar oss helt. LĂ„t oss trycka pĂ„ knappen lĂ€gga till och vi kommer att se den genererade uppgiften i konfigurationsfilen.

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

LÄt oss sedan gÄ vidare till huvuddelen av vÄr fil:

- task: CmdLine@2
  inputs:
    script: 

Nu mĂ„ste vi skapa en fil med analysatorlicensen. HĂ€r PVSNAME Đž PVSKEY – namn pĂ„ variabler vars vĂ€rden vi anger i instĂ€llningarna. De kommer att lagra PVS-Studio-inloggningen och licensnyckeln. För att stĂ€lla in deras vĂ€rden, öppna menyn Variabler->Ny variabel. LĂ„t oss skapa variabler PVSNAME för inloggning och PVSKEY för analysatornyckeln. Glöm inte att markera rutan HĂ„ll detta vĂ€rde hemligt för PVSKEY. Kommandokod:

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

LÄt oss bygga projektet med bat-filen som finns i förvaret:

сall build.bat

LÄt oss skapa en mapp dÀr filer med resultaten frÄn analysatorn kommer att lagras:

сall mkdir PVSTestResults

LÄt oss börja analysera projektet:

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

Vi konverterar vÄr rapport till html-format med hjÀlp av PlogХonverter-verktyget:

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

Nu mÄste du skapa en uppgift sÄ att du kan ladda upp rapporten.

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

Den fullstÀndiga konfigurationsfilen ser ut sÄ hÀr:

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

LÄt oss klicka Spara->Spara->Kör att köra uppgiften. LÄt oss ladda ner rapporten genom att gÄ till fliken uppgifter.

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

Chocolatey-projektet innehÄller endast 37615 rader med C#-kod. LÄt oss titta pÄ nÄgra av de fel som hittats.

Testresultat

Varning N1

Analysatorvarning: V3005 Variabeln 'Provider' tilldelas sig sjÀlv. CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

Analysatorn upptÀckte en tilldelning av variabeln till sig sjÀlv, vilket inte Àr vettigt. Troligtvis borde det finnas nÄgon annan i stÀllet för en av dessa variabler. Tja, eller sÄ Àr detta ett stavfel, och den extra uppgiften kan helt enkelt tas bort.

Varning N2

Analysatorvarning: V3093 [CWE-480] Operatören '&' utvÀrderar bÄda operanderna. Kanske bör en kortslutnings-&&-operatör anvÀndas istÀllet. 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;
  }
}

Operatörsskillnad & frÄn operatören && Àr att om vÀnster sida av uttrycket Àr falsk, dÄ kommer den högra sidan fortfarande att berÀknas, vilket i det hÀr fallet innebÀr onödiga metodanrop system.directory_exists.

I det betraktade fragmentet Àr detta ett mindre fel. Ja, detta tillstÄnd kan optimeras genom att ersÀtta &-operatören med &&-operatören, men ur praktisk synvinkel pÄverkar detta ingenting. Men i andra fall kan förvÀxling mellan & och && orsaka allvarliga problem nÀr den högra sidan av uttrycket behandlas med felaktiga/ogiltiga vÀrden. Till exempel, i vÄr felsamling, identifieras med V3093-diagnostik, det finns det hÀr fallet:

if ((k < nct) & (s[k] != 0.0))

Även om indexet k Ă€r felaktig kommer den att anvĂ€ndas för att komma Ă„t ett arrayelement. Som ett resultat kommer ett undantag att kastas IndexOutOfRangeException.

Varningar N3, N4

Analysatorvarning: V3022 [CWE-571] Uttrycket "shortPrompt" Àr alltid sant. InteractivePrompt.cs 101
Analysatorvarning: V3022 [CWE-571] Uttrycket "shortPrompt" Àr alltid sant. 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
    ....
  }
  ....
}

I det hÀr fallet finns det en konstig logik bakom driften av den ternÀra operatören. LÄt oss ta en nÀrmare titt: om villkoret jag markerade med nummer 1 Àr uppfyllt, sÄ gÄr vi vidare till villkor 2, som alltid Àr sann, vilket betyder att rad 3 kommer att exekveras. Om villkor 1 visar sig vara falskt, kommer vi att gÄ till raden markerad med nummer 4, villkoret i vilket ocksÄ alltid Àr sann, vilket betyder att rad 5 kommer att exekveras. SÄledes kommer villkoren markerade med kommentar 0 aldrig att uppfyllas, vilket kanske inte Àr exakt den operationslogik som programmeraren förvÀntade sig.

Varning N5

Analysatorvarning: V3123 [CWE-783] Kanske fungerar '?:'-operatören pÄ ett annat sÀtt Àn det förvÀntades. Dess prioritet Àr lÀgre Àn prioritet för andra operatörer i dess tillstÄnd. 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);
  }
}

Diagnostiken fungerade för linjen:

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

Eftersom variabeln j nÄgra rader ovan initieras till noll, kommer den ternÀra operatorn att returnera vÀrdet falsk. PÄ grund av detta tillstÄnd kommer slingans kropp endast att exekveras en gÄng. Det förefaller mig som om den hÀr kodbiten inte alls fungerar som programmeraren tÀnkt sig.

Varning N6

Analysatorvarning: V3022 [CWE-571] Uttrycket 'installedPackageVersions.Count != 1' Àr alltid sant. 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);
    }
    ....
  }
  ....
}

Det finns ett konstigt kapslat tillstÄnd hÀr: installedPackageVersions.Count != 1vilket alltid kommer att vara sann. Ofta indikerar en sÄdan varning ett logiskt fel i koden, och i andra fall indikerar det helt enkelt redundant kontroll.

Varning N7

Analysatorvarning: V3001 Det finns identiska underuttryck 'commandArguments.contains("-apikey")' till vÀnster och till höger om '||' operatör. 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");
}

Programmeraren som skrev den hÀr koden kopierade och klistrade in de tvÄ sista raderna och glömde att redigera dem. PÄ grund av detta kunde Chocolatey-anvÀndare inte tillÀmpa parametern apikey ett par sÀtt till. I likhet med parametrarna ovan kan jag erbjuda följande alternativ:

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

Kopiera-klistra-fel har stor chans att dyka upp förr eller senare i alla projekt med en stor mÀngd kÀllkod, och ett av de bÀsta verktygen för att bekÀmpa dem Àr statisk analys.

PS Och som alltid tenderar detta fel att visas i slutet av ett flerradsvillkor :). Se publikationen "Sista raden effekt".

Varning N8

Analysatorvarning: V3095 [CWE-476] Objektet 'installedPackage' anvÀndes innan det verifierades mot null. Kontrollera linjer: 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)
  {
    ....
  }
  ....
}

Klassiskt misstag: objekt först installerat paket anvÀnds och sedan kontrolleras för null. Denna diagnostik berÀttar om ett av tvÄ problem i programmet: antingen installerat paket aldrig lika null, vilket Àr tveksamt, och dÄ Àr kontrollen överflödig, eller sÄ kan vi potentiellt fÄ ett allvarligt fel i koden - ett försök att komma Ät en nollreferens.

Slutsats

SÄ vi har tagit ytterligare ett litet steg - nu har det blivit Ànnu enklare och bekvÀmare att anvÀnda PVS-Studio. Jag skulle ocksÄ vilja sÀga att Chocolatey Àr en bra pakethanterare med ett litet antal fel i koden, som kan vara Ànnu fÀrre nÀr man anvÀnder PVS-Studio.

Vi bjuder in dig hÀmta och prova PVS-Studio. Regelbunden anvÀndning av en statisk analysator kommer att förbÀttra kvaliteten och tillförlitligheten hos koden som ditt team utvecklar och hjÀlpa till att förhindra mÄnga noll dagars sÄrbarheter.

PS

Innan publiceringen skickade vi artikeln till Chocolatey-utvecklarna och de tog emot den vÀl. Vi hittade inget kritiskt, men de, till exempel, gillade buggen vi hittade relaterad till "api-key"-nyckeln.

PVS-Studio Àr nu i Chocolatey: kollar Chocolatey under Azure DevOps

Om du vill dela den hÀr artikeln med en engelsktalande publik, anvÀnd gÀrna översÀttningslÀnken: Vladislav Stolyarov. PVS-Studio Àr nu i Chocolatey: Checking Chocolatey under Azure DevOps.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster