Revisione indipendente di PVS-Studio (Linux, C++)

Aghju vistu una publicazione chì PVS avia amparatu à analizà sottu Linux, è decisu di pruvà nantu à i mo prughjetti. È questu hè ciò chì hè surtitu da questu.


Cuntenuti

  1. Плюсы
  2. Минусы
  3. Risultati
  4. Afterword

Плюсы

Supportu responsive

Aghju dumandatu una chjave di prova è mi l'hanu mandatu u stessu ghjornu.

Documentazione abbastanza chjara

Avemu riesciutu à lancià l'analizzatore senza prublemi. L'aiutu per i cumandamenti di a cunsola hè ancu dispunibule (ancu se ci sò qualchi lagnanza quì, vede a sezione Минусы).

Possibilità di analisi multi-thread

L'analizzatore hà una opzione "standard". -j, chì permette l'analisi per esse realizatu in parallelu in parechje attività. Questu salva assai tempu.

Bona visualizazione

Parechji furmati di pruduzzioni diffirenti, da u testu à una piccula musa web. L'interfaccia web hè cunvenuta, cuncisa, cù suggerimenti vicinu à e linee in u codice è ligami per descrizzioni di diagnostichi.

Integrazione faciule in l'assemblea

Tutta a documentazione hè in u so situ web, possu dì solu chì se u vostru prughjettu hè custruitu cù CMake, allora tuttu hè assai simplice.

Boni descrizzioni diagnostichi

Se genera output in modu fullhtml, allura ogni missaghju hà un ligame à una descrizzione di diagnostica, cù spiegazioni, esempi di codice è ligami supplementari.

Минусы

Ignuranza di a lingua C++ da l'analizzatore

Sfurtunatamente, PVS qualchì volta fa errori di sintassi è genera messagi falsi pusitivi quandu u codice hè cumplettamente currettu.

Per esempiu, ci hè una funzione chì torna 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));
}

Iè hè a parolla chjave auto Pò significà void, hè per quessa vittura. Ma PVS hà pruduttu i seguenti missaghji:

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.

Situ assai lento

Iè, in l'interfaccia web accantu à ogni missaghju ci hè un ligame à a descrizzione di diagnostica currispondente cù esempi. Ma quandu cliccate nant'à un ligame, duvete aspittà assai tempu, è qualchì volta succede 504 Gateway Time-out.

Lingua

Tutte e descrizzioni sò in russo, chì hè grande. Ma i ligami da u rapportu sempre portanu à a versione inglese. Saria bellu di pudè cambià a lingua in modu chì pudete vede i diagnostichi immediatamente in Russu. Ùn aghju micca trovu una tale opzione in l'interfaccia.

Hè sconveniente per travaglià cù livelli di diagnostichi via a cunsola

Cuminciamu cù u fattu chì i dui cumandamenti utilizati (questu pvs-studio-analyzer и plog-converter) diversi formati per specificà i diagnostichi.

Aiutu per pvs-studio-analyzer leghje:

-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

Aghju passatu assai tempu à pruvà à capisce induve andà aghjunghje ("aghjunghje i valori") chjave. Aghju pruvatu à listinu separati da virgole:

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

Aghju pruvatu à registrà a chjave parechje volte:

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

È solu tandu aghju capitu chì si trattava di maschere di pocu ! È avete bisognu riassumeè micca aghjunghje significati. Per esempiu, per ottene diagnostichi generali, diagnostichi per micro-optimizazione è MISRA, avete bisognu di riassume (4 + 8 + 32 = 44):

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

L'usu di maschere di bit in l'interfacce d'utilizatori hè generalmente una mala forma. Tuttu chistu puderia esse riassuntu internamente, è un settore di bandieri puderia esse stabilitu per l'utilizatore.

Inoltre, ci hè ancu una utilità plog-converter, chì genera informazioni di analisi statica leggibile da l'omu. Ella hà altri prublemi.

Aiutu per u prugramma plog-converter rapporti:

-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

Certi "livelli" apparsu quì chì ùn eranu micca prima, è ùn aghju micca truvatu nunda di elli in a documentazione.

In generale, ùn hè micca chjaru. Hè per quessa chì aghju stabilitu tuttu à u massimu.

Una mansa di stupidi ghjuramentu nantu à Catch

Dui di i trè prughjetti chì aghju analizatu utilizanu una biblioteca di teste di unità Catch2. È a parte di u leone di i missaghji (!!! 90 di 138 in unu è 297 di 344 in l'altru !!!) anu a seguente forma:

Revisione indipendente di PVS-Studio (Linux, C++)

Ùn piglia micca in contu multithreading

Ci hè parechje falsi pusitivi nantu à variabili presumibilmente immubiliate o cicli interminabili, mentre chì u travagliu cù sti variàbili si trova da diversi fili, è s'ellu ùn era micca cusì, i testi di unità ùn anu micca travagliatu.

Revisione indipendente di PVS-Studio (Linux, C++)

Tuttavia, un analizatore staticu pò ancu piglià questu in contu? Ùn sapè.

Risultati

PVS ùn hà micca truvatu alcunu bug reale in i mo prughjetti open source Burst и Dopu, è ancu in un prughjettu di travagliu, chì, per ragioni evidenti, ùn possu micca presentà. Hè veru, vale a pena tene in mente chì certi difetti sò digià stati catturati è curretti prima cù Cppcheck и scan-build.

In generale, l'impressione di tutti questi analizatori hè apprussimatamente a stessa: iè, piglianu qualcosa, qualchì volta ancu qualcosa impurtante, ma in generale u compilatore hè abbastanza.

Hè pussibule (è personalmente mi piace à pensà cusì) chì a nostra squadra usa pratiche di sviluppu di software chì ci permettenu di generà una quantità minima di codice di merda. Hè megliu micca di creà prublemi chè di superà heroicamente.

Dunque, mi pigliu a libertà di dà cunsiglii per scrive in C++ in modu di ùn sparà micca i gammi di nimu o colpi à nimu in a fronte cù un rake.

Fate u massimu di diagnostichi di compilatore

A nostra squadra usa (è vi cunsiglia) e seguenti opzioni di compilazione:

-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

Attivateli in u vostru prughjettu è amparà assai nantu à u vostru codice.

Stick à u standard

Pruvate micca di utilizà e cose dipendente da a piattaforma s'ellu ci sò analoghi standard, è se ùn pudete micca fà senza elli, imbulighjate in blocchi speciali per macros (o qualcos'altro) è simpricimenti ùn lasciate micca u vostru còdice cumpilatu in cundizioni senza supportu.

Attentate à a semantica di l'operazione standard

L'addizione deve esse addizione, a multiplicazione deve esse a multiplicazione, a chjama di a funzione deve esse una chjamata di funzione, a copia deve esse copia, u trasportu deve esse trasportatu, u containeru deve esse iterable, l'iteratore deve avè promozione ++ e dereferenziazione *. E cetara è cetara.

Pensu chì l'idea hè chjara. Ci sò cunvenzioni stabilite chì ùn sò micca ubligatori, ma chì tutti l'utilizatori è i lettori di u vostru codice aspettanu di vede. Ùn pruvate micca di schernà l'altri, altrimenti vi sbatterete.

Scrivite u codice compatible

Prima di tuttu, vogliu dì a biblioteca standard. Hè assai desideratu chì l'interfaccia di e vostre classi è funzioni ponu esse aduprate cù biblioteche standard è altre (per esempiu, Boost).

Sentite liberu di piglià un ochju à l'interfaccia STL è Boost. Cù rari eccezzioni, vi vede un mudellu degnu quì.

Sfruttate u massimu di l'arnesi open source

Per a stessa analisi statica, ci sò almenu dui strumenti gratuiti aperti chì ponu esse cunnessi una sola volta à qualsiasi prughjettu cù u sistema di creazione CMake.

Pudete leghje più nantu à questu in a mo publicazione recente.

Afterword

Infine, vogliu enfatizà chì ùn sò micca favurendu micca di utilizà PVS o qualsiasi altri analizatori statichi. Ma vi incuraghjite à pensà à cumu hè accadutu chì l'analizzatore staticu trova constantemente errori significativi in ​​u vostru codice.

Questu hè solu una cunsequenza. Avemu bisognu di circà è eliminà a causa.

Source: www.habr.com

Add a comment