Umorni od beskonačnog pregleda koda ili otklanjanja grešaka, ponekad razmišljate o tome kako da pojednostavite svoj život. I nakon što malo pretražujete ili slučajno naiđete na nju, možete vidjeti magičnu frazu: “Statička analiza”. Hajde da vidimo šta je to i kako može da utiče na vaš projekat.

U stvari, ako pišete na bilo kom modernom jeziku, onda ste, a da toga niste ni svjesni, prošli kroz statički analizator. Činjenica je da svaki moderni kompajler pruža, iako mali, skup upozorenja o potencijalnim problemima u kodu. Na primjer, prilikom kompajliranja C++ koda u Visual Studio-u možete vidjeti sljedeće:

U ovom izlazu vidimo da je varijabla ima nikada nije korišten nigdje u funkciji. Dakle, u stvarnosti ste skoro 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 kompajler mogu ukazivati na samo mali raspon problema.
Ako ne znate sa sigurnošću šta je statička analiza i kako je implementirati, da saznate više o ovoj metodologiji.
Zašto vam je potrebna statička analiza?
Ukratko: ubrzanje i pojednostavljenje.
Statička analiza vam omogućava da pronađete mnogo različitih problema u kodu: od netačne upotrebe jezičkih konstrukcija do grešaka u kucanju. 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, postoji greška u kucanju u poslednjem redu. Na primjer, PVS-Studio izdaje sljedeće upozorenje:
Razmislite o pregledu ispravnosti upotrebe 'y' stavke.
Ako želite da uvučete ruke u ovu grešku, pokušajte sa gotovim primjerom u Compiler Exploreru: **.
I kao što razumijete, nije uvijek moguće odmah obratiti pažnju na takve dijelove koda, i zbog toga možete sjediti na otklanjanju grešaka dobar sat, pitajući se zašto sve radi tako čudno.
Međutim, ovo je očigledno greška. Šta ako je programer napisao neoptimalan kod jer je zaboravio neke suptilnosti jezika? Ili čak dozvolio u kodu ? Nažalost, takvi slučajevi su potpuno uobičajeni i najveći dio vremena se troši na otklanjanje grešaka u konkretnom radnom kodu koji sadrži greške u kucanju, tipične greške ili nedefinirano ponašanje.
Za ove situacije se pojavila statička analiza. Ovo je pomoćnik 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: **.
Zanimljivije greške koje analizator može otkriti možete pronaći u člancima:
Sada kada ste pročitali ovaj materijal i uvjerili se u prednosti statičke analize, možda biste željeli da je isprobate. Ali odakle početi? Kako integrirati novi alat u vaš trenutni projekat? I kako mu predstaviti ekipu? Odgovore na ova pitanja naći ćete u nastavku.
Napomena. Statička analiza ne zamjenjuje niti poništava tako korisnu stvar kao što je pregled koda. On dopunjuje ovaj proces, pomažući da se unaprijed uoče i isprave greške u kucanju, netačnosti i opasni dizajn. Mnogo je produktivnije fokusirati se na recenzije koda na algoritme i jasnoću koda, umjesto da tražimo pogrešnu zagradu ili .
0. Upoznavanje sa alatom
Sve počinje sa probnom verzijom. Zaista, teško je odlučiti se implementirati nešto u proces razvoja ako nikada prije niste vidjeli alat uživo. Stoga, prva stvar koju trebate učiniti je preuzeti .
Šta ćete naučiti u ovoj fazi:
- Koji su načini interakcije sa analizatorom;
- Da li je analizator kompatibilan sa vašim razvojnim okruženjem?
- Koji problemi trenutno postoje u vašim projektima?
Nakon što ste instalirali sve što vam je potrebno, prvo što trebate učiniti je pokrenuti analizu cijelog projekta (, , ). U slučaju PVS-Studio u Visual Studiju videćete sličnu sliku (koja se može kliknuti):

Činjenica je da statički analizatori obično izdaju ogroman broj upozorenja za projekte s velikom bazom koda. Nema potrebe da ih sve popravljate, jer vaš projekat već radi, što znači da ovi problemi nisu kritični. Međutim, ti i ispravite ih ako je potrebno. Da biste to učinili, morate filtrirati izlaz i ostaviti samo najpouzdanije poruke. U PVS-Studio dodatku za Visual Studio, ovo se radi filtriranjem prema nivoima grešaka i kategorijama. Za najprecizniji izlaz, ostavite samo visok и Opšti (takođe kliknuti):

Zaista, 178 upozorenja je mnogo lakše pogledati nego nekoliko hiljada...
U tabovima srednji и nizak Često se susreću dobra upozorenja, ali ove kategorije uključuju dijagnostiku koja ima nižu tačnost (pouzdanost). Saznajte više o nivoima upozorenja i opcijama za rad pod Windows Možete to vidjeti ovdje: **.
Uspješno pregledati najzanimljivije greške (i uspješno ih ispraviti) vrijedi . To je neophodno kako se nova upozorenja ne bi izgubila među starima. Osim toga, statički analizator je pomoćnik programera, a ne lista grešaka. 🙂
1. Automatizacija
Nakon upoznavanja, vrijeme je za konfiguraciju dodataka i integraciju u CI. Ovo se mora uraditi prije nego što programeri počnu koristiti statički analizator. Činjenica je da programer može zaboraviti da omogući analizu ili ne želi da je uradi uopšte. Da biste to učinili, potrebno je da izvršite konačnu provjeru svega kako netestirani kod ne može ući u opću razvojnu granu.
Šta ćete naučiti u ovoj fazi:
- Koje opcije automatizacije nudi alat;
- Da li je analizator kompatibilan sa vašim montažnim sistemom?
Pošto savršena dokumentacija ne postoji, ponekad morate upisati . Ovo je normalno i rado ćemo vam pomoći. 🙂
Sada pređimo na usluge kontinuirane integracije (CI). U njih se bez ozbiljnih problema može implementirati bilo koji analizator. Da biste to učinili, morate kreirati zasebnu fazu u cjevovodu, koja se obično nalazi nakon testova izgradnje i jedinica. To se radi pomoću raznih konzolnih uslužnih programa. Na primjer, PVS-Studio nudi sljedeće uslužne programe:
- (analiza rješenja, C#, C++ projekti na Windows)
- (praćenje kompilacije)
- (analiza C++ projekata na Linux / macOS)
- (analiza rješenja, C# projekti na Linux / macOS)
- (analiza Java projekata)
- (konverter fajlova izveštaja)
Da biste integrirali analizu u CI, trebate učiniti tri stvari:
- Instalirajte analizator;
- Run analysis;
- Isporučite rezultate.
Na primjer, da biste instalirali PVS-Studio na Linux (Debian-base) potrebno je da pokrenete 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-studioU sistemima pod kontrolom Windows Ne postoji opcija za instaliranje analizatora iz upravitelja paketa, ali je moguće implementirati analizator iz komandne linije:
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplicationsSaznajte više o implementaciji PVS-Studio na sistemima koji rade Windows možete pročitati **.
Nakon instalacije, potrebno je direktno pokrenuti analizu. Međutim, preporučuje se da to učinite 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 karakteristikama projekta, prikazat ću opciju za C++ (Linux) kao primjer:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -wPrva komanda će izvršiti analizu, a druga pretvara izvještaj u tekstualni format, prikazuje ga na ekranu i vraća povratni kod koji nije 0 ako postoje upozorenja. Ovakav mehanizam se može praktično koristiti za blokiranje izgradnje kada postoje poruke o grešci. Međutim, uvijek možete ukloniti zastavu -w i nemojte blokirati sklop koji sadrži upozorenja.
Napomena. Format teksta je nezgodan. Dato je jednostavno kao primjer. Obratite pažnju na zanimljiviji format izvještaja - FullHtml. Omogućava vam da se krećete kroz kod.
Više o postavljanju analize na CI možete pročitati u članku ""(\ TWindows) ili ""(\ TLinux).
U redu, konfigurisali ste analizator na serveru za izgradnju. Sada, ako je neko učitao netestirani kod, faza verifikacije neće uspjeti i moći ćete otkriti problem, međutim, to nije sasvim zgodno, jer je efikasnije provjeriti projekat ne nakon što su grane spojene, već prije toga, u fazi zahtjeva za povlačenjem A.
Općenito, postavljanje analize zahtjeva za povlačenjem se ne razlikuje mnogo od uobičajenog pokretanja analize na CI. Osim potrebe da dobijete listu promijenjenih fajlova. Oni se obično mogu dobiti ispitivanjem razlika između grana pomoću git-a:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.listSada morate proslediti ovu listu datoteka analizatoru kao ulaz. Na primjer, u PVS-Studiju ovo se implementira pomoću zastavice -S:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.listMožete saznati više o analizi zahtjeva za povlačenjem **. Čak i ako vaš CI nije na listi usluga spomenutih u članku, opći dio posvećen teoriji ove vrste analize će vam biti od koristi.
Postavljanjem analize zahtjeva za povlačenjem, možete blokirati urezivanje koji sadrži upozorenja, stvarajući na taj način granicu koju netestirani kod ne može prijeći.
Ovo je svakako dobro, ali bih volio da mogu vidjeti sva upozorenja na jednom mjestu. Ne samo iz statičkog analizatora, već i iz jediničnih testova ili iz dinamičkog analizatora. Za to postoje razni servisi i dodaci. PVS-Studio, na primjer, ima .
2. Integracija na razvojnim mašinama
Sada je vrijeme da instalirate i konfigurirate analizator za svakodnevnu razvojnu upotrebu. Do ovog trenutka ste se već upoznali sa većinom načina rada, tako da se ovo može nazvati najlakšim dijelom.
Kao najjednostavniju opciju, programeri mogu sami instalirati potreban analizator. Međutim, to će oduzeti dosta vremena i odvratiti ih od razvoja, tako da možete automatizirati ovaj proces koristeći instalater i potrebne zastavice. Za PVS-Studio postoje razni Međutim, uvijek postoje upravitelji paketa, na primjer, Chocolatey (Windows), Domaće pivo (macOS) ili desetine opcija za Linux.
Zatim ćete morati instalirati potrebne dodatke, na primjer za , , itd
3. Svakodnevna upotreba
U ovoj fazi, vrijeme je da kažemo nekoliko riječi o načinima za ubrzavanje analizatora tokom svakodnevne upotrebe. Kompletna analiza cijelog projekta oduzima dosta vremena, ali koliko često mijenjamo kod u cijelom projektu odjednom? Gotovo da ne postoji preinačenje koje je toliko veliko da bi odmah utjecalo na cijelu bazu koda. Broj fajlova koji se menjaju u jednom trenutku retko prelazi desetinu, pa ih ima smisla analizirati. Za takvu situaciju postoji . Samo nemojte biti uznemireni, ovo nije još jedan alat. Ovo je poseban način koji vam omogućava da analizirate samo promijenjene datoteke i njihove ovisnosti, a to se događa automatski nakon izgradnje ako radite u IDE-u s instaliranim dodatkom.
Ako analizator otkrije probleme u nedavno promijenjenom kodu, samostalno će to prijaviti. Na primjer, PVS-Studio će vam reći o tome koristeći upozorenje:

Naravno, nije dovoljno reći programerima da koriste alat. Moramo im nekako reći šta je i kako je. Evo, na primjer, članaka o brzom početku za PVS-Studio, ali možete pronaći slične tutorijale za bilo koji alat koji želite:
Takvi članci pružaju sve informacije potrebne za svakodnevnu upotrebu i ne oduzimaju puno vremena. 🙂
Još u fazi upoznavanja alata, potisnuli smo mnoga upozorenja prilikom jednog od prvih lansiranja. Nažalost, statički analizatori nisu savršeni, pa s vremena na vrijeme daju lažne pozitivne rezultate. Obično ih je lako potisnuti, na primjer, u PVS-Studio dodatku za Visual Studio trebate samo kliknuti jedno dugme:

Međutim, možete učiniti više od toga da ih samo potisnete. Na primjer, možete prijaviti problem podršci. Ako se lažno pozitivno može ispraviti, tada u budućim ažuriranjima možete primijetiti da svaki put ima sve manje lažnih pozitivnih rezultata specifičnih za vašu bazu kodova.
Nakon integracije
Dakle, prošli smo kroz sve faze integracije statičke analize u proces razvoja. Uprkos važnosti postavljanja takvih alata na CI, najvažnije mjesto za njihovo pokretanje je kompjuter programera. Na kraju krajeva, statički analizator nije sudija koji kaže negde daleko od vas da kod nije dobar. Naprotiv, to je pomoćnik koji vam govori da li ste umorni i podseća vas ako ste nešto zaboravili.
Istina, bez redovne upotrebe, malo je vjerovatno da će statička analiza značajno pojednostaviti razvoj. Na kraju krajeva, njegova glavna prednost za programera nije toliko u potrazi za složenim i kontroverznim dijelovima koda, već u njihovom ranom otkrivanju. Slažete se da otkrivanje problema nakon što su izmjene poslane na testiranje nije samo neugodno, već i dugotrajno. Statička analiza, kada se koristi redovno, gleda svaku promjenu direktno na vašem računaru i prijavljuje sumnjiva mjesta dok radite na kodu.
A ako vi ili vaše kolege još uvijek niste sigurni isplati li se implementirati analizator, onda predlažem da sada počnete čitati članak "On se bavi tipičnim zabrinutostima programera da će im statička analiza oduzeti vrijeme i tako dalje.
Ako želite da podijelite ovaj članak sa publikom koja govori engleski, koristite link za prijevod: Maxim Zvyagintsev. .
izvor: www.habr.com
