Statična analiza - od uvoda do integracije

Utrujeni od neskončnega pregledovanja kode ali odpravljanja napak, včasih pomislite, kako bi si poenostavili življenje. In po kratkem iskanju ali če slučajno naletite nanj, lahko vidite čarobni stavek: »Statična analiza«. Poglejmo, kaj je in kako lahko vpliva na vaš projekt.

Statična analiza - od uvoda do integracije
Pravzaprav, če pišete v katerem koli sodobnem jeziku, ste ga, ne da bi se tega sploh zavedali, pognali skozi statični analizator. Dejstvo je, da vsak sodoben prevajalnik ponuja, čeprav majhen, niz opozoril o možnih težavah v kodi. Na primer, ko prevajate kodo C++ v Visual Studio, boste morda videli naslednje:

Statična analiza - od uvoda do integracije
V tem izhodu vidimo, da spremenljivka var ni bil nikoli uporabljen nikjer v funkciji. Torej ste v resnici skoraj vedno uporabljali preprost statični analizator kode. Vendar pa za razliko od profesionalnih analizatorjev, kot so Coverity, Klocwork ali PVS-Studio, lahko opozorila, ki jih zagotovi prevajalnik, nakazujejo le majhen obseg težav.

Če ne veste zagotovo, kaj je statična analiza in kako jo izvesti, preberi ta članekče želite izvedeti več o tej metodologiji.

Zakaj potrebujete statično analizo?

Na kratko: pospešek in poenostavitev.

Statična analiza vam omogoča, da v kodi najdete veliko različnih težav: od nepravilne uporabe jezikovnih konstrukcij do tipkarskih napak. Na primer, namesto

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

Napisali ste naslednjo kodo:

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

Kot lahko vidite, je v zadnji vrstici tipkarska napaka. Na primer, PVS-Studio izda naslednje opozorilo:

V537 Razmislite o pregledu pravilnosti uporabe elementa »y«.

Če se želite poglobiti v to napako, poskusite z že pripravljenim primerom v Raziskovalcu prevajalnika: *kliknite*.

In kot razumete, ni vedno mogoče takoj posvetiti pozornosti takim odsekom kode, zato lahko dobro uro sedite in odpravljate napake in se sprašujete, zakaj vse deluje tako nenavadno.

Vendar je to očitno napaka. Kaj pa, če je razvijalec napisal neoptimalno kodo, ker je pozabil nekaj subtilnosti jezika? Ali celo dovoljeno v kodi nedefinirano vedenje? Na žalost so takšni primeri povsem običajni in levji delež časa se porabi za odpravljanje napak v delujoči kodi, ki vsebuje tipkarske napake, tipične napake ali nedefinirano vedenje.

Za te situacije se je pojavila statična analiza. To je pomočnik za razvijalca, ki bo opozoril na različne težave v kodi in v dokumentaciji razložil, zakaj ni treba pisati tako, do česa lahko to privede in kako to popraviti. Tukaj je primer, kako bi to lahko izgledalo: *kliknite*.

Več zanimivih napak, ki jih analizator lahko zazna, najdete v člankih:

Zdaj, ko ste prebrali to gradivo in ste prepričani o prednostih statične analize, jo boste morda želeli preizkusiti. Toda kje začeti? Kako integrirati novo orodje v vaš trenutni projekt? In kako mu predstaviti ekipo? Odgovore na ta vprašanja boste našli spodaj.

Opomba. Statična analiza ne nadomesti ali prekliče tako uporabne stvari, kot je pregled kode. Ta postopek dopolnjuje in pomaga vnaprej opaziti in popraviti tipkarske napake, netočnosti in nevarne oblike. Veliko bolj produktivno se je osredotočiti na preglede kode o algoritmih in jasnosti kode, namesto da iščete napačno postavljen oklepaj ali branje dolgočasnih primerjalnih funkcij.

0. Spoznavanje orodja

Vse se začne s poskusno različico. Težko se je res odločiti, da nekaj uvedeš v razvojni proces, če orodja še nikoli nisi videl v živo. Zato morate najprej prenesti preizkusna različica.

Kaj se boste naučili na tej stopnji:

  • Kakšni so načini interakcije z analizatorjem;
  • Ali je analizator združljiv z vašim razvojnim okoljem?
  • Kakšne težave so trenutno pri vaših projektih?

Ko namestite vse, kar potrebujete, morate najprej zagnati analizo celotnega projekta (Windows, Linux, macOS). V primeru PVS-Studio v Visual Studio boste videli podobno sliko (ki jo je mogoče klikniti):

Statična analiza - od uvoda do integracije
Dejstvo je, da statični analizatorji običajno izdajo ogromno opozoril za projekte z veliko bazo kode. Ni vam treba popravljati vseh, saj vaš projekt že deluje, kar pomeni, da te težave niso kritične. Vendar pa ti si lahko ogledate najbolj zanimiva opozorila in jih po potrebi popravite. Če želite to narediti, morate filtrirati izhod in pustiti samo najbolj zanesljiva sporočila. V vtičniku PVS-Studio za Visual Studio se to izvede s filtriranjem po stopnjah in kategorijah napak. Za najbolj natančen rezultat pustite le visoka и splošno (tudi na klik):

Statična analiza - od uvoda do integracije
Dejansko je 178 opozoril veliko lažje videti kot nekaj tisoč...

V zavihkih srednje и nizka Pogosto obstajajo dobra opozorila, vendar te kategorije vključujejo tiste diagnostike, ki imajo manjšo natančnost (zanesljivost). Več informacij o stopnjah opozoril in možnostih za delo v sistemu Windows najdete tukaj: *kliknite*.

Uspešno pregledati najbolj zanimive napake (in jih uspešno popraviti) je vredno zatreti preostala opozorila. To je potrebno, da se nova opozorila ne izgubijo med starimi. Poleg tega je statični analizator pomočnik programerja in ne seznam hroščev. 🙂

1. Avtomatizacija

Po seznanitvi je čas za konfiguracijo vtičnikov in integracijo v CI. To je treba storiti, preden programerji začnejo uporabljati statični analizator. Dejstvo je, da lahko programer pozabi omogočiti analizo ali je sploh ne želi narediti. Če želite to narediti, morate končno preveriti vse, tako da nepreizkušena koda ne more priti v vejo splošnega razvoja.

Kaj se boste naučili na tej stopnji:

  • Katere možnosti avtomatizacije ponuja orodje;
  • Ali je analizator združljiv z vašim montažnim sistemom?

Ker popolna dokumentacija ne obstaja, je včasih treba vpisati podporo. To je normalno in z veseljem vam pomagamo. 🙂

Zdaj pa preidimo na storitve neprekinjene integracije (CI). Vanje je brez večjih težav mogoče implementirati vsak analizator. Če želite to narediti, morate v cevovodu ustvariti ločeno stopnjo, ki se običajno nahaja za gradnjo in preskusi enote. To se naredi z različnimi pripomočki konzole. Na primer, PVS-Studio nudi naslednje pripomočke:

Za integracijo analize v CI morate narediti tri stvari:

  • Namestite analizator;
  • Izvedite analizo;
  • Zagotovite rezultate.

Če želite na primer namestiti PVS-Studio v Linux (Debian-base), morate zagnati naslednje ukaze:

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

V sistemih z operacijskim sistemom Windows analizatorja ni mogoče namestiti iz upravitelja paketov, vendar ga je mogoče razmestiti iz ukazne vrstice:

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

Več o uvajanju PVS-Studio v sisteme z operacijskim sistemom Windows lahko preberete *tukaj*.

Po namestitvi morate neposredno zagnati analizo. Vendar je priporočljivo, da to storite šele po opravljeni kompilaciji in testih. To je zato, ker statična analiza običajno traja dvakrat dlje kot prevajanje.

Ker je način zagona odvisen od platforme in funkcij projekta, bom kot primer prikazal možnost za C++ (Linux):

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

Prvi ukaz bo izvedel analizo, drugi pa ovojnicepretvori poročilo v besedilno obliko, ga prikaže na zaslonu in vrne povratno kodo, ki ni 0, če obstajajo opozorila. Mehanizem, kot je ta, je mogoče priročno uporabiti za blokiranje gradnje, ko se pojavijo sporočila o napakah. Vendar pa lahko zastavico vedno odstranite -w in ne blokirajte sklopa, ki vsebuje opozorila.

Opomba. Oblika besedila je neprimerna. Na voljo je le kot primer. Bodite pozorni na bolj zanimivo obliko poročila - FullHtml. Omogoča vam krmarjenje po kodi.

Več o nastavitvi analize na CI si lahko preberete v članku "PVS-Studio in neprekinjena integracija" (Windows) ali "Kako nastaviti PVS-Studio v Travis CI« (Linux).

V redu, konfigurirali ste analizator na gradbenem strežniku. Zdaj, če je nekdo naložil nepreizkušeno kodo, stopnja preverjanja ne bo uspela in lahko boste odkrili težavo, vendar to ni povsem priročno, saj je učinkoviteje preveriti projekt ne po združitvi vej, ampak pred njim, na stopnji zahteve po vleku.

Na splošno se nastavitev analize zahtevka po vleki ne razlikuje veliko od običajnega zagona analize na CI. Razen potrebe po seznamu spremenjenih datotek. Te je običajno mogoče pridobiti s poizvedovanjem o razlikah med vejami z uporabo git:

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

Zdaj morate ta seznam datotek posredovati analizatorju kot vhod. Na primer, v PVS-Studio je to implementirano z uporabo zastavice -S:

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

Izveste lahko več o analizi zahtev za vleko *tukaj*. Tudi če vašega CI ni na seznamu storitev, omenjenih v članku, vam bo uporaben splošni razdelek, posvečen teoriji te vrste analize.

Z nastavitvijo analize zahtev za vlečenje lahko blokirate objave, ki vsebujejo opozorila, in tako ustvarite mejo, ki je nepreizkušena koda ne more prestopiti.

Vse to je vsekakor dobro, vendar bi rad videl vsa opozorila na enem mestu. Ne samo iz statičnega analizatorja, ampak tudi iz testov enot ali iz dinamičnega analizatorja. Za to obstajajo različne storitve in vtičniki. PVS-Studio ima na primer vtičnik za integracijo v SonarQube.

2. Integracija na razvijalnih strojih

Zdaj je čas, da namestite in konfigurirate analizator za vsakodnevno razvojno uporabo. Do te točke ste se že seznanili z večino načinov dela, zato lahko temu rečemo najlažji del.

Kot najenostavnejša možnost lahko razvijalci sami namestijo potreben analizator. Vendar bo to vzelo veliko časa in jih odvrnilo od razvoja, zato lahko ta postopek avtomatizirate z namestitvenim programom in potrebnimi zastavicami. Za PVS-Studio obstajajo različni zastavice za samodejno namestitev. Vendar vedno obstajajo upravitelji paketov, na primer Chocolatey (Windows), Homebrew (macOS) ali na desetine možnosti za Linux.

Nato boste morali namestiti potrebne vtičnike, na primer za Visual Studio, IDEA, Rider in tako naprej

3. Vsakodnevna uporaba

Na tej stopnji je čas, da povemo nekaj besed o načinih za pospešitev analizatorja med vsakodnevno uporabo. Popolna analiza celotnega projekta vzame veliko časa, a kako pogosto spremenimo kodo skozi celoten projekt naenkrat? Skorajda ni tako velikega preoblikovanja, da bi takoj vplivalo na celotno bazo kode. Število datotek, ki se spreminjajo naenkrat, redko presega ducat, zato jih je smiselno analizirati. Za takšno situacijo obstaja inkrementalni način analize. Samo ne bodite prestrašeni, to ni še eno orodje. To je poseben način, ki vam omogoča analizo samo spremenjenih datotek in njihovih odvisnosti, to pa se zgodi samodejno po izgradnji, če delate v IDE z nameščenim vtičnikom.

Če analizator zazna težave v nedavno spremenjeni kodi, bo o tem neodvisno poročal. Na primer, PVS-Studio vam bo o tem povedal z opozorilom:

Statična analiza - od uvoda do integracije
Seveda ni dovolj, da razvijalcem naročite uporabo orodja. Moramo jim nekako povedati, kaj je in kako je. Tukaj so na primer članki o hitrem začetku za PVS-Studio, vendar lahko najdete podobne vadnice za katero koli orodje, ki vam je ljubše:

Takšni članki nudijo vse potrebne informacije za vsakodnevno uporabo in ne vzamejo veliko časa. 🙂

Že v fazi spoznavanja orodja smo ob enem prvih zagonov potlačili veliko opozoril. Na žalost statični analizatorji niso popolni, zato od časa do časa dajejo lažno pozitivne rezultate. Običajno jih je enostavno zatreti; na primer v vtičniku PVS-Studio za Visual Studio morate samo klikniti en gumb:

Statična analiza - od uvoda do integracije
Vendar pa lahko storite več kot le zatiranje. Na primer, lahko prijavite težavo podpori. Če je lažno pozitivno napako mogoče popraviti, lahko v prihodnjih posodobitvah opazite, da je vedno manj lažnih pozitivnih rezultatov, specifičnih za vašo kodno zbirko.

Posle integracije

Tako smo šli skozi vse faze vključevanja statične analize v razvojni proces. Kljub pomembnosti nastavitve takih orodij na CI je najpomembnejše mesto za njihovo izvajanje razvijalčev računalnik. Navsezadnje statični analizator ni sodnik, ki nekje daleč od vas reče, da koda ni dobra. Nasprotno, je pomočnik, ki vam pove, če ste utrujeni, in vas opomni, če ste kaj pozabili.

Res je, brez redne uporabe statična analiza verjetno ne bo bistveno poenostavila razvoja. Navsezadnje njegova glavna korist za razvijalca ni toliko v iskanju zapletenih in spornih delov kode, temveč v njihovem zgodnjem odkrivanju. Strinjajte se, da odkrivanje težave po tem, ko so bile spremembe poslane v testiranje, ni samo neprijetno, ampak tudi zelo zamudno. Statična analiza ob redni uporabi pregleda vsako spremembo neposredno v vašem računalniku in poroča o sumljivih mestih med delom na kodi.

In če vi ali vaši kolegi še vedno niste prepričani, ali je vredno implementirati analizator, predlagam, da zdaj začnete brati članek "Razlogi za uvedbo statičnega analizatorja kode PVS-Studio v razvojni proces". Obravnava tipične skrbi razvijalcev, da jim bo statična analiza vzela čas in tako naprej.

Statična analiza - od uvoda do integracije

Če želite ta članek deliti z angleško govorečim občinstvom, uporabite povezavo za prevod: Maxim Zvyagintsev. Statična analiza: od začetka do integracije.

Vir: www.habr.com

Dodaj komentar