Neodvisen pregled PVS-Studio (Linux, C++)

Videla sem objavo o tem, da je PVS končno uspel analizirati pod Linuxi, in se odločil poskusiti na svojih projektih. In to je, kar je iz tega izšlo.


Vsebina

  1. Prednosti
  2. Недостатки
  3. Zaključki
  4. Zadnja misel

Prednosti

Odgovorna podpora

Zahteval sem preizkusno ključno kodo, istega dne so mi jo poslali.

Dovolj jasna dokumentacija

Zagnati analizator je bilo možno brez večjih težav. Tudi pomoč za konzolne ukaze je na voljo (čeprav so tukaj nekatere pripombe, glej razdelek Недостатки).

Možnost večnitnega analiziranja

Analizator ima 'standardno' možnost -j, ki omogoča analizo hkrati v več nalogah. To močno prihrani čas.

Dobra vizualizacija

Veliko različnih formatov izhoda, od besedilnega do majhne spletne aplikacije. Spletna aplikacija je priročna, jedrnata, s namigi ob vrstice v kodi in povezavami na opise diagnoz.

Enostavna integracija v sestavo

Vsa dokumentacija je na njihovi spletni strani, samo povem, da če se vaš projekt sestavlja s pomočjo CMake, je vse zelo preprosto.

Dobre opise diagnoz

Če generirate izhod v načinu fullhtml, ima vsaka sporočila povezavo na opis diagnoze, z razlagami, primeri kode in dodatnimi povezavami.

Недостатки

Neznanje analizatorja jezika C++

Žal PVS včasih naredi napako v sintaksi in generira lažno pozitivna sporočila pri popolnoma pravilni kodi.

Na primer, obstaja funkcija, ki vrača nič:

template 
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible::value
        >
{
    new (destination) T(*static_cast(source));
}

Da, ključna beseda auto lahko pomeni nič, zato je tako auto. Toda PVS je izdalo takšna sporočila:

dynamic_tuple_management.hpp:29:1: napaka: V591 Funkcija, ki ni void, bi morala vrniti vrednost.
dynamic_tuple_management.hpp:29:1: napaka: V2542 Funkcija z ne-void tipom vrnitve bi morala vrniti vrednost iz vseh izhodnih poti.

Zelo počasen spletni site

Da, v spletni aplikaciji ob vsakem sporočilu obstaja povezava na ustrezen opis diagnoze s primeri. A ob kliku na povezavo je čakanje precej dolgo, včasih pa celo 504 Gateway Time-out.

Jezik

Vsa opisa so na ruščini, kar je odlično. Vendar povezave iz poročila vedno vodijo na angleško različico. Bilo bi dobro imeti možnost preklapljanja jezika, da bi lahko diagnoze takoj pregledovali v ruščini. V vmesniku take možnosti nisem našel.

Neudobno delati z ravnmi diagnoz preko konzole

Začnimo s tem, da imata obe uporabljeni ekipi (to je pvs-studio-analyzer in plog-converter) različne formate za dodeljevanje diagnostičnih analiz.

Pomoč za pvs-studio-analyzer pravi:

-a [MODE], --analysis-mode [MODE]
    MODE določa vrsto opozoril:
    1 - 64-bitne napake;
    2 - rezervirano;
    4 - Splošna analiza;
    8 - Mikrooptimizacije;
    16 - Specifične zahteve strank;
    32 - MISRA.
    Mnogi načini se lahko kombinirajo z vsoto vrednosti
    Privzeto: 4

Dolgo sem se trudil razumeti, kam je treba dodati ("adding the values") ključe. Poskušal sem jih naštevati ločene s podpičjem:

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

Poskušal sem zapisati ključ večkrat:

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

In šele potem sem se zavedel, da so to bitne maske! In jih je treba seštevati, namesto dodati vrednosti. Na primer, za pridobitev splošnih diagnostičnih analiz, analiz mikrooptimizacij in MISRA, jih je treba sešteti (4 + 8 + 32 = 44):

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

Uporaba bitnih mask v uporabniških vmesnikih je običajno slab ton. Vse to se lahko sešteje tudi znotraj, uporabnik pa bi prejel niz zastavic.

Poleg tega obstaja še pripomoček plog-converter, ki generira človeško berljive informacije o statični analizi. Ima druge težave.

Pomoč za program plog-converter sporoča:

-a, --analyzer            Določa analitik(e) in stopnjo(e), ki se
                          uporabljajo za filtriranje, tj.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Privzeto: GA:1,2

Tukaj so se pojavili neki "raven", ki jih prej nikjer ni bilo, in v dokumentaciji o njih tudi nisem našel ničesar.

Na splošno, ni jasno. Zato sem vse nastavil na maksimum.

Kopica brezplodnih kritik na Catch

V dveh od treh projektov, ki sem jih analiziral, se uporablja knjižnica enotnega testiranja Catch2. In velika večina sporočil (!!! 90 od 138 v enem in 297 od 344 v drugem !!!) ima naslednjo obliko:

Neodvisen pregled PVS-Studio (Linux, C++)

Ne upošteva večnitnosti

Mnogo lažnih pozitivnih opozoril o domnevno nespremenljivih spremenljivkah ali neskončnih zankah, pri čemer se z njimi dela iz različnih niti, in če to ne bi bilo tako, bi enotni testi odpovedali.

Neodvisen pregled PVS-Studio (Linux, C++)

Vendar pa lahko statični analitik to sploh upošteva? Ne vem.

Zaključki

PVS ni našel nobene prave napake v mojih odprtih projektih Burst in Proxima, prav tako tudi v delovnem projektu, ki ga, razumljivo, ne morem prikazati. Vendar pa je treba upoštevati, da so bile nekatere napake že prej odkrivene in odpravljene. Cppcheck in scan-build.

Splošno mnenje o vseh teh analizatorjih je približno enako: ja, nekaj jim uspe zaznati, včasih celo kaj pomembnega, a na splošno je kompilator dovolj.

Morda (in osebno mi je to prijetno verjeti), da naša ekipa uporablja prakse razvoja programske opreme, ki omogočajo generiranje čim manjše količine slabega kode. Bolje je preprečiti težave, kot jih herojsko premagovati.

Zato si jemljem svobodo, da dam nekaj nasvetov, kako pisati v C++ tako, da si ne streljate v noge in se ne udarjate po čelu z grabljami.

Kar najbolje izkoristite diagnostiko kompilatorja

Naša ekipa uporablja (in vam priporoča) naslednje možnosti 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

Vključite jih v svoj projekt, veliko novega o svoji kodi boste izvedeli.

Držite se standarda

Poskusite ne uporabljati platformno odvisnih stvari, če obstajajo standardni analogi, in če brez njih res ne gre, jih ovijte v posebne bloke pod makrosi (ali na drug način) in preprosto ne dovolite, da se vaša koda sestavi v nepodprtih pogojih.

Držite se standardne semantike operacij

Seštevanje mora biti seštevanje, množenje - množenje, klic funkcije - klic funkcije, kopiranje mora kopirati, prenašanje - prenašati, vsebnik mora biti iterabilen, iteratorski element mora imeti napredovanje ++ in dereferenciranje *. In tako naprej, in tako naprej.

Mislim, da je misel jasna. Obstajajo ustaljena pravila, ki niso obvezna, a jih vsi uporabniki in bralci vaše kode pričakujejo. Ne trudite se pretentati drugih, kajti tako boste pretentali sami sebe.

Pisanje združljive kode

Najprej mislim na standardno knjižnico. Zelo priporočljivo je, da bi lahko vaši razredi in funkcije delovali s standardnimi in drugimi knjižnicami (na primer Boost).

Ne oklevajte pri pokukaniu v vmesnike STL in Boost. Z redkimi izjemami tam boste našli dostojne vzore za posnemanje.

Kar najbolje izkoristite odprte pripomočke

Za statično analizo obstajajo vsaj dva odprta brezplačna orodja, ki se enkrat povežejo z vsakim projektom, ki uporablja sistem zbiranja CMake.

Več o tem lahko preberete v moji nedavni objavi..

Zadnja misel

Nazadnje bi rad poudaril, da ne odsvetujem uporabe PVS ali drugih statičnih analizatorjev. Vendar pa vas pozivam, da se zamislite, kako to, da statični analizator nenehno odkriva pomembne napake v vašem kodu.

To je le posledica. Treba je iskati in odpravljati vzrok.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster