Statisk analys – frĂ„n introduktion till integration

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.

Statisk analys – frĂ„n introduktion till integration
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:

Statisk analys – frĂ„n introduktion till integration
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, denna artikel, 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:

V537 Ö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: *klicka*.

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? К ŃĐŸĐ¶Đ°Đ»Đ”ĐœĐžŃŽ, ĐżĐŸĐŽĐŸĐ±ĐœŃ‹Đ” ŃĐ»ŃƒŃ‡Đ°Đž ŃĐŸĐČĐ”Ń€ŃˆĐ”ĐœĐœĐŸ ĐŸĐ±Ń‹ĐŽĐ”ĐœĐœŃ‹ Đž Đ»ŃŒĐČĐžĐœĐ°Ń часть ĐČŃ€Đ”ĐŒĐ”ĐœĐž тратотся ĐœĐ° Ń‚ĐŸ, Ń‡Ń‚ĐŸĐ±Ń‹ ĐŸŃ‚Đ»Đ°ĐŽĐžŃ‚ŃŒ ŃĐżĐ”Ń†ĐžŃ„ĐžŃ‡ĐœĐŸ Ń€Đ°Đ±ĐŸŃ‚Đ°ŃŽŃ‰ĐžĐč ĐșĐŸĐŽ, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đč ŃĐŸĐŽĐ”Ń€Đ¶ĐžŃ‚ ĐŸĐżĐ”Ń‡Đ°Ń‚ĐșĐž, Ń‚ĐžĐżĐžŃ‡ĐœŃ‹Đ” ĐŸŃˆĐžĐ±ĐșĐž ОлО 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: *klicka*.

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 lÀsa trÄkiga jÀmföringsfunktioner.

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 en provversion.

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 (Windows, Linux, macOS). I fallet med PVS-Studio i Visual Studio kommer du att se nÄgot som detta (klickbart):

Statisk analys – frĂ„n introduktion till integration
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 kan titta pÄ de mest intressanta varningarna. 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):

Statisk analys – frĂ„n introduktion till integration
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: *klicka*.

Efter att ha granskats de mest intressanta felen (och framgĂ„ngsrikt Ă„tgĂ€rdat dem) ska man dĂ€mpa de Ă„terstĂ„ende varningarna. 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 supporten. 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:

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-studio

I 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 /nocloseapplications

Mer om distribution av PVS-Studio i Windows-system kan lÀsas *). Ett typiskt exempel pÄ anvÀndning:*.

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 -w

Det första kommandot kommer att utföra analysen, och det andra konverterarrapporten 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 "PVS-Studio och Continuous Integration" (Windows) eller "Hur man konfigurerar PVS-Studio i Travis CI" (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.list

Nu 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.list

Du kan lĂ€sa mer om analys av pull requestar *). Ett typiskt exempel pĂ„ anvĂ€ndning:*. Ä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 en plugin för integration med SonarQube.

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 flaggar för automatiserad installation. 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 Visual Studio, IDEA, Rider 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 en inkrementell analyslÀge. 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:

Statisk analys – frĂ„n introduktion till integration
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:

Statisk analys – frĂ„n introduktion till integration
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 "Anledningar till att införa en statistisk kodanalysator PVS-Studio i utvecklingsprocessen". I den diskuterade typiska farhÄgor bland utvecklare om att statisk analys skulle ta deras tid och sÄ vidare.

Statisk analys – frĂ„n introduktion till integration

Om du vill dela denna artikel med en engelsktalande publik, vÀnligen anvÀnd lÀnken till översÀttningen: Maxim Zvyagintsev. Statisk analys: FrÄn att komma igÄng till integration.

KĂ€lla: habr.com

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