Statická analýza - od úvodu po integráciu

Unavený z nekonečného preskúmania kódu alebo ladenia niekedy premýšľate o tom, ako si zjednodušiť život. A po malom hľadaní alebo náhodnom natrafení na to môžete vidieť magickú frázu: „Statická analýza“. Pozrime sa, čo to je a ako môže interagovať s vaším projektom.

Statická analýza - od úvodu po integráciu
V skutočnosti, ak píšete v akomkoľvek modernom jazyku, potom, bez toho, aby ste si to uvedomovali, ste to prešli statickým analyzátorom. Faktom je, že každý moderný kompilátor poskytuje, aj keď malý, súbor upozornení na potenciálne problémy v kóde. Napríklad pri kompilácii kódu C++ vo Visual Studio môžete vidieť nasledovné:

Statická analýza - od úvodu po integráciu
V tomto výstupe vidíme, že premenná var vo funkcii nebol nikdy použitý. Takže v skutočnosti ste takmer vždy používali jednoduchý analyzátor statického kódu. Na rozdiel od profesionálnych analyzátorov, ako sú Coverity, Klocwork alebo PVS-Studio, však varovania poskytnuté kompilátorom môžu naznačovať len malý rozsah problémov.

Ak s istotou neviete, čo je statická analýza a ako ju implementovať, prečítajte si tento článoksa dozviete viac o tejto metodike.

Prečo potrebujete statickú analýzu?

V skratke: zrýchlenie a zjednodušenie.

Statická analýza vám umožňuje nájsť v kóde množstvo rôznych problémov: od nesprávneho použitia jazykových konštrukcií až po preklepy. Napríklad namiesto

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

Napísali ste nasledujúci kód:

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

Ako vidíte, v poslednom riadku je preklep. Napríklad PVS-Studio vydáva nasledujúce varovanie:

V537 Zvážte kontrolu správnosti použitia položky „y“.

Ak chcete do tejto chyby strčiť ruky, vyskúšajte pripravený príklad v programe Compiler Explorer: *cvaknutie*.

A ako viete, nie je vždy možné okamžite venovať pozornosť takýmto častiam kódu, a preto si môžete pri ladení sadnúť na dobrú hodinu a premýšľať, prečo všetko funguje tak zvláštne.

To je však jednoznačne omyl. Čo ak vývojár napísal neoptimálny kód, pretože zabudol na nejakú jemnosť jazyka? Alebo to dokonca povolili v kóde nedefinované správanie? Bohužiaľ, takéto prípady sú úplne bežné a leví podiel času zaberie ladenie konkrétne fungujúceho kódu, ktorý obsahuje preklepy, typické chyby alebo nedefinované správanie.

Práve pre tieto situácie sa objavila statická analýza. Ide o pomocníka vývojára, ktorý upozorní na rôzne problémy v kóde a v dokumentácii vysvetlí, prečo nie je potrebné písať takto, k čomu to môže viesť a ako to opraviť. Tu je príklad, ako by to mohlo vyzerať: *cvaknutie*.

Viac zaujímavých chýb, ktoré dokáže analyzátor odhaliť, nájdete v článkoch:

Teraz, keď ste si prečítali tento materiál a ste presvedčení o výhodách statickej analýzy, možno ho budete chcieť vyskúšať. Ale kde začať? Ako integrovať nový nástroj do vášho súčasného projektu? A ako mu predstaviť tím? Odpovede na tieto otázky nájdete nižšie.

Poznámka. Statická analýza nenahrádza ani neruší takú užitočnú vec, akou je kontrola kódu. Dopĺňa tento proces, pomáha si všimnúť a opraviť preklepy, nepresnosti a nebezpečné návrhy vopred. Oveľa produktívnejšie je zamerať sa na kontroly kódu na algoritmy a prehľadnosť kódu, než hľadať nesprávne umiestnené zátvorky alebo čítať nudné porovnávacie funkcie.

0. Oboznámenie sa s nástrojom

Všetko to začína skúšobnou verziou. V skutočnosti je ťažké rozhodnúť sa niečo implementovať do procesu vývoja, ak ste nástroj nikdy predtým nevideli naživo. Preto prvá vec, ktorú by ste mali urobiť, je stiahnuť skúšobná verzia.

Čo sa v tejto fáze naučíte:

  • Aké sú spôsoby interakcie s analyzátorom;
  • Je analyzátor kompatibilný s vaším vývojovým prostredím?
  • Aké problémy sú momentálne vo vašich projektoch?

Po nainštalovaní všetkého, čo potrebujete, prvá vec, ktorú by ste mali urobiť, je spustiť analýzu celého projektu (Windows, Linux, macOS). V prípade PVS-Studio vo Visual Studiu uvidíte podobný obrázok (kliknite):

Statická analýza - od úvodu po integráciu
Faktom je, že statické analyzátory zvyčajne vydávajú veľké množstvo varovaní pre projekty s veľkou kódovou základňou. Nie je potrebné ich všetky opravovať, pretože váš projekt už funguje, čo znamená, že tieto problémy nie sú kritické. Avšak vy môžete sa pozrieť na najzaujímavejšie upozornenia a v prípade potreby ich opravte. Ak to chcete urobiť, musíte filtrovať výstup a nechať len najspoľahlivejšie správy. V doplnku PVS-Studio pre Visual Studio sa to robí filtrovaním podľa úrovní chýb a kategórií. Pre čo najpresnejší výstup ponechajte iba vysoký и všeobecný (možno aj kliknúť):

Statická analýza - od úvodu po integráciu
Skutočne, 178 varovaní je oveľa jednoduchšie zobraziť ako niekoľko tisíc...

V kartách stredná и Nízky Často existujú dobré varovania, ale tieto kategórie zahŕňajú tie diagnostiky, ktoré majú menšiu presnosť (spoľahlivosť). Viac informácií o úrovniach varovania a možnostiach práce v systéme Windows nájdete tu: *cvaknutie*.

Úspešná kontrola najzaujímavejších chýb (a ich úspešná oprava) sa oplatí potlačiť zostávajúce varovania. Je to potrebné, aby sa nové varovania nestratili medzi starými. Okrem toho je statický analyzátor pomocníkom programátora a nie zoznamom chýb. 🙂

1. Automatizácia

Po zoznámení je čas nakonfigurovať doplnky a integrovať sa do CI. Toto sa musí urobiť predtým, ako programátor začne používať statický analyzátor. Faktom je, že programátor môže zabudnúť povoliť analýzu alebo ju nechce robiť vôbec. Aby ste to urobili, musíte urobiť nejakú záverečnú kontrolu všetkého, aby sa netestovaný kód nedostal do všeobecnej vývojovej vetvy.

Čo sa v tejto fáze naučíte:

  • Aké možnosti automatizácie nástroj poskytuje;
  • Je analyzátor kompatibilný s vaším montážnym systémom?

Keďže dokonalá dokumentácia neexistuje, niekedy musíte zapísať podpora. Je to normálne a radi vám pomôžeme. 🙂

Teraz prejdime k službám nepretržitej integrácie (CI). Bez vážnejších problémov je možné do nich implementovať akýkoľvek analyzátor. Aby ste to dosiahli, musíte vytvoriť samostatnú etapu v potrubí, ktorá sa zvyčajne nachádza po testoch zostavenia a jednotky. To sa vykonáva pomocou rôznych nástrojov konzoly. Napríklad PVS-Studio poskytuje nasledujúce nástroje:

Ak chcete integrovať analýzu do CI, musíte urobiť tri veci:

  • Nainštalujte analyzátor;
  • Spustiť analýzu;
  • Doručiť výsledky.

Napríklad, ak chcete nainštalovať PVS-Studio na Linuxe (Debian-base), musíte spustiť nasledujúce príkazy:

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 systémoch so systémom Windows neexistuje spôsob, ako nainštalovať analyzátor zo správcu balíkov, ale je možné nasadiť analyzátor z príkazového riadku:

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

Môžete si prečítať viac o nasadení PVS-Studio na systémoch so systémom Windows *tu*.

Po inštalácii je potrebné spustiť analýzu priamo. Odporúča sa to však urobiť až po dokončení kompilácie a testov. Je to preto, že statická analýza zvyčajne trvá dvakrát dlhšie ako kompilácia.

Keďže spôsob spustenia závisí od platformy a funkcií projektu, ako príklad ukážem možnosť pre C++ (Linux):

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

Prvý príkaz vykoná analýzu a druhý príkaz obálkyprevedie správu do textového formátu, zobrazí ju na obrazovke a vráti návratový kód iný ako 0, ak sa vyskytnú varovania. Mechanizmus ako tento sa dá pohodlne použiť na zablokovanie zostavy, keď sa vyskytnú chybové hlásenia. Vždy však môžete príznak odstrániť -w a neblokujte zostavu, ktorá obsahuje upozornenia.

Poznámka. Formát textu je nepohodlný. Uvádza sa jednoducho ako príklad. Venujte pozornosť zaujímavejšiemu formátu správy - FullHtml. Umožňuje vám prechádzať kódom.

Viac o nastavení analýzy na CI si môžete prečítať v článku "PVS-Studio a kontinuálna integrácia" (Windows) alebo "Ako nastaviť PVS-Studio v Travis CI“ (Linux).

Dobre, nakonfigurovali ste analyzátor na zostavovacom serveri. Ak teraz niekto nahral netestovaný kód, fáza overenia zlyhá a problém budete môcť zistiť, nie je to však úplne pohodlné, pretože je efektívnejšie kontrolovať projekt nie po zlúčení pobočiek, ale predtým, vo fáze žiadosti o stiahnutie.

Vo všeobecnosti sa nastavenie analýzy žiadosti o stiahnutie príliš nelíši od bežného spustenia analýzy na CI. Až na potrebu získať zoznam zmenených súborov. Tie možno zvyčajne získať dotazovaním na rozdiely medzi vetvami pomocou git:

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

Teraz musíte tento zoznam súborov odovzdať analyzátoru ako vstup. Napríklad v PVS-Studio je to implementované pomocou príznaku -S:

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

Môžete sa dozvedieť viac o analýze žiadostí o stiahnutie *tu*. Aj keď vaša KI nie je na zozname služieb uvedených v článku, všeobecná časť venovaná teórii tohto typu analýzy bude pre vás užitočná.

Nastavením analýzy požiadaviek na stiahnutie môžete blokovať odovzdania obsahujúce upozornenia, čím vytvoríte hranicu, ktorú netestovaný kód nemôže prekročiť.

To všetko je určite dobré, ale rád by som videl všetky varovania na jednom mieste. Nielen zo statického analyzátora, ale aj z jednotkových testov alebo z dynamického analyzátora. Na to existujú rôzne služby a pluginy. PVS-Studio má napríklad plugin pre integráciu do SonarQube.

2. Integrácia na vývojárskych strojoch

Teraz je čas nainštalovať a nakonfigurovať analyzátor pre každodenné vývojové použitie. V tomto bode ste sa už oboznámili s väčšinou spôsobov práce, takže to možno nazvať najjednoduchšou časťou.

Ako najjednoduchšiu možnosť si vývojári môžu sami nainštalovať potrebný analyzátor. To však zaberie veľa času a odvedie ich pozornosť od vývoja, takže tento proces môžete automatizovať pomocou inštalátora a potrebných príznakov. Pre PVS-Studio existujú rôzne príznaky pre automatizovanú inštaláciu. Vždy však existujú správcovia balíkov, napríklad Chocolatey (Windows), Homebrew (macOS) alebo desiatky možností pre Linux.

Potom budete musieť nainštalovať potrebné pluginy, napríklad pre Visual Studio, IDEA, Jazdec a tak ďalej

3. Každodenné používanie

V tejto fáze je čas povedať pár slov o spôsoboch zrýchlenia analyzátora pri každodennom používaní. Kompletná analýza celého projektu zaberie veľa času, ale ako často meníme kód v rámci celého projektu naraz? Sotva existuje refaktoring, ktorý by bol taký veľký, že by okamžite ovplyvnil celú základňu kódu. Počet súborov, ktoré sa menia naraz, zriedka presahuje tucet, takže má zmysel ich analyzovať. Pre takúto situáciu existuje režim prírastkovej analýzy. Len sa nezľaknite, toto nie je ďalší nástroj. Toto je špeciálny režim, ktorý vám umožňuje analyzovať iba zmenené súbory a ich závislosti, a to sa deje automaticky po vytvorení, ak pracujete v IDE s nainštalovaným doplnkom.

Ak analyzátor zistí problémy v nedávno zmenenom kóde, oznámi to nezávisle. Napríklad PVS-Studio vám o tom povie pomocou upozornenia:

Statická analýza - od úvodu po integráciu
Samozrejme, povedať vývojárom, aby tento nástroj používali, nestačí. Musíme im nejako povedať, čo to je a ako to je. Tu sú napríklad články o rýchlom spustení pre PVS-Studio, ale môžete nájsť podobné návody pre akýkoľvek nástroj, ktorý uprednostňujete:

Takéto články poskytujú všetky informácie potrebné na každodenné použitie a nezaberú veľa času. 🙂

Už v štádiu zoznamovania sa s nástrojom sme pri jednom z prvých spustení potlačili množstvo varovaní. Bohužiaľ, statické analyzátory nie sú dokonalé, takže z času na čas dávajú falošne pozitívne výsledky. Zvyčajne je ľahké ich potlačiť; napríklad v doplnku PVS-Studio pre Visual Studio stačí kliknúť na jedno tlačidlo:

Statická analýza - od úvodu po integráciu
Môžete však urobiť viac, než ich len potlačiť. Môžete napríklad nahlásiť problém podpore. Ak sa dá falošný poplach opraviť, v budúcich aktualizáciách si môžete všimnúť, že zakaždým je menej a menej falošných poplachov špecifických pre vašu kódovú základňu.

Po integrácii

Takže sme prešli všetkými fázami integrácie statickej analýzy do procesu vývoja. Napriek dôležitosti nastavenia takýchto nástrojov na CI je najdôležitejším miestom na ich spustenie počítač vývojára. Statický analyzátor predsa nie je sudca, ktorý niekde ďaleko od vás povie, že kód nie je dobrý. Naopak, je to asistent, ktorý vám povie, či ste unavení a pripomenie vám, či ste na niečo nezabudli.

Je pravda, že bez pravidelného používania je nepravdepodobné, že by statická analýza výrazne zjednodušila vývoj. Jeho hlavný prínos pre vývojára napokon nespočíva ani tak v hľadaní zložitých a kontroverzných častí kódu, ale v ich skorej detekcii. Súhlaste s tým, že odhalenie problému po odoslaní úprav na testovanie je nielen nepríjemné, ale aj časovo veľmi náročné. Statická analýza pri pravidelnom používaní sleduje každú zmenu priamo vo vašom počítači a pri práci na kóde hlási podozrivé miesta.

A ak si vy alebo vaši kolegovia stále nie ste istí, či stojí za to implementovať analyzátor, navrhujem, aby ste teraz začali čítať článok "Dôvody na zavedenie statického analyzátora kódu PVS-Studio do procesu vývojaRieši typické obavy vývojárov, že statická analýza im zaberie čas a podobne.

Statická analýza - od úvodu po integráciu

Ak chcete tento článok zdieľať s anglicky hovoriacim publikom, použite odkaz na preklad: Maxim Zvjagincev. Statická analýza: Od začiatku po integráciu.

Zdroj: hab.com

Pridať komentár