Statická analýza – od seznámení po integraci

Když se už setkáváte s nekonečným code review nebo laděním, občas přemýšlíte, jak si usnadnit život. A po krátkém hledání nebo náhodném narazení můžete narazit na kouzelné spojení: "Statická analýza". Pojďme se podívat na to, co to je a jak může interagovat s vaším projektem.

Statická analýza – od seznámení po integraci
Pokud píšete v nějakém moderním jazyce, pak si zřejmě ani neuvědomujete, že skrze statického analyzátora procházíte. Fakt je, že každý moderní kompilátor poskytuje alespoň minimální sadu upozornění na potenciální problémy v kódu. Například, při kompilaci C++ kódu ve Visual Studio můžete vidět následující:

Statická analýza – od seznámení po integraci
V tomto výstupu vidíme, že proměnná var nikde ve funkci nebyla použita. Takže skutečně jste téměř vždy používali jednoduchý nástroj pro statickou analýzu kódu. Nicméně, na rozdíl od profesionálních analyzátorů, jako jsou Coverity, Klocwork nebo PVS-Studio, varování poskytovaná kompilátorem mohou naznačovat pouze malý rozsah problémů.

Pokud přesně nevíte, co je statická analýza a jak ji implementovat, si přečtěte tento článek, abyste se podrobněji seznámili s touto metodikou.

Proč je statická analýza potřebná?

Ve zkratce: urychlení a zjednodušení.

Statická analýza umožňuje odhalit spoustu různých problémů v kódu: od nesprávného používání jazykových konstrukcí po překlepy. Například místo

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

jste napsali následující kód:

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

Jak vidíte, v posledním řádku se objevila chyba. Například, PVS-Studio vydává následující varování:

V537 Zvažte přezkoumání správnosti používání položky 'y'.

Pokud chcete experimentovat s touto chybou, zkuste připravený příklad na Compiler Explorer: *klikněte*.

A jak víte, ne vždy lze okamžitě věnovat pozornost takovým částem kódu, a kvůli tomu se můžete zaseknout v ladění na dobré hodiny, aniž byste chápali, proč to vše funguje tak podivně.

Jedná se však o zjevnou chybu. A co když vývojář napsal neoptimální kód, protože zapomněl na nějakou jemnost jazyka? Nebo dokonce v kódu povolil undefined behavior? К сожалению, подобные случаи совершенно обыденны и львиная часть времени тратится на то, чтобы отладить специфично работающий код, который содержит опечатки, типичные ошибки или undefined behavior.

Právě pro takové situace vznikla statická analýza. Je to pomocník pro vývojáře, který mu ukáže různé problémy v kódu a vysvětlí v dokumentaci, proč by tak neměl psát, k čemu to může vést a jak to opravit. Tady je příklad, jak to může vypadat: *klikněte*.

Více zajímavých chyb, které může analyzátor odhalit, najdete v článcích:

Nyní, když jste si přečetli tento materiál a ujistili se o přínosu statické analýzy, mohli byste chtít vyzkoušet ji v praxi. Ale kde začít? Jak integrovat nový nástroj do aktuálního projektu? A jak se s ním seznámit tým? Na tyto otázky naleznete odpovědi níže.

Poznámka. Statická analýza nenahrazuje a neanuluje tak užitečnou věc, jako jsou přehledy kódu. Doplní tento proces a pomůže předem zaznamenat a opravit překlepy, nepřesnosti a nebezpečné konstrukce. Je mnohem produktivnější soustředit se při přehledech kódu na algoritmy a srozumitelnost kódu, než se zabývat hledáním špatně umístěné závorky nebo čtení nudných funkcí porovnání.

0. Seznámení s nástrojem

Všechno začíná zkušební verzí. Opravu se těžko rozhoduje zavést něco do procesu vývoje, pokud jste nikdy předtím neviděli nástroj naživo. Proto je prvním krokem stáhnout si zkoušební verzi.

Co se na této fázi dozvíte:

  • Jaké jsou způsoby interakce s analyzátorem;
  • Je analyzátor kompatibilní s vaším vývojovým prostředím;
  • Jaké problémy jsou nyní ve vašich projektech.

Jakmile si nainstalujete vše potřebné, je prvním krokem spustit analýzu celého projektu (Windows, Linux, macOS). V případě PVS-Studio ve Visual Studio uvidíte podobný obrázek (kliknutelné):

Statická analýza – od seznámení po integraci
Faktem je, že obvykle na projektech s velkou základnou kódu statické analyzátory generují obrovské množství upozornění. Není potřeba opravovat je všechny, protože váš projekt již funguje, což znamená, že tyto problémy nejsou kritické. Nicméně můžete se podívat na nejzajímavější upozornění. můžete se podívat na ta nejzajímavější upozornění. a upravit je podle potřeby. K tomu je třeba filtrovat výstup a ponechat pouze nejspolehlivější oznámení. V pluginu PVS-Studio pro Visual Studio se to provádí filtrováním podle úrovní a kategorií chyb. Pro co nejpřesnější výstup nechte aktivní pouze High a Obecné (také klikatelné):

Statická analýza – od seznámení po integraci
Opravdu, 178 varování je mnohem snazší prohlédnout než několik tisíc…

V záložkách Medium a Low se často objeví dobrá varování, avšak do těchto kategorií jsou zařazeny diagnostiky, které mají nižší přesnost (spolehlivost). Podrobnosti o úrovních varování a možnostech práce pod Windows si můžete prohlédnout zde: *klikněte*.

Úspěšně prozkoumat nejzajímavější chyby (a úspěšně je opravit) stojí za to potlačit zbývající varování. To je potřeba proto, aby nová varování nezanikla mezi starými. Kromě toho je statický analyzátor pomocníkem pro programátora, nikoli seznamem pro bugy. 🙂

1. Automatizace

Po seznámení nastává čas na nastavení pluginů a integraci do CI. Je třeba to udělat dříve, než programátoři začnou používat statický analyzátor. Faktem je, že programátor může zapomenout zapnout analýzu nebo ji vůbec nechtít. K tomu je potřeba provést určitou konečnou kontrolu, aby nezkontrolovaný kód nemohl proniknout do hlavní vývojové větve.

Co se na této fázi dozvíte:

  • Jaké možnosti automatizace nástroj nabízí;
  • Je analyzátor kompatibilní s vaším systémem sestavení.

Jelikož neexistuje ideální dokumentace, někdy je třeba napsat na podporu. Je to normální a rádi vám pomůžeme. 🙂

A nyní přejdeme k službám nepřetržité integrace (CI). Jakýkoli analyzátor lze do nich bez vážných problémů implementovat. K tomu je potřeba vytvořit samostatný krok v pipeline, který se obvykle nachází po sestavení a unit testech. Dělá se to pomocí různých konzolových utilit. Například PVS-Studio poskytuje následující utility:

Pro integraci analýzy do CI je třeba udělat tři věci:

  • Nainstalovat analyzátor;
  • Spustit analýzu;
  • Dodat výsledky.

Například pro instalaci PVS-Studio na Linux (Debian-based) je třeba provést následující pří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

V systémech řízených Windows není možné nainstalovat analyzátor pomocí správce balíčků, ale lze rozbalit analyzátor z příkazového řádku:

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

Více o nasazení PVS-Studio v systémech řízených Windows si můžete přečíst *tady*.

Po instalaci je třeba spustit samotnou analýzu. Nicméně doporučuje se to provést až po kompilaci a testech. To je dáno tím, že pro statickou analýzu obvykle potřebujete dvakrát více času než pro kompilaci.

Jelikož způsob spuštění závisí na platformě a charakteristikách projektu, ukážu variantu pro C++ (Linux) jako příklad:

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

První příkaz provede analýzu a druhý konvertujereport do textového formátu, zobrazí ho na obrazovce a vrátí nenulový návratový kód v případě, že existují varování. Takový mechanismus je pohodlné používat k zablokování sestavení v případě, že existují zprávy o chybách. Nicméně můžete vždy odstranit příznak -w a nezablokovat sestavení obsahující varování.

Poznámka. Textový formát – to není pohodlné. Je uveden pouze jako příklad. Všimněte si zajímavějšího formátu zprávy – FullHtml. Umožňuje provádět navigaci po kódu.

Více o nastavení analýzy na CI si můžete přečíst v článku "PVS-Studio a Continuous Integration" (Windows) nebo "Jak nastavit PVS-Studio v Travis CI" (Linux).

Dobře, nastavili jste práci analyzátoru na sestavovacím serveru. Nyní, pokud někdo nahrál neověřený kód, bude selhávat fáze kontroly a vy odhalíte problém, ale není to zcela pohodlné, protože efektivnější je kontrolovat projekt před tím, než dojde k sloučení větví, a to na fázi pull requestu.

Celkově se nastavení analýzy pull requestu neliší příliš od běžného spuštění analýzy na CI. S výjimkou potřeby získat seznam změněných souborů. Obvykle je možné je získat požádáním o rozdíl mezi větvemi pomocí git:

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

Nyní je třeba předat analyzátoru tento seznam souborů. Například v PVS-Studio je to realizováno pomocí příznaku. -S:

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

O analýze pull requestů se můžete dozvědět *tady*. I když váš CI není v seznamu uvedených služeb, bude pro vás užitečná obecná část věnovaná teorii tohoto typu analýzy.

Nastavením analýzy pull requestů můžete blokovat commity obsahující upozornění, čímž vytvoříte hranici, kterou nepřezkoumaný kód nemůže překročit.

To všechno je jistě dobré, ale rád bych měl možnost vidět všechna upozornění na jednom místě. Nejen z statického analyzátoru, ale i z unit testů nebo z dynamického analyzátoru. K tomu existují různé služby a pluginy. PVS-Studio například má plugin pro integraci do SonarQube..

2. Integrace na stroje vývojářů

Nyní je čas nainstalovat a nakonfigurovat analyzátor pro každodenní použití při vývoji. V tomto okamžiku jste se už seznámili s většinou způsobů práce, takže to můžeme nazvat tou nejjednodušší částí.

Nejjednodušší možností je, že si vývojáři mohou nainstalovat potřebný analyzátor sami. To však zabere hodně času a odvede je to od vývoje, proto můžete tento proces automatizovat pomocí instalátoru a potřebných příznaků. Pro PVS-Studio existují různé příznaky pro automatizovanou instalaci.. Nicméně existují vždy balíčkové manažery, například Chocolatey (Windows), Homebrew (macOS) nebo desítky variant pro Linux.

Poté je potřeba nainstalovat potřebné pluginy, například pro Visual Studio., IDEA., Rider. atd.

3. Každodenní používání

V této fázi je na čase říct pár slov o způsobech, jak urychlit práci analyzátoru při každodenním používání. Kompletní analýza celého projektu zabere hodně času, ale jak často měníme kód najednou v celém projektu? Obtížně existuje tak rozsáhlá refaktorizace, která by najednou zasáhla celou kódovou základnu. Počet měněných souborů najednou zřídka přesáhne deset, takže je smysluplné je analyzovat. Pro takovou situaci existuje režim inkrementální analýzy.. Jen se nelekejte, to není další nástroj. Je to speciální režim, který umožňuje analyzovat pouze změněné soubory a jejich závislosti, a to automaticky po sestavení, pokud pracujete v IDE s nainstalovaným pluginem.

Pokud analyzátor objeví problémy v nedávno změněném kódu, upozorní vás na to sám. Například PVS-Studio vám o tom dá vědět pomocí upozornění:

Statická analýza – od seznámení po integraci
Samozřejmě nestačí říct vývojářům, aby nástroj používali. Je třeba jim nějak vysvětlit, co to vlastně je a jak to funguje. Například zde jsou články o rychlém startu pro PVS-Studio, ale podobné tutoriály naleznete pro jakýkoli vámi preferovaný nástroj:

Podobné články poskytují vše potřebné informace pro každodenní používání a nezabírají příliš času. 🙂

Už při seznamování se s nástrojem jsme potlačili spoustu upozornění během jednoho z prvních spuštění. Bohužel, statické analyzátory nejsou dokonalé, a proto občas dávají falešné alarmy. Obvykle je snadné je potlačit, například v pluginu PVS-Studio pro Visual Studio stačí stisknout jedno tlačítko:

Statická analýza – od seznámení po integraci
Ale můžete je nejen potlačovat. Například můžete podmínit podporu o přítomnosti problému. Pokud falešný alarm lze opravit, pak ve budoucích aktualizacích můžete zaznamenat, že se s každým dalším spuštěním stává stále méně a méně specifických falešných alarmů pro vaši kódovou základnu.

Po integraci

A jsme na konci všech etap integrace statické analýzy do vývojového procesu. Navzdory důležitosti nastavení takových nástrojů v CI, hlavním místem spuštění je počítač vývojáře. Koneckonců, statický analyzátor není soudce, který kdesi daleko říká, že kód nikam nepatří. Naopak, je to asistent, který vám naznačuje, pokud jste unavení, a připomíná, pokud na něco zapomenete.

Pravda, bez pravidelného používání, statická analýza pravděpodobně významně neulehčí vývoj. Vždyť její největší výhoda pro vývojáře spočívá nejen v hledání složitých a sporných částí kódu, ale také v jejich včasném odhalení. Souhlasíte, že zjistit problém, když opravy už byly odeslány na testování, není jen nepříjemné, ale také velmi zdlouhavé. Statická analýza však při pravidelném používání kontroluje každou změnu přímo na vašem počítači a informuje vás o podezřelých místech během práce na kódu.

A pokud vy nebo vaši kolegové stále nejste jisti, zda zavést analyzátor, doporučuji nyní přejít k přečtení článku "Důvody, proč implementovat statický analyzátor kódu PVS-Studio do vývojového procesu". V něm se řeší běžné obavy vývojářů, že statická analýza jim vezme čas a podobně.

Statická analýza – od seznámení po integraci

Pokud chcete sdílet tento článek s anglicky mluvícím publikem, prosím použijte odkaz na překlad: Maxim Zvyagintsev. Statická analýza: Od začátku až po integraci.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster