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
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. .
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 .
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: 4Dolgo 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,16Poskušal sem zapisati ključ večkrat:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16In š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 44Uporaba 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,2Tukaj 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 . In velika večina sporočil (!!! 90 od 138 v enem in 297 od 344 v drugem !!!) ima naslednjo obliko:

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.

Vendar pa lahko statični analitik to sploh upošteva? Ne vem.
PVS ni našel nobene prave napake v mojih odprtih projektih in , 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. in .
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-promoVključ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.
.
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
