PVS-Studio-ren berrikuspen independentea (Linux, C++)

PVS Linux-en aztertzen ikasi zuen argitalpen bat ikusi nuen, eta nire proiektuetan probatzea erabaki nuen. Eta hortik atera zena.


Edukia

  1. Pros
  2. Cons
  3. Emaitzak
  4. afterword

Pros

Laguntza erantzunkorra

Proba-giltza eskatu nuen eta egunean bertan bidali zidaten.

Dokumentazio nahiko argia

Inongo arazorik gabe lortu genuen analizatzailea martxan jartzea. Kontsolaren komandoetarako laguntza ere eskuragarri dago (nahiz eta hemen kexa batzuk egon, ikusi atala Cons).

Hari anitzeko analisia egiteko aukera

Analizatzaileak aukera "estandarra" du -j, hainbat atazatan analisiak paraleloki egiteko aukera emanez. Horrek denbora asko aurrezten du.

Ikuspegi ona

Irteera formatu ezberdin asko, testutik hasi eta web moko txiki bateraino. Web interfazea erosoa, zehatza da, kodearen lerroen ondoan aholkuak eta diagnostiko deskribapenetarako estekak ditu.

Integrazio erraza muntaian

Dokumentazio guztia haien webgunean dago, zure proiektua CMake erabiliz eraikitzen bada, dena oso erraza dela esan dezaket.

Diagnostiko deskribapen onak

Irteera moduan sortzen baduzu fullhtml, gero mezu bakoitzak diagnostiko deskribapen baterako esteka bat dauka, azalpenekin, kode-adibideekin eta esteka osagarriekin.

Cons

Analizatzaileak C++ hizkuntzaren ezjakintasuna

Zoritxarrez, PVSk batzuetan sintaxi akatsak egiten ditu eta mezu positibo faltsuak sortzen ditu kodea guztiz zuzena denean.

Adibidez, itzultzen den funtzio bat dago 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));
}

Bai da hitz gakoa auto Esan dezake void, horretarako da autoa. Baina PVSk mezu hauek sortu zituen:

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.

Oso gune motela

Bai, mezu bakoitzaren ondoan dagoen web-interfazean dagokion diagnostiko deskribapenerako esteka dago adibideekin. Baina esteka batean klik egiten duzunean, denbora luzez itxaron behar duzu, eta batzuetan gertatzen da 504 Gateway Denbora-muga.

Hizkuntzen

Deskribapen guztiak errusieraz daude, eta hori bikaina da. Baina txostenaren estekek ingelesezko bertsiora eramaten dute beti. Ederra litzateke hizkuntzaz aldatzea, diagnostikoak berehala errusieraz ikusi ahal izateko. Ez nuen horrelako aukerarik aurkitu interfazean.

Desegokia da kontsolaren bidez diagnostiko-mailekin lan egitea

Has gaitezen erabilitako bi komandoak (hau pvs-studio-analyzer ΠΈ plog-converter) diagnostikoak zehazteko formatu desberdinak.

Laguntza pvs-studio-analyzer irakurtzen du:

-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

Denbora luzea eman nuen nora joan asmatzen saiatzen gehitu (β€œbalioak gehitzea”) teklak. Komaz bereizita zerrendatzen saiatu naiz:

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

Hainbat aldiz saiatu nintzen gakoa erregistratzen:

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

Eta orduan bakarrik konturatu nintzen hauek maskara txikiak zirela! Eta behar duzu LaburbilduzEta ez gehitu esanahiak. Esate baterako, diagnostiko orokorrak, mikro-optimizazioetarako diagnostikoak eta MISRA lortzeko, hauek laburbildu behar dituzu (4 + 8 + 32 = 44):

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

Erabiltzaile-interfazeetan bitmaskak erabiltzea, oro har, gaizki dago. Hori guztia barnean laburbildu liteke, eta bandera multzo bat ezarri ahalko zaio erabiltzaileari.

Horrez gain, erabilgarritasun bat ere badago plog-converter, gizakiek irakur daitekeen analisi estatikoko informazioa sortzen duena. Beste arazo batzuk ditu.

Programarako laguntza plog-converter txostenak:

-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

Hemen lehen ez zeuden β€œmaila” batzuk agertu ziren, eta dokumentazioan ere ez nuen haiei buruzko ezer aurkitu.

Orokorrean, ez dago argi. Horregatik jarri dut guztia ahalik eta gehien.

Harrapatzen zin ergel mordoa

Aztertu ditudan hiru proiektuetatik bik unitate probako liburutegia erabiltzen dute Catch2. Eta mezuen lehoiaren zatia (!!! 90tik 138 batean eta 297tik 344 bestean!!!) forma hau dute:

PVS-Studio-ren berrikuspen independentea (Linux, C++)

Ez du multithreading kontuan hartzen

Ustez aldaezinak diren aldagaiak edo amaigabeko begiztak positibo faltsu asko daude, aldagai horiekin lana hari ezberdinetatik gertatzen den bitartean, eta horrela ez balitz, unitate-probak ez lukete funtzionatuko.

PVS-Studio-ren berrikuspen independentea (Linux, C++)

Hala ere, analizatzaile estatiko batek ere kontuan har dezake hori? Ez dakit.

Emaitzak

PVSk ez zuen benetako akatsik aurkitu nire kode irekiko proiektuetan Lehertu ΠΈ Hurrengoa, baita laneko zirriborro batean ere, ageriko arrazoiengatik aurkeztu ezin dudana. Egia da, komeni da kontuan izan gabezia batzuk lehenago atzeman eta zuzendu direla lehenago erabiliz. Cppcheck ΠΈ scan-build.

Oro har, analizatzaile hauen guztien inpresioa gutxi gorabehera berdina da: bai, zerbait harrapatzen dute, batzuetan garrantzitsua baita, baina orokorrean konpilatzailea nahikoa da.

Baliteke (eta niri pertsonalki hala pentsatzea gustatzen zait) gure taldeak software-garapeneko praktikak erabiltzea ahalbidetzen diguten kode kakarraren kopuru minimo bat sortzeko. Hobe da arazorik ez sortzea heroikoki gainditzea baino.

Hori dela eta, C++-n idazteko aholku batzuk emateko askatasuna hartzen dut, inori hanketatik tirorik ez botatzeko edo bekokian arrastelarekin ez jotzeko.

Aprobetxatu konpiladoreen diagnostikoei

Gure taldeak konpilazio aukera hauek erabiltzen ditu (eta hala aholkatzen dizu):

-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

Gaitu itzazu zure proiektuan eta ikasi asko zure kodeari buruz.

Estandarra atxiki

Saiatu plataformaren menpeko gauzak ez erabiltzen analogo estandarrak badaude, eta ezin baduzu egin horiek gabe, bildu makroetarako bloke berezietan (edo beste zerbaitetan) eta ez utzi zure kodea konpilatzen onartzen ez diren baldintzetan.

Eragiketa-semantika estandarrari eutsi

Batuketak batuketa izan behar du, biderketak biderketa, funtzio-deiak funtzio-deia izan behar du, kopiak kopia izan behar du, eraman behar du eraman, edukiontziak itergarria izan behar du, iteratzaileak promozioa izan behar du ++ eta deserreferentziazioa *. Eta abar eta abar.

Ideia argia dela uste dut. Ezarritako konbentzioak daude lotesleak ez direnak, baina zure kodearen erabiltzaile eta irakurle guztiek ikustea espero dutenak. Ez saiatu besteen asmakizunik egiten, bestela zure burua gaindituko duzu.

Idatzi kode bateragarria

Lehenik eta behin, liburutegi estandarra esan nahi dut. Oso desiragarria da zure klase eta funtzioen interfazeak liburutegi estandarrekin eta beste liburutegiekin (adibidez, Boost) erabil daitezkeela.

Anima zaitez STL eta Boost interfazeei begirada bat eman. Salbuespenak salbuespen, merezi duen eredu bat ikusiko duzu bertan.

Aprobetxatu kode irekiko tresnei

Analisi estatiko bererako, gutxienez bi doako tresna ireki daude, behin bakarrik konekta daitezkeen edozein proiekturekin CMake eraikitze sistemarekin.

Honi buruz gehiago irakur dezakezu nire azken argitalpenean.

afterword

Azkenik, azpimarratu nahi dut ez dudala defendatzen PVS edo beste analizatzaile estatikorik ez erabiltzea. Baina pentsatzera animatzen zaitut nola gertatu den analizatzaile estatikoak etengabe aurkitzen dituen akats nabarmenak zure kodean.

Hau ondorio bat besterik ez da. Kausa bilatu eta ezabatu behar dugu.

Iturria: www.habr.com

Gehitu iruzkin berria