Neovisna recenzija PVS-Studio (Linux, C++)

Vidio sam publikaciju koju je PVS naučio analizirati pod Linuxom i odlučio je isprobati na vlastitim projektima. I evo što je ispalo iz toga.


sadržaj

  1. Prozodija
  2. Cons
  3. Rezultati
  4. pogovor

Prozodija

Odzivna podrška

Zatražio sam probni ključ i poslali su mi ga isti dan.

Prilično jasna dokumentacija

Uspjeli smo bez problema pokrenuti analizator. Također je dostupna pomoć za konzolne naredbe (iako ovdje ima nekih pritužbi, pogledajte odjeljak Cons).

Mogućnost višenitne analize

Analizator ima opciju "standard". -j, što omogućuje paralelno provođenje analize u nekoliko zadataka. Ovo štedi mnogo vremena.

Dobra vizualizacija

Mnogo različitih izlaznih formata, od teksta do male web njuške. Web sučelje je praktično, sažeto, sa savjetima pored redaka u kodu i poveznicama na dijagnostičke opise.

Jednostavna integracija u sklop

Sva dokumentacija je na njihovoj web stranici, mogu samo reći da ako je vaš projekt izgrađen pomoću CMakea, onda je sve vrlo jednostavno.

Dobri dijagnostički opisi

Ako generirate izlaz u modu fullhtml, tada svaka poruka ima poveznicu na dijagnostički opis, s objašnjenjima, primjerima kodova i dodatnim poveznicama.

Cons

Nepoznavanje jezika C++ od strane analizatora

Nažalost, PVS ponekad pravi sintaktičke pogreške i generira lažno pozitivne poruke kada je kod potpuno ispravan.

Na primjer, postoji funkcija koja vraća 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));
}

Da je ključna riječ auto Može značiti void, za to i služi automobil. Ali PVS je proizveo sljedeće poruke:

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.

Vrlo spora stranica

Da, u web sučelju uz svaku poruku nalazi se poveznica na odgovarajući dijagnostički opis s primjerima. Ali kada kliknete na link, morate čekati prilično dugo, a ponekad se i to dogodi Istek vremena 504 pristupnika.

Jezik

Svi opisi su na ruskom, što je super. Ali poveznice iz izvješća uvijek vode do engleske verzije. Bilo bi lijepo da možete promijeniti jezik tako da možete odmah vidjeti dijagnostiku na ruskom. Nisam našao takvu opciju u sučelju.

Nezgodno je raditi s dijagnostičkim razinama preko konzole

Počnimo s činjenicom da su dvije korištene naredbe (ova pvs-studio-analyzer и plog-converter) različiti formati za određivanje dijagnostike.

Pomoć za pvs-studio-analyzer glasi:

-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

Dugo sam pokušavao smisliti kamo ići dodati ("dodavanje vrijednosti") tipke. Pokušao sam ih navesti odvojene zarezima:

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

Pokušao sam nekoliko puta registrirati ključ:

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

I tek tada sam shvatio da su to bitne maske! I trebate zbrojitiI ne dodati značenja. Na primjer, da biste dobili opću dijagnostiku, dijagnostiku za mikrooptimizacije i MISRA, trebate ih zbrojiti (4 + 8 + 32 = 44):

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

Korištenje bitmaski u korisničkim sučeljima općenito je loš oblik. Sve bi se to moglo interno sažeti, a korisniku bi se mogao postaviti skup oznaka.

Osim toga, postoji i uslužni program plog-converter, koji generira čitljive informacije o statičkoj analizi. Ona ima drugih problema.

Pomoć za program plog-converter izvještaji:

-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

Ovdje su se pojavile neke "razine" kojih prije nije bilo, a ni u dokumentaciji nisam našao ništa o njima.

Općenito, nije jasno. Zato sam sve postavio na maksimum.

Hrpa glupih psovki na račun Catcha

Dva od tri projekta koja sam analizirao koriste biblioteku za testiranje jedinice Catch2. A lavovski dio poruka (!!! 90 od 138 u jednoj i 297 od 344 u drugoj!!!) ima sljedeći oblik:

Neovisna recenzija PVS-Studio (Linux, C++)

Ne uzima u obzir multithreading

Mnogo je lažno pozitivnih o navodno nepromjenjivim varijablama ili beskonačnim petljama, dok se rad s tim varijablama odvija iz različitih niti, a da to nije tako, jedinični testovi ne bi funkcionirali.

Neovisna recenzija PVS-Studio (Linux, C++)

Međutim, može li statički analizator to uopće uzeti u obzir? ne znam

Rezultati

PVS nije pronašao stvarne greške u mojim projektima otvorenog koda Burst и Sljedeći, kao iu radnom nacrtu, koji iz očiglednih razloga ne mogu prezentirati. Istina, vrijedi imati na umu da su neki nedostaci već uočeni i ispravljeni ranijim korištenjem Cppcheck и scan-build.

Općenito, dojam svih ovih analizatora je približno isti: da, uhvate nešto, ponekad čak i nešto važno, ali generalno, kompajler je dovoljan.

Moguće je (i ja osobno volim tako misliti) da naš tim koristi praksu razvoja softvera koja nam omogućuje generiranje minimalne količine usranog koda. Bolje je ne stvarati probleme nego ih herojski prevladavati.

Stoga si uzimam slobodu dati nekoliko savjeta o tome kako pisati u C++-u tako da nikome ne propucate noge ili udarite grabljama u čelo.

Maksimalno iskoristite dijagnostiku prevoditelja

Naš tim koristi (i savjetuje vam) sljedeće opcije kompilacije:

-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

Omogućite ih u svom projektu i naučite puno o svom kodu.

Držite se standarda

Pokušajte ne koristiti stvari ovisne o platformi ako postoje standardni analozi, a ako apsolutno ne možete bez njih, zamotajte ih u posebne blokove za makronaredbe (ili nešto drugo) i jednostavno ne dopustite da se vaš kod kompajlira pod nepodržanim uvjetima.

Držite se standardne semantike operacije

Zbrajanje mora biti zbrajanje, množenje mora biti množenje, poziv funkcije mora biti poziv funkcije, kopiranje mora biti kopiranje, prijenos mora biti prijenos, spremnik mora biti iterable, iterator mora imati promociju ++ i dereferenciranje *. I tako dalje.

Mislim da je ideja jasna. Postoje utvrđene konvencije koje nisu obvezujuće, ali koje svi korisnici i čitatelji vašeg koda očekuju da će vidjeti. Ne pokušavajte nadmudriti druge, inače ćete nadmudriti sebe.

Napišite kompatibilni kod

Prije svega, mislim na standardnu ​​knjižnicu. Vrlo je poželjno da se sučelja vaših klasa i funkcija mogu koristiti sa standardnim i drugim bibliotekama (na primjer, Boost).

Slobodno pogledajte STL i Boost sučelja. Uz rijetke iznimke, tamo ćete vidjeti dostojnog uzora.

Iskoristite najbolje alate otvorenog koda

Za istu statičku analizu postoje najmanje dva otvorena besplatna alata koji se samo jednom mogu povezati s bilo kojim projektom sa sustavom za izgradnju CMake.

Više o tome možete pročitati u mojoj nedavnoj publikaciji.

pogovor

Na kraju, želio bih naglasiti da ne zagovaram da se ne koristi PVS ili bilo koji drugi statički analizator. Ali potičem vas da razmislite o tome kako se dogodilo da statički analizator neprestano pronalazi značajne pogreške u vašem kodu.

Ovo je samo posljedica. Moramo tražiti i otkloniti uzrok.

Izvor: www.habr.com

Dodajte komentar