
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:
À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 om hur du snabbt kan se de mest intressanta PVS-Studio-varningarna och utvÀrdera det hÀr verktygets funktioner.
â 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.
À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 . FullstÀndig dokumentation för installation av analysatorn finns pÄ 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-studioKommando för att installera en specifik version av PVS-Studio-paketet:
choco install pvs-studio --version=7.05.35617.2075Som 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. . 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:
- masterDÀ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 . 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.

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

Efter lyckad installation, klicka FortsÀtt till organisation:

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

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

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.batLĂ„t oss skapa en mapp dĂ€r filer med resultaten frĂ„n analysatorn kommer att lagras:
Ńall mkdir PVSTestResultsLĂ„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.plogNu 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.
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: 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: [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, , 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: [CWE-571] Uttrycket "shortPrompt" Àr alltid sant. InteractivePrompt.cs 101
Analysatorvarning: [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: [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: [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: 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 "".
Varning N8
Analysatorvarning: [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 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 .
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.
Om du vill dela den hÀr artikeln med en engelsktalande publik, anvÀnd gÀrna översÀttningslÀnken: Vladislav Stolyarov. .
KĂ€lla: will.com
