Nepriklausoma PVS-Studio apžvalga (Linux, C++)

Pamačiau leidinį, kurį PVS išmoko analizuoti naudojant Linux, ir nusprendžiau jį išbandyti savo projektuose. Ir štai kas iš to išėjo.


Turinys

  1. Argumentai "už"
  2. Trūkumai
  3. rezultatai
  4. Afterword

Argumentai "už"

Atsakingas palaikymas

Aš paprašiau bandomojo rakto ir jie man jį atsiuntė tą pačią dieną.

Gana aiški dokumentacija

Analizatorių paleisti pavyko be problemų. Taip pat yra konsolės komandų pagalba (nors čia yra keletas nusiskundimų, žr Trūkumai).

Galimybė atlikti kelių gijų analizę

Analizatorius turi „standartinę“ parinktį -j, leidžianti analizę atlikti lygiagrečiai atliekant keletą užduočių. Taip sutaupoma daug laiko.

Gera vizualizacija

Daug įvairių išvesties formatų, nuo teksto iki mažo žiniatinklio snukio. Interneto sąsaja patogi, glausta, su užuominomis prie kodo eilučių ir nuorodomis į diagnostikos aprašymus.

Lengvas integravimas į komplektą

Visa dokumentacija yra jų svetainėje, galiu tik pasakyti, kad jei jūsų projektas yra sukurtas naudojant CMake, tada viskas yra labai paprasta.

Geri diagnostikos aprašymai

Jei generuojate išvestį režimu fullhtml, tada kiekviename pranešime yra nuoroda į diagnostikos aprašymą su paaiškinimais, kodų pavyzdžiais ir papildomomis nuorodomis.

Trūkumai

Analizatoriaus C++ kalbos nežinojimas

Deja, PVS kartais daro sintaksės klaidų ir generuoja klaidingus teigiamus pranešimus, kai kodas yra visiškai teisingas.

Pavyzdžiui, yra funkcija, kuri grąžina 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));
}

Taip yra pagrindinis žodis auto Gali reikšti void, tam jis ir skirtas automatinis. Tačiau PVS pateikė šiuos pranešimus:

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.

Labai lėta svetainė

Taip, žiniatinklio sąsajoje prie kiekvieno pranešimo yra nuoroda į atitinkamą diagnostikos aprašymą su pavyzdžiais. Tačiau paspaudus nuorodą tenka laukti gana ilgai, o kartais taip nutinka 504 Tinklas neveikia.

Kalba

Visi aprašymai yra rusų kalba, tai puiku. Tačiau ataskaitos nuorodos visada veda į anglišką versiją. Būtų gerai, kad būtų galima perjungti kalbą, kad iš karto būtų galima peržiūrėti diagnostiką rusiškai. Tokios parinkties sąsajoje neradau.

Dirbti su diagnostikos lygiais per pultą nepatogu

Pradėkime nuo to, kad buvo naudojamos dvi komandos (tai pvs-studio-analyzer и plog-converter) skirtingi diagnostikos nurodymo formatai.

Pagalba už pvs-studio-analyzer skaito:

-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

Aš ilgai bandžiau išsiaiškinti, kur eiti pridėti („pridėti reikšmes“) klavišus. Bandžiau juos išvardyti atskiriant kableliais:

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

Kelis kartus bandžiau užregistruoti raktą:

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

Ir tik tada supratau, kad tai bitutės! Ir tau reikia apibendrintiIr ne pridėti reikšmės. Pavyzdžiui, norėdami gauti bendrą diagnostiką, mikrooptimizavimo diagnostiką ir MISRA, turite juos susumuoti (4 + 8 + 32 = 44):

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

Bitkaukių naudojimas vartotojo sąsajose paprastai yra blogos formos. Visa tai galima būtų apibendrinti viduje, o vartotojui būtų galima nustatyti vėliavėlių rinkinį.

Be to, yra ir komunalinė priemonė plog-converter, kuri generuoja žmogaus skaitomą statinės analizės informaciją. Ji turi kitų problemų.

Pagalba programai plog-converter ataskaitos:

-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

Čia atsirado kažkokie „lygiai“, kurių anksčiau nebuvo, ir dokumentacijoje apie juos taip pat nieko neradau.

Apskritai tai nėra aišku. Todėl viską nustatau maksimaliai.

Krūva kvailų keiksmažodžių Catch

Du iš trijų mano analizuotų projektų naudoja vienetų testavimo biblioteką „Catch2“. O liūto dalis žinučių (!!! 90 iš 138 vienoje ir 297 iš 344 kitoje!!!) yra tokios formos:

Nepriklausoma PVS-Studio apžvalga (Linux, C++)

Neatsižvelgiama į daugiasriegius ryšius

Yra daug klaidingų teigiamų teiginių apie tariamai nesikeičiančius kintamuosius arba nesibaigiančius ciklus, o darbas su šiais kintamaisiais vyksta iš skirtingų gijų, o jei taip nebūtų, vienetiniai testai neveiks.

Nepriklausoma PVS-Studio apžvalga (Linux, C++)

Tačiau ar statinis analizatorius gali į tai atsižvelgti? Nežinau.

rezultatai

PVS mano atvirojo kodo projektuose nerado jokių tikrų klaidų Trūkimo и "Proxima", taip pat darbo juodraštyje, kurio dėl akivaizdžių priežasčių negaliu pateikti. Tiesa, verta nepamiršti, kad kai kurie trūkumai jau buvo pastebėti ir ištaisyti anksčiau naudojant Cppcheck и scan-build.

Apskritai įspūdis iš visų šių analizatorių yra maždaug toks pat: taip, jie kažką pagauna, kartais net kažką svarbaus, bet apskritai kompiliatoriaus pakanka.

Gali būti (ir aš asmeniškai mėgstu taip manyti), kad mūsų komanda taiko programinės įrangos kūrimo praktiką, leidžiančią mums sukurti minimalų šlykštaus kodo kiekį. Geriau nekurti problemų, nei herojiškai jas įveikti.

Todėl pasiimu laisvę duoti keletą patarimų, kaip C++ rašyti taip, kad niekam nenušautų kojos ir niekam netrenktų grėbliu į kaktą.

Išnaudokite visas kompiliatoriaus diagnostikos galimybes

Mūsų komanda naudoja (ir jums pataria) šias kompiliavimo parinktis:

-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

Įgalinkite juos savo projekte ir sužinokite daug apie savo kodą.

Laikykitės standarto

Stenkitės nenaudoti nuo platformos priklausančių dalykų, jei yra standartinių analogų, o jei visiškai negalite be jų, suvyniokite juos į specialius blokus makrokomandoms (ar dar kažkam) ir tiesiog neleiskite savo kodui kompiliuoti nepalaikomomis sąlygomis.

Laikykitės standartinės operacijos semantikos

Sudėjimas turi būti sudėjimas, daugyba turi būti daugyba, funkcijos iškvietimas turi būti funkcijos iškvietimas, kopijavimas turi būti kopijavimas, nešiojimas turi būti nešiojamas, konteineris turi būti kartojamas, iteratorius turi turėti reklamą ++ ir nuorodų panaikinimas *. Ir taip toliau.

Manau, kad mintis aiški. Yra nustatytos sutartys, kurios nėra privalomos, bet kurias tikisi matyti visi jūsų kodo vartotojai ir skaitytojai. Nemėginkite pergudrauti kitų, kitaip pergausite save.

Parašykite suderinamą kodą

Visų pirma, turiu omenyje standartinę biblioteką. Labai pageidautina, kad jūsų klasių ir funkcijų sąsajos būtų naudojamos su standartinėmis ir kitomis bibliotekomis (pavyzdžiui, „Boost“).

Nedvejodami pažiūrėkite į STL ir Boost sąsajas. Išskyrus retas išimtis, ten pamatysite vertą pavyzdį.

Išnaudokite visas atvirojo kodo įrankių galimybes

Tai pačiai statinei analizei yra bent du atviri nemokami įrankiai, kuriuos galima tik vieną kartą prijungti prie bet kurio projekto naudojant CMake kūrimo sistemą.

Daugiau apie tai galite perskaityti mano naujausiame leidinyje.

Afterword

Pabaigai noriu pabrėžti, kad aš nesiūlau nenaudoti PVS ar kitų statinių analizatorių. Bet aš raginu pagalvoti, kaip atsitiko, kad statinis analizatorius nuolat randa reikšmingų klaidų jūsų kode.

Tai tik pasekmė. Turime ieškoti ir pašalinti priežastis.

Šaltinis: www.habr.com

Добавить комментарий