Nezávislá recenze PVS-Studio (Linux, C++)

Viděl jsem publikaci, kterou se PVS naučil analyzovat pod Linuxem, a rozhodl jsem se ji vyzkoušet na svých vlastních projektech. A vzešlo z toho toto.


Obsah

  1. Pros
  2. Zápory
  3. Výsledky
  4. Doslov

Pros

Responzivní podpora

Požádal jsem o zkušební klíč a ještě ten den mi ho poslali.

Poměrně přehledná dokumentace

Spuštění analyzátoru se nám podařilo bez problémů. K dispozici je také nápověda pro příkazy konzoly (i když zde existují určité stížnosti, viz část Zápory).

Možnost vícevláknové analýzy

Analyzátor má možnost "standard". -j, což umožňuje provádět analýzu paralelně v několika úlohách. To ušetří spoustu času.

Dobrá vizualizace

Mnoho různých výstupních formátů, od textu až po malý webový náhubek. Webové rozhraní je pohodlné, stručné, s nápovědou vedle řádků v kódu a odkazy na diagnostické popisy.

Snadná integrace do sestavy

Veškerá dokumentace je na jejich webu, mohu jen říci, že pokud je váš projekt postaven pomocí CMake, pak je vše velmi jednoduché.

Dobré diagnostické popisy

Pokud generujete výstup v režimu fullhtml, pak má každá zpráva odkaz na diagnostický popis s vysvětlením, příklady kódu a dalšími odkazy.

Zápory

Neznalost jazyka C++ analyzátorem

Bohužel, PVS někdy dělá chyby v syntaxi a generuje falešně pozitivní zprávy, když je kód zcela správný.

Existuje například funkce, která vrací void:

template <typename T>
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible<T>::value
        >
{
    new (destination) T(*static_cast<const T *>(source));
}

Ano, klíčové slovo auto Může znamenat void, k tomu to je auto. Ale PVS vytvořil následující zprávy:

dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.

Velmi pomalý web

Ano, ve webovém rozhraní u každé zprávy je odkaz na odpovídající diagnostický popis s příklady. Když ale kliknete na odkaz, musíte čekat poměrně dlouho a někdy se to stane Časový limit brány 504.

jazyk

Všechny popisy jsou v ruštině, což je skvělé. Odkazy ze zprávy ale vždy vedou na anglickou verzi. Bylo by hezké mít možnost přepnout jazyk, abyste si mohli diagnostiku okamžitě prohlédnout v ruštině. V rozhraní jsem takovou možnost nenašel.

Je nepohodlné pracovat s diagnostickými úrovněmi přes konzoli

Začněme tím, že dva použité příkazy (toto pvs-studio-analyzer и plog-converter) různé formáty pro specifikaci diagnostiky.

Pomoc pro pvs-studio-analyzer zní:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

Dlouho jsem se snažil přijít na to, kam jít přidat (“přidání hodnot”). Pokusil jsem se je uvést oddělené čárkami:

pvs-studio-analyzer analyze ... -a 1,4,16

Několikrát jsem se pokusil zaregistrovat klíč:

pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16

A teprve potom jsem si uvědomil, že to byly bitové masky! A potřebujete shrnoutA ne přidat významy. Chcete-li například získat obecnou diagnostiku, diagnostiku pro mikrooptimalizace a MISRA, musíte je sečíst (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

Používání bitových masek v uživatelských rozhraních je obecně špatná forma. To vše by se dalo interně shrnout a uživateli by se dala nastavit sada příznaků.

Kromě toho je zde také užitečnost plog-converter, který generuje pro člověka čitelné informace statické analýzy. Má jiné problémy.

Nápověda k programu plog-converter zprávy:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

Objevily se zde některé „úrovně“, které tam dříve nebyly, a ani jsem o nich v dokumentaci nic nenašel.

Obecně to není jasné. Proto jsem vše nastavil na maximum.

Hromada hloupých nadávek na Catche

Dva ze tří projektů, které jsem analyzoval, používají knihovnu pro testování jednotek Catch2. A lví podíl zpráv (!!! 90 ze 138 v jedné a 297 z 344 ve druhé!!!) má následující tvar:

Nezávislá recenze PVS-Studio (Linux, C++)

Nebere v úvahu multithreading

Existuje mnoho falešných pozitiv o údajně neměnných proměnných nebo nekonečných smyčkách, zatímco práce s těmito proměnnými probíhá z různých vláken, a pokud by tomu tak nebylo, testy jednotek by nefungovaly.

Nezávislá recenze PVS-Studio (Linux, C++)

Může to však statický analyzátor vůbec vzít v úvahu? nevím.

Výsledky

PVS nenašel žádné skutečné chyby v mých open source projektech Roztržení и další, jakož i v pracovním návrhu, který z pochopitelných důvodů nemohu předložit. Je pravda, že stojí za to mít na paměti, že některé nedostatky již byly zachyceny a opraveny dříve Cppcheck и scan-build.

Obecně je dojem ze všech těchto analyzátorů přibližně stejný: ano, něco zachytí, někdy i něco důležitého, ale celkově je kompilátor dostačující.

Je možné (a já si to osobně rád myslím), že náš tým používá postupy vývoje softwaru, které nám umožňují generovat minimální množství posraného kódu. Je lepší problémy nevytvářet, než je hrdinsky překonávat.

Dovoluji si proto dát pár rad, jak psát v C++ tak, abych nikomu neustřelil nohy nebo nikoho nepraštil hráběmi do čela.

Využijte diagnostiku kompilátoru na maximum

Náš tým používá (a doporučuje vám) následující možnosti kompilace:

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

Povolte je ve svém projektu a naučte se hodně o svém kódu.

Držte se standardu

Pokuste se nepoužívat věci závislé na platformě, pokud existují standardní analogy, a pokud se bez nich absolutně neobejdete, zabalte je do speciálních bloků pro makra (nebo něco jiného) a jednoduše nenechte svůj kód kompilovat za nepodporovaných podmínek.

Držte se standardní sémantiky operací

Sčítání musí být sčítání, násobení musí být násobení, volání funkce musí být volání funkce, kopírování musí být kopírování, přenášení musí být přenášeno, kontejner musí být opakovatelný, iterátor musí mít propagaci ++ a dereferencování *. A tak dále a tak dále.

Myslím, že myšlenka je jasná. Existují zavedené konvence, které nejsou závazné, ale očekávají, že je uvidí všichni uživatelé a čtenáři vašeho kódu. Nesnažte se přelstít ostatní, jinak přelstíte sami sebe.

Napište kompatibilní kód

Především mám na mysli standardní knihovnu. Je velmi žádoucí, aby rozhraní vašich tříd a funkcí bylo možné používat se standardními a jinými knihovnami (například Boost).

Neváhejte se podívat na rozhraní STL a Boost. Až na vzácné výjimky tam uvidíte důstojný vzor.

Využijte nástroje s otevřeným zdrojovým kódem na maximum

Pro stejnou statickou analýzu existují alespoň dva otevřené bezplatné nástroje, které lze připojit pouze jednou k libovolnému projektu se systémem sestavení CMake.

Více si o tom můžete přečíst v mé nedávné publikaci.

Doslov

Na závěr bych rád zdůraznil, že neobhajuji nepoužívat PVS ani žádné jiné statické analyzátory. Ale doporučuji vám, abyste se zamysleli nad tím, jak se stalo, že statický analyzátor neustále nachází významné chyby ve vašem kódu.

To je jen důsledek. Musíme hledat a odstranit příčinu.

Zdroj: www.habr.com

Přidat komentář