I stadiet av oÀndlig kodgranskning eller felsökning, tÀnker man ibland pÄ hur man kan förenkla sitt liv. Efter lite letande, eller kanske av en slump, kan man stöta pÄ det magiska uttrycket: "Statisk analys". LÄt oss titta pÄ vad detta innebÀr och hur det kan interagera med ditt projekt.

Egentligen, om du skriver i nÄgot modernt programmeringssprÄk, har du, Àven utan att veta om det, redan kört det genom en statisk analysator. Det Àr sÄ att varje modern kompilator tillhandahÄller en, om Àn minimal, uppsÀttning av varningar om potentiella problem i koden. Till exempel, nÀr du kompilerar C++-kod i Visual Studio kan du se följande:

I detta utdata ser vi att variabeln var aldrig anvÀndes nÄgonstans i funktionen. SÄ i sjÀlva verket har du nÀstan alltid anvÀnt en enkel statisk kodanalysator. Men till skillnad frÄn professionella analysatorer som Coverity, Klocwork eller PVS-Studio, kan varningarna som kompilatorn ger endast pÄpeka en liten mÀngd problem.
Om du inte vet sÀkert vad statisk analys Àr och hur man implementerar det, , för att fördjupa dig mer i denna metodologi.
Vad behövs statisk analys för?
Kort sagt: hastighet och förenkling.
Statisk analys gör det möjligt att hitta mÀngder av olika problem i koden: frÄn felaktig anvÀndning av sprÄkkonstruktioner till stavfel. Till exempel, istÀllet för
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;du skrev följande kod:
auto x = obj.x;
auto y = obj.y;
auto z = obj.x;Som du ser finns det ett stavfel i den sista raden. Till exempel ger PVS-Studio följande varning:
ĂvervĂ€g att granska korrektheten av anvĂ€ndningen av 'y'-objektet.
Om du vill testa detta fel manuellt, prova ett fÀrdigt exempel pÄ Compiler Explorer: **.
Och som du kanske förstÄr, Àr det inte alltid möjligt att lÀgga mÀrke till sÄdana kodstycken direkt, vilket kan leda till att man sitter fast i felsökning i en timme, förundrad över varför allt verkar sÄ konstigt.
Men detta Ă€r ett uppenbart fel. Vad hĂ€nder om utvecklaren skrev ineffektiv kod eftersom han glömde nĂ„gon nyans av sprĂ„ket? Eller om han helt enkelt slutade med ? Đ ŃĐŸĐ¶Đ°Đ»Đ”ĐœĐžŃ, ĐżĐŸĐŽĐŸĐ±ĐœŃĐ” ŃĐ»ŃŃаО ŃĐŸĐČĐ”ŃŃĐ”ĐœĐœĐŸ ĐŸĐ±ŃĐŽĐ”ĐœĐœŃ Đž Đ»ŃĐČĐžĐœĐ°Ń ŃаŃŃŃ ĐČŃĐ”ĐŒĐ”ĐœĐž ŃŃаŃĐžŃŃŃ ĐœĐ° ŃĐŸ, ŃŃĐŸĐ±Ń ĐŸŃлаЎОŃŃ ŃпДŃĐžŃĐžŃĐœĐŸ ŃĐ°Đ±ĐŸŃаŃŃĐžĐč ĐșĐŸĐŽ, ĐșĐŸŃĐŸŃŃĐč ŃĐŸĐŽĐ”ŃĐ¶ĐžŃ ĐŸĐżĐ”ŃаŃĐșĐž, ŃОпОŃĐœŃĐ” ĐŸŃОбĐșĐž ОлО undefined behavior.
Det var just för dessa situationer som statisk analys uppstod. Det Àr en assistent för utvecklaren som visar pÄ olika problem i koden och förklarar i dokumentationen varför det Àr fel att skriva pÄ det sÀttet, vilka konsekvenser det kan fÄ och hur man ÄtgÀrdar det. HÀr Àr ett exempel pÄ hur det kan se ut: **.
Fler intressanta fel som analysatorn kan upptÀcka kan du hitta i artiklar:
Nu, efter att ha lÀst detta material och övertygat dig om fördelarna med statisk analys, kanske du vill prova det i praktiken. Men hur börjar man? Hur integrerar man ett nytt verktyg i ett pÄgÄende projekt? Och hur introducerar man det för teamet? Du hittar svaren pÄ dessa frÄgor nedan.
Anteckning. Statisk analys ersÀtter inte och avskaffar inte nÄgot sÄ vÀrdefullt som kodgranskningar. Den kompletterar denna process genom att hjÀlpa till att förutse och korrigera stavfel, felaktigheter och farliga konstruktioner. Det Àr mycket mer produktivt att fokusera pÄ algoritmer och kodens tydlighet under kodgranskningarna, snarare Àn att jaga efter en felplacerad parentes eller .
0. Bekanta dig med verktyget
Allt börjar med en testversion. Det Àr verkligen svÄrt att bestÀmma sig för att införa nÄgot i utvecklingsprocessen om man aldrig har sett verktyget i aktion tidigare. SÄ det första steget Àr att ladda ner .
Vad du kommer att lÀra dig i detta steg:
- Vilka sÀtt det finns att interagera med analysatorn;
- Om analysatorn Àr kompatibel med din utvecklingsmiljö;
- Vilka problem som finns i dina projekt just nu.
NÀr du har installerat allt du behöver Àr det första steget att köra en analys av hela projektet (, , ). I fallet med PVS-Studio i Visual Studio kommer du att se nÄgot som detta (klickbart):

Faktum Àr att statiska analysatorer vanligtvis genererar en stor mÀngd varningar för projekt med en stor kodbas. Det Àr inte nödvÀndigt att ÄtgÀrda dem alla, eftersom ditt projekt redan fungerar, vilket innebÀr att dessa problem inte Àr kritiska. Men du och vid behov rÀtta dem. För detta behöver man filtrera utdata och behÄlla endast de mest tillförlitliga meddelandena. I PVS-Studio plugin för Visual Studio görs detta genom att filtrera efter nivÄer och kategorier av fel. För att fÄ den mest exakta utdata, lÄt endast följande vara aktiverat Hög och General (Àven klickbart):

Verkligen, att granska 178 varningar Àr betydligt enklare Àn flera tusen...
I flikarna Medium och LÄg finns det ofta bra varningar, men i dessa kategorier ingÄr diagnoser som har lÀgre precision (tillförlitlighet). Mer information om varningsnivÄer och alternativ för Windows kan ses hÀr: **.
Efter att ha granskats de mest intressanta felen (och framgĂ„ngsrikt Ă„tgĂ€rdat dem) ska man . Detta behövs för att nya varningar inte ska försvinna bland de gamla. Dessutom Ă€r den statiska analysatorn en hjĂ€lpare för programmeraren, och inte en lista över buggar. đ
1. Automatisering
Efter introduktionen kommer tiden för att stÀlla in plugins och integrera dem i CI. Detta mÄste göras innan programmerarna börjar anvÀnda den statiska analysatorn. Anledningen Àr att en programmerare kan glömma att aktivera analysen eller helt enkelt inte vilja göra det. För detta mÄste en slutlig kontroll göras sÄ att obevakad kod inte kan hamna i den allmÀnna utvecklingsgrenen.
Vad du kommer att lÀra dig i detta steg:
- Vilka automatiseringsalternativ verktyget erbjuder;
- Ăr analysatorn kompatibel med ditt byggsystem.
Eftersom det inte finns nĂ„gon perfekt dokumentation, mĂ„ste man ibland skriva till . Det Ă€r helt okej, och vi Ă€r glada att hjĂ€lpa dig. đ
LÄt oss nu gÄ vidare till kontinuerlig integrations (CI) tjÀnster. Varje analysator kan implementeras i dem utan allvarliga problem. För detta behöver du skapa ett separat steg i pipelinen, som vanligtvis ligger efter bygget och enhetstester. Detta görs med hjÀlp av olika konsolverktyg. Till exempel erbjuder PVS-Studio följande verktyg:
- (analys av lösningar, C#, C++ projekt pÄ Windows)
- (övervakning av kompilering)
- (analys av C++ projekt pÄ Linux / macOS)
- (analys av lösningar, C# projekt pÄ Linux / macOS)
- (analys av Java projekt)
- (konverterare av rapportfiler)
För att integrera analysen i CI mÄste tre saker göras:
- Installera analysatorn;
- Starta analysen;
- Leverera resultaten.
Till exempel, för att installera PVS-Studio pÄ Linux (Debian-baserat) behöver du köra följande kommandon:
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studioI system som körs under Windows finns det ingen möjlighet att installera analysatorn via paketförvaltaren, men det Àr möjligt att starta analysatorn frÄn kommandoraden:
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplicationsMer om distribution av PVS-Studio i Windows-system kan lÀsas **.
Efter installationen mÄste du starta sjÀlva analysen. Men det rekommenderas att göra detta först efter att kompileringen och testerna har genomförts. Detta beror pÄ att statisk analys vanligtvis tar dubbelt sÄ lÄng tid som kompilering.
Eftersom sÀttet att starta beror pÄ plattformen och projektets sÀrdrag, visar jag ett alternativ för C++ (Linux) som exempel:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -wDet första kommandot kommer att utföra analysen, och det andra rapporten till textformat, skriver ut den pÄ skÀrmen och returnerar en kod som skiljer sig frÄn 0 om det finns varningar. En sÄdan mekanism Àr anvÀndbar för att blockera bygget om det finns felmeddelanden. Men du kan alltid ta bort flaggan -w och inte blockera bygget som innehÄller varningar.
Anteckning. Textformatet Àr inte bekvÀmt. Det anges bara som exempel. Observera det mer intressanta rapportformatet - FullHtml. Det tillÄter navigering i koden.
Mer om instÀllningen av analysen pÄ CI kan lÀsas i artikeln "" (Windows) eller "" (Linux).
Bra, du har konfigurerat analysatorns arbete pÄ byggservern. Nu, om nÄgon har laddat upp osÀker kod, kommer verifieringssteget att misslyckas, och du kan upptÀcka problemet, men det Àr inte helt bekvÀmt, eftersom det Àr mer effektivt att kontrollera projektet innan sammanslagningen av grenarna, utan under pull request-steget.
Generellt sett skiljer sig instÀllningen av analysen för pull requests inte mycket frÄn den vanliga analysen i CI. Med undantag för att det Àr nödvÀndigt att fÄ en lista över Àndrade filer. Vanligtvis kan de erhÄllas genom att begÀra skillnaden mellan grenarna med hjÀlp av git:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.listNu mÄste vi överföra denna lista med filer till analysatorn. Till exempel i PVS-Studio görs detta med hjÀlp av flaggan -S:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.listDu kan lĂ€sa mer om analys av pull requestar **. Ăven om din CI inte finns med i listan över de angivna tjĂ€nsterna i artikeln, kommer den allmĂ€nna sektionen som handlar om teorin för denna typ av analys att vara nyttig för dig.
Genom att konfigurera analys av pull requestar kan du blockera commits som innehÄller varningar, vilket skapar en grÀns som obearbetad kod inte kan överskrida.
Detta Àr sjÀlvklart bra, men det skulle vara trevligt att kunna se alla varningar pÄ ett stÀlle. Inte bara frÄn den statiska analysatorn utan ocksÄ frÄn enhetstester eller den dynamiska analysatorn. För detta finns det olika tjÀnster och plugins. PVS-Studio har till exempel .
2. Integration pÄ utvecklarnas maskiner
Nu Àr det dags att installera och konfigurera analysatorn för dagligt bruk i utvecklingen. Vid det hÀr laget har du redan bekantat dig med de flesta arbetsmetoder, sÄ detta kan kallas den enklaste delen.
Som det enklaste alternativet kan utvecklarna sjÀlva installera den nödvÀndiga analysatorn. Men detta kommer att ta mycket tid och avleda dem frÄn utvecklingen, sÄ du kan automatisera denna process genom att anvÀnda installationsprogrammet och nödvÀndiga flaggor. För PVS-Studio finns det olika . Det finns alltid paketmanagerare, sÄsom Chocolatey (Windows), Homebrew (macOS) eller dussintals alternativ för Linux.
DÀrefter behöver du installera de nödvÀndiga plugins, till exempel för , , med flera.
3. Daglig anvÀndning
Vid denna punkt Àr det dags att sÀga nÄgra ord om sÀtt att pÄskynda analysatorns arbete vid daglig anvÀndning. En fullstÀndig analys av hela projektet tar mycket tid, men hur ofta Àndrar vi koden pÄ en gÄng i hela projektet? Det finns knappt nÄgot sÄ omfattande refaktorisering som omedelbart pÄverkar hela kodbasen. Antalet Àndrade filer pÄ en gÄng överstiger sÀllan ett tiotal, dÀrför Àr det meningsfullt att analysera just dem. För sÄdana situationer finns det . Bara bli inte rÀdda, det Àr inte ett nytt verktyg. Det Àr ett speciellt lÀge som tillÄter analys av endast Àndrade filer och deras beroenden, och detta sker automatiskt efter kompilering om du arbetar i en IDE med den installerade plugin.
Om analysatorn hittar problem i den nyligen Àndrade koden, kommer den att meddela om detta automatiskt. Till exempel, PVS-Studio kommer att informera dig om detta med ett meddelande:

Det rÀcker inte med att sÀga till utvecklarna att anvÀnda verktyget. Vi behöver pÄ nÄgot sÀtt berÀtta för dem vad det Àr och hur det fungerar. HÀr Àr till exempel artiklar om snabbstart för PVS-Studio, men liknande handledningar kan du hitta för vilket verktyg du Àn föredrar:
SĂ„dana artiklar ger all nödvĂ€ndig information för dagligt bruk och tar inte mycket tid. đ
Redan i inledningen till verktyget undertryckte vi mÄnga varningar under en av de första körningarna. TyvÀrr Àr statiska analysatorer inte perfekta, sÄ de ger ibland falska positiva. Att undertrycka dem Àr vanligtvis enkelt, till exempel i PVS-Studio-plugin för Visual Studio rÀcker det med att trycka pÄ en knapp:

Men du kan inte bara undertrycka dem. Du kan till exempel rapportera ett problem till supporten. Om en falsk positiv kan ÄtgÀrdas, kan du i framtida uppdateringar mÀrka att antalet specifika falska positiva för din kodbas minskar mer och mer.
Efter integrationen
Vi har nu gÄtt igenom alla steg för att integrera statisk analys i utvecklingsprocessen. Trots vikten av att konfigurera sÄdana verktyg pÄ CI, Àr den viktigaste platsen för körning just utvecklarens dator. För en statisk analysator Àr det inte en domare som sÀger att koden inte duger frÄn en avlÀgsen plats. TvÀrtom, det Àr en assistent som ger rÄd nÀr du Àr trött och pÄminner dig om du har glömt nÄgot.
Sanningen Àr att utan regelbunden anvÀndning av statisk analys knappast kommer utvecklingen att bli enklare. Den största fördelen för utvecklaren ligger inte sÄ mycket i att hitta komplexa och tveksamma kodavsnitt, utan snarare i att tidigt upptÀcka dem. HÄller ni inte med om att det Àr frustrerande att upptÀcka ett problem nÀr Àndringarna har skickats för testning, och att det dessutom kan ta lÄng tid? Statisk analys, vid regelbunden anvÀndning, granskar varje förÀndring direkt pÄ din dator och informerar om misstÀnkta omrÄden medan du arbetar med koden.
Och om du eller dina kollegor fortfarande Àr osÀkra pÄ om ni ska implementera en analysator, föreslÄr jag att ni nu gÄr vidare till att lÀsa artikeln "". I den diskuterade typiska farhÄgor bland utvecklare om att statisk analys skulle ta deras tid och sÄ vidare.
Om du vill dela denna artikel med en engelsktalande publik, vÀnligen anvÀnd lÀnken till översÀttningen: Maxim Zvyagintsev. .
KĂ€lla: habr.com
