Nezávislý prehľad PVS-Studio (Linux, C++)

Zaznamenal som príspevok o tom, že PVS sa naučil analyzovať pod Linuxom a rozhodol som sa to vyskúšať na svojich projektoch. A toto je výsledok.


Obsah

  1. Výhody
  2. Nevýhody
  3. Zhrnutie
  4. Pósledok

Výhody

Reaktívna podpora

Požiadal som o skúšobný kľúč a v ten istý deň mi ho poslali.

Dostatočne zrozumiteľná dokumentácia

Analyzátor sa mi podarilo spustiť bez väčších problémov. Existuje aj pomoc k príkazom v konzole (aj keď tu sú určité výhrady, pozrite sa na časť Nevýhody).

Možnosť viacerého spracovania

Analyzátor má "štandardnú" možnosť -j, ktorá umožňuje vykonávať analýzu paralelne v niekoľkých úlohách. To šetrí čas.

Dobrá vizualizácia

Množstvo rôznych formátov výstupu, od textového po malú webovú interfejs. Webový interfejs je praktický, stručný, s nápovedami vedľa riadkov v kóde a odkazmi na popisy diagnostiky..

Jednoduchá integrácia do zostavy

Všetka dokumentácia je na ich stránke, poviem len to, že ak sa váš projekt zostavuje s pomocou CMake, je to veľmi jednoduché.

Dobré popisy diagnostiky

Ak generujete výstup v režime fullhtml, každá správa má odkaz na opis diagnostiky, s vysvetlením, príkladmi kódu a ďalšími odkazmi.

Nevýhody

Neznalosť analyzátora jazyka C++

Bohužiaľ, PVS občas robí chyby v syntaxi a generuje falošne pozitívne správy pri úplne správnom kóde.

Napríklad, existuje funkcia, ktorá vracia 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));
}

Áno, kľúčové slovo auto môže znamenať void, preto jeto auto. Ale PVS vydal tieto sprá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.

Veľmi pomalá stránka

Áno, v webovom interfejse je vedľa každej správy odkaz na príslušný opis diagnostiky s príkladmi. Ale pri kliknutí na odkaz treba čakať dosť dlho, a niekedy sa stane aj to, že 504 Gateway Time-out.

Jazyk

Všetky popisy sú v ruštine, čo je skvelé. Ale odkazy z správy vždy vedú na anglickú verziu. Bolo by dobré mať možnosť prepínať jazyk, aby sa diagnostiky dali nielen pozerať na rusku. V rozhraní som takúto možnosť nenašiel.

Nepríjemné pracovať s úrovňami diagnostiky cez konzolu.

Začneme tým, že obe používané príkazy (to je pvs-studio-analyzer a plog-converter) majú odlišné formáty zadávania diagnostiky.

Príručka k pvs-studio-analyzer hovorí:

-a [MODE], --analysis-mode [MODE]
    MODE určuje typ varovaní:
    1 - 64-bitové chyby;
    2 - rezervované;
    4 - Všeobecná analýza;
    8 - Mikrooptimalizácie;
    16 - Špecifické požiadavky zákazníkov;
    32 - MISRA.
    Režimy môžu byť kombinované sčítaním hodnôt.
    Predvolená hodnota: 4

Dlho som sa snažil pochopiť, kam je potrebné pridať („adding the values“) kľúče. Snažil som sa ich vymenovávať cez čiarku:

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

Snažil som sa uvádzať kľúč viackrát:

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

Až potom som si uvedomil, že to sú predsa bitové masky! A je potrebné sčítať, a ne pridať hodnoty. Napríklad, aby som získal všeobecné diagnostiky, diagnostiky mikrooptimalizácií a MISRA, musím ich sčítať (4 + 8 + 32 = 44):

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

Používanie bitových masiek v užívateľských rozhraniach je vo všeobecnosti nevhodné. Všetky tieto hodnoty mohli byť sčítané rovnako aj vo vnútri a používateľovi len nastaviť súbor flagov.

Okrem toho existuje aj utilita plog-converter, ktorá generuje ľuďom čitateľné informácie o statickej analýze. Má iné špecifiká.

Príručka k programu plog-converter oznamuje:

-a, --analyzer            Určuje analyzátor(y) a úroveň/(e), ktoré sa majú
                          použiť na filtrovanie, t.j.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Predvolená hodnota: GA:1,2

Tu sa objavili akési „úrovne“, ktoré predtým nikde neboli, a v dokumentácii som o nich tiež nič nenašiel.

Celkovo to nie je jasné. Preto som všetko nastavoval na maximum.

Hromada bezvýznamného nadávania na Catch

Vo dvoch z troch projektov, ktoré som analyzoval, sa používa knižnica pre modulárne testovanie Catch2. A značná časť hlásení (!!! 90 z 138 v jednom a 297 z 344 v inom !!!) má nasledujúci formát:

Nezávislý prehľad PVS-Studio (Linux, C++)

Nezohľadňuje vícero vlákien

Veľa falošných pozitívnych výstupov o údajne nemenných premenných alebo nekonečných cykloch, pričom práca s týmito premennými prebieha z rôznych vlákien, a keby to nebolo tak, modulárne testy by neprebiehali.

Nezávislý prehľad PVS-Studio (Linux, C++)

Môže vôbec statický analyzátor niečo také zohľadniť? Neviem.

Zhrnutie

PVS nenašiel ani jednu skutočnú chybu v mojich otvorených projektoch Burst a Proxima, ako aj v pracovnom projekte, ktorý nemôžem z rozumných dôvodov predložiť. Treba však mať na pamäti, že niektoré nedostatky už boli odhalené a opravené skôr pomocou Cppcheck a scan-build.

Celkový dojem zo všetkých týchto analyzátorov je približne rovnaký: áno, niečo zachytávajú, občas aj niečo dôležité, ale vo všeobecnosti stačí kompilátor.

Možno (a mne osobne je príjemné takto myslieť), že náš tím používa také postupy vývoja softvéru, ktoré umožňujú generovať minimálne množstvo zlého kódu. Je lepšie nevytvárať problémy, ako ich hrdinsky prekonávať.

Preto si dovoľujem ponúknuť niekoľko rád, ako písať v jazyku C++, aby ste nikomu nezranili nohy a neudreli sa do čela.

Používajte diagnostiku kompilátora naplno

Náš tím používa (a odporúča vám) nasledujúce možnosti kompilácie:

-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

Zahrňte ich do svojho projektu, naučíte sa veľa nového o svojom kóde.

Dodržujte štandard

Snažte sa nepoužívať závislé na platforme veci, ak existujú štandardné analógy, a ak sa bez nich naozaj nedá obísť, zabaľte ich do špeciálnych blokov pod makro (alebo inak) a jednoducho nenechajte váš kód skompilovať v nepodporovaných podmienkach.

Dodržujte štandardnú semantiku operácií

Sčítanie by malo byť sčítaním, násobenie — násobením, volanie funkcie — volaním funkcie, kopírovanie by malo kopírovať, prenesenie — prenášať, kontajner by mal byť iterovateľný, iterátor by mal mať posun ++ a dereferencovanie *. A tak ďalej, a tak ďalej.

Myslím, že myšlienka je jasná. Existujú ustálené dohody, ktoré nie sú povinné, ale ktoré očakávajú všetci používatelia a čitatelia vášho kódu. Nesnažte sa obohatiť iných, pretože tak obohatíte sami seba.

Píšte kompatibilný kód

Predovšetkým mám na mysli štandardnú knižnicu. Je veľmi žiaduce, aby rozhrania vašich tried a funkcií mohli byť použité so štandardnými a inými knižnicami (napríklad Boostom).

Neváhajte nahliadnuť do rozhraní STL a Boost. S výnimkou niekoľkých prípadov tam nájdete dôstojný príklad na nasledovanie.

Využite naplno otvorené nástroje

Na statickú analýzu existujú minimálne dva otvorené bezplatné nástroje, ktoré sa pripoja k akémukoľvek projektu so systémom CMake na jeden úkon.

Podrobnejšie informácie nájdete v mojej nedávnej publikácii..

Pósledok

Na záver chcem zdôrazniť, že neodporúčam nepoužívať PVS ani žiadne iné statické analyzátory. Odporúčam však zamyslieť sa nad tým, ako sa stalo, že statický analyzátor neustále nachádza vo vašom kóde významné chyby.

To je len dôsledok. Je potrebné hľadať a odstraňovať príčinu.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster