Statička analiza - od upoznavanja do integracije

Umorni od beskrajnog pregleda koda ili otklanjanja pogrešaka, ponekad razmišljate o tome kako pojednostaviti svoj život. I nakon malo traženja, dobro, ili slučajnog naleta, možete vidjeti čarobni izraz: "Statička analiza". Pogledajmo što je to i kako može komunicirati s vašim projektom.

Statička analiza - od upoznavanja do integracije
Zapravo, ako pišete bilo kojim modernim jezikom, onda ste ga, a da toga niste bili svjesni, prošli kroz statički analizator. Činjenica je da svaki moderni kompilator pruža, iako mali, ali skup upozorenja o potencijalnim problemima u kodu. Na primjer, prilikom kompajliranja C++ koda u Visual Studio, možete vidjeti sljedeće:

Statička analiza - od upoznavanja do integracije
U ovom izlazu vidimo da je varijabla je nikada nije korišten nigdje u funkciji. Dakle, zapravo ste gotovo uvijek koristili jednostavan statički analizator koda. Međutim, za razliku od profesionalnih analizatora kao što su Coverity, Klocwork ili PVS-Studio, upozorenja koja daje kompilator mogu ukazivati ​​samo na mali raspon problema.

Ako ne znate sigurno što je statička analiza i kako je implementirati, pročitajte ovaj članakza više detalja o ovoj metodologiji.

Zašto je potrebna statička analiza?

Ukratko: ubrzanje i pojednostavljenje.

Statička analiza omogućuje vam da pronađete mnogo različitih problema u kodu: od netočne upotrebe jezičnih konstrukcija do pogrešaka pri upisu. Na primjer, umjesto

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Napisali ste sljedeći kod:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Kao što vidite, u zadnjem retku postoji tipfeler. Na primjer, PVS-Studio izdaje sljedeće upozorenje:

V537 Razmotrite pregled ispravnosti upotrebe stavke 'y'.

Ako ovu pogrešku želite riješiti rukama, pokušajte s gotovim primjerom na Compiler Exploreru: *plakati*.

I kao što razumijete, nije uvijek moguće odmah obratiti pozornost na takve dijelove koda, i zbog toga možete sjesti za uklanjanje pogrešaka dobar sat, pitajući se zašto sve radi tako čudno.

Međutim, ovo je očita pogreška. Ali što ako je programer napisao neoptimalan kod jer je zaboravio neke suptilnosti jezika? Ili čak dopušteno u kodu nedefinirano ponašanje? Nažalost, takvi su slučajevi prilično česti, a lavovski dio vremena troši se na otklanjanje pogrešaka specifičnog radnog koda koji sadrži pogreške pri upisu, tipične pogreške ili nedefinirano ponašanje.

Upravo za te situacije pojavila se statička analiza. Ovo je pomoćnik za programera, koji će ukazati na razne probleme u kodu i objasniti u dokumentaciji zašto nije potrebno pisati na ovaj način, do čega to može dovesti i kako to popraviti. Evo primjera kako bi to moglo izgledati: *plakati*.

Više zanimljivih pogrešaka koje analizator može otkriti možete pronaći u člancima:

Nakon što ste pročitali ovaj materijal i uvjerili se u korisnost statičke analize, možda biste je željeli isprobati. Ali odakle početi? Kako integrirati novi alat u trenutni projekt? I kako mu predstaviti ekipu? Odgovore na ova pitanja pronaći ćete u nastavku.

Napomena. Statička analiza ne zamjenjuje niti ukida tako korisnu stvar kao što je pregled koda. Nadopunjuje ovaj proces, pomažući unaprijed uočiti i ispraviti tipfelere, netočnosti i opasne konstrukcije. Puno je produktivnije fokusirati pregled koda na algoritme i razumljivost koda, umjesto na traženje pogrešnih zagrada ili čitati dosadne funkcije usporedbe.

0. Upoznavanje s instrumentom

Sve počinje s probnom verzijom. Doista, teško je odlučiti se nešto uvesti u razvojni proces ako nikada prije niste vidjeli alat uživo. Dakle, prvi korak je preuzimanje probna verzija.

Što ćete naučiti u ovoj fazi:

  • Koji su načini interakcije s analizatorom;
  • Je li analizator kompatibilan s vašim razvojnim okruženjem;
  • Kakvi problemi sada postoje u vašim projektima?

Nakon što ste instalirali sve što vam je potrebno, prvo morate napraviti analizu cijelog projekta (Windows, Linux, macOS). U slučaju PVS-Studio u Visual Studio, vidjet ćete sličnu sliku (na koju se može kliknuti):

Statička analiza - od upoznavanja do integracije
Poanta je da statički analizatori obično izdaju ogroman broj upozorenja za projekte s velikom bazom koda. Nema potrebe da ih sve popravite, budući da je vaš projekt već pokrenut, što znači da ti problemi nisu kritični. Međutim, ti možete pogledati najzanimljivija upozorenja te ih po potrebi ispraviti. Da biste to učinili, morate filtrirati izlaz i ostaviti samo najpouzdanije poruke. U PVS-Studio dodatku za Visual Studio, to se radi filtriranjem prema razinama grešaka i kategorijama. Za najprecizniji rezultat ostavite samo visok и Osnovne informacije (također kliknuti):

Statička analiza - od upoznavanja do integracije
Doista, 178 upozorenja puno je lakše vidjeti nego nekoliko tisuća ...

U karticama Srednji и Nizak često se naiđu na dobra upozorenja, ali u ovim kategorijama navedena je ona dijagnostika koja ima manju točnost (pouzdanost). Više informacija o razinama upozorenja i opcijama za rad pod Windowsima možete pronaći ovdje: *plakati*.

Nakon što ste uspješno pregledali najzanimljivije pogreške (i uspješno ih ispravili), vrijedi potisnuti preostala upozorenja. To je neophodno kako se nova upozorenja ne bi izgubila među starim. Osim toga, statički analizator je pomoćnik programeru, a ne popis grešaka. 🙂

1. Automatizacija

Nakon upoznavanja, vrijeme je za postavljanje dodataka i integraciju u CI. To se mora učiniti prije nego programeri počnu koristiti statički analizator. Činjenica je da programer može zaboraviti uključiti analizu ili to uopće ne želi. Da biste to učinili, morate obaviti konačnu provjeru svega tako da neprovjereni kod ne može ući u opću razvojnu granu.

Što ćete naučiti u ovoj fazi:

  • Koje mogućnosti automatizacije nudi alat;
  • Je li analizator kompatibilan s vašim sustavom izrade.

Budući da savršena dokumentacija ne postoji, ponekad morate pisati podrška. To je normalno i rado ćemo vam pomoći. 🙂

Sada prijeđimo na usluge kontinuirane integracije (CI). U njih se bez ozbiljnijih problema može implementirati bilo koji analizator. Da biste to učinili, trebate stvoriti zasebnu fazu u cjevovodu, koja se obično nalazi nakon izrade i jediničnih testova. To se radi pomoću raznih uslužnih programa konzole. Na primjer, PVS-Studio nudi sljedeće uslužne programe:

Da biste integrirali analizu u CI, trebate učiniti tri stvari:

  • Instalirajte analizator;
  • Pokreni analizu;
  • Dostavite rezultate.

Na primjer, da biste instalirali PVS-Studio na Linux (Debian-base), trebate pokrenuti sljedeće naredbe:

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

Na Windows sustavima ne postoji opcija za instaliranje analizatora iz upravitelja paketa, ali je moguće implementirati analizator iz naredbenog retka:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Možete pročitati više o postavljanju PVS-Studio na Windows sustave *ovdje*.

Nakon instalacije morate izravno pokrenuti analizu. Međutim, preporuča se to učiniti tek nakon što prođu kompilacija i testovi. To je zato što statička analiza obično traje dvostruko duže od kompilacije.

Budući da metoda pokretanja ovisi o platformi i specifičnostima projekta, pokazat ću varijantu C ++ (Linux) kao primjer:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

Prva naredba će izvršiti analizu, a druga omotnicePretvara izvješće u tekstualni format, ispisuje ga na ekran i vraća povratni kod različit od 0 ako postoje upozorenja. Ovaj je mehanizam prikladan za korištenje za blokiranje sklopa u prisutnosti poruka o pogrešci. Međutim, uvijek možete ukloniti zastavu -w i nemojte blokirati sklop koji sadrži upozorenja.

Napomena. Format teksta je nezgodan. Naveden je samo kao primjer. Obratite pozornost na zanimljiviji format izvješća - FullHtml. Omogućuje vam navigaciju kroz kod.

Više o postavljanju analize na CI možete pročitati u članku "PVS-Studio i kontinuirana integracija" (Windows) ili "Kako postaviti PVS-Studio u Travis CI" (Linux).

U redu, konfigurirali ste analizator za rad na poslužitelju za izgradnju. Sada, ako je netko učitao neprovjereni kod, faza provjere će pasti i moći ćete otkriti problem, ali to nije baš zgodno, jer je učinkovitije provjeriti projekt ne nakon što su grane spojene, već prije njega, u fazi zahtjeva za povlačenjem' A.

Općenito, postavljanje analize zahtjeva za povlačenjem ne razlikuje se mnogo od uobičajene analize koja se izvodi na CI-ju. Osim potrebe za dobivanjem popisa promijenjenih datoteka. Obično ih možete dobiti upitom o razlici između grana koristeći git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Sada moramo proslijediti ovaj popis datoteka analizatoru kao ulaz. Na primjer, u PVS-Studio ovo je implementirano pomoću oznake -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Možete saznati više o analizi zahtjeva za povlačenje *ovdje*. Čak i ako vaš CI nije naveden na popisu usluga spomenutih u članku, dobro će vam poslužiti opći odjeljak o teoriji ove vrste analize.

Postavljanjem analize zahtjeva za povlačenjem možete blokirati obveze koje sadrže upozorenja, stvarajući tako granicu koju neprovjereni kod ne može prijeći.

Sve je to svakako dobro, ali volio bih da mogu vidjeti sva upozorenja na jednom mjestu. Ne samo iz statičkog analizatora, već i iz jediničnih testova ili dinamičkog analizatora. Za to postoje razne usluge i dodaci. PVS-Studio, na primjer, ima dodatak za integraciju u SonarQube.

2. Integracija na strojevima programera

Sada je vrijeme da instalirate i konfigurirate analizator za svakodnevnu razvojnu upotrebu. Do ove točke već ste se upoznali s većinom načina rada, tako da se ovo može nazvati najlakšim dijelom.

Kao najjednostavniju opciju, programeri sami mogu instalirati potrebni analizator. Međutim, to će oduzeti puno vremena i odvratiti ih od razvoja, tako da možete automatizirati ovaj proces pomoću instalacijskog programa i pravih oznaka. Za PVS-Studio postoje različiti zastavice za automatsku instalaciju. Međutim, uvijek postoje upravitelji paketa poput Chocolatey (Windows), Homebrew (macOS) ili deseci opcija za Linux.

Zatim ćete morati instalirati potrebne dodatke, na primjer, za Visual Studio, IDEA, Jahač i tako dalje

3. Svakodnevna uporaba

U ovoj fazi, vrijeme je da kažemo nekoliko riječi o načinima za ubrzanje analizatora u svakodnevnoj uporabi. Kompletna analiza cijelog projekta traje jako dugo, ali koliko često mijenjamo kod odjednom u cijelom projektu? Teško da postoji tako masivno refaktoriranje da će odmah utjecati na cijelu bazu koda. Broj datoteka koje se mijenjaju u isto vrijeme rijetko prelazi desetak, pa ih ima smisla analizirati. Za takvu situaciju, eto način inkrementalne analize. Samo se nemojte bojati, to nije samo još jedan alat. Ovo je poseban način rada koji vam omogućuje analizu samo promijenjenih datoteka i njihovih ovisnosti, a to se događa automatski nakon izgradnje ako radite u IDE-u s instaliranim dodatkom.

Ako analizator pronađe probleme u nedavno promijenjenom kodu, sam će to prijaviti. Na primjer, PVS-Studio će vas obavijestiti o tome putem obavijesti:

Statička analiza - od upoznavanja do integracije
Podrazumijeva se da nije dovoljno reći programerima da koriste alat. Treba im nekako reći što je to uopće i kako je. Na primjer, ovdje su članci o brzom početku za PVS-Studio, ali možete pronaći slične vodiče za bilo koji alat koji želite:

Takvi članci pružaju sve informacije koje su vam potrebne za svakodnevnu uporabu i ne oduzimaju puno vremena. 🙂

Još u fazi upoznavanja s alatom, tijekom jednog od prvih lansiranja potisnuli smo mnoga upozorenja. Nažalost, statički analizatori nisu savršeni, pa s vremena na vrijeme daju lažne rezultate. Obično ih je lako potisnuti, na primjer, u PVS-Studio dodatku za Visual Studio, samo kliknite na jedan gumb:

Statička analiza - od upoznavanja do integracije
Međutim, možete učiniti više nego samo ih potisnuti. Na primjer, možete prijaviti problem podršci. Ako se lažno pozitivno može popraviti, tada ćete u budućim ažuriranjima možda primijetiti da svaki put ima sve manje lažno pozitivnih rezultata specifičnih za vašu bazu koda.

Nakon integracije

Tako smo prošli kroz sve faze integracije statičke analize u razvojni proces. Unatoč važnosti postavljanja takvih alata na CI, najvažnije mjesto za pokretanje je računalo programera. Uostalom, statički analizator nije sudac koji negdje daleko od vas kaže da kod nije dobar. Naprotiv, to je pomoćnik koji vam govori jeste li umorni i podsjeća vas ako ste nešto zaboravili.

Istina, bez redovite upotrebe, statička analiza vjerojatno neće uvelike pojednostaviti razvoj. Uostalom, njegova glavna korist za programera nije toliko u potrazi za složenim i kontroverznim dijelovima koda, koliko u njihovom ranom otkrivanju. Složite se da pronalaženje problema kada su izmjene otišle na testiranje nije samo neugodno, već i vrlo dugo. S druge strane, statička analiza, kada se koristi redovito, gleda svaku promjenu izravno na vašem računalu i prijavljuje sumnjiva mjesta tijekom rada na kodu.

A ako vi ili vaši kolege još uvijek niste sigurni isplati li se implementirati analizator, predlažem da prijeđete na čitanje članka "Razlozi za uvođenje PVS-Studio statičkog analizatora koda u razvojni proces". Analizira tipične brige programera da će im statička analiza oduzeti vrijeme i tako dalje.

Statička analiza - od upoznavanja do integracije

Ako želite podijeliti ovaj članak s publikom koja govori engleski, upotrijebite vezu za prijevod: Maxim Zvyagintsev. Statička analiza: od početka do integracije.

Izvor: www.habr.com

Dodajte komentar