Nägin postitust, et PVS on lõpuks õppinud analüüsima Linuxi keskkonnas, ja otsustasin proovida oma projektidega. Ja siin on, mis välja tuli.
Sisu
Reageeriv tugi
Küsin proovi võtme, ja sama päeva jooksul saadeti see mulle.
Piisavalt arusaadav dokumentatsioon
Analüsaatorit õnnestus käivitada ilma eriliste probleemideta. Ka konsooli käskude lisainfot on saadaval (kuigi siin on tähelepanekuid, vt jaotist ).
Mitu lõime toetava analüüsi võimalus
Analüsaatoril on „standaardne” valik -j, mis võimaldab analüüsi teostada samal ajal mitmes ülesandes. See säästab palju aega.
Hea visualiseerimine
Palju erinevaid väljundformaate, alates tekstilisest kuni väikese veebiliidese. .
Lihtne integreerimine kogumis
Kogu dokumentatsioon on nende veebilehel, ütlen ainult, et kui teie projekt kogutakse CMake'i abil, siis on kõik väga lihtne.
Head diagnostikakirjeldused
Kui genereerida väljund režiimis fullhtml, siis iga teate jaoks on olemas link diagnostika kirjeldusele, koos selgituste, koodinäidete ja lisalinkidega.
C++ analüsaatori teadmatus
Kahjuks teeb PVS mõnikord süntaksivigu ja genereerib valepositiivseid sõnumeid täiesti korrektsest koodist.
Näiteks on olemas funktsioon, mis tagastab void:
template
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));
}Jah, märksõna auto võib tähendada void, just sellepärast ta on auto. Kuid PVS andis välja sellised teated:
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.Väga aeglane sait
Jah, veebiliideses on iga teate kõrval link vastavale diagnostika kirjeldusele koos näidetega. Kuid lingile klikates tuleb piisavalt kaua oodata ja mõnikord võib juhtuda ka .
Keel
Kõik kirjeldused on vene keeles, see on suurepärane. Kuid raportist viivad lingid alati ingliskeelsele versioonile. Oleks tore, kui saaks keelt vahetada, et diagonaale kohe vene keeles vaadata. Sellist võimalust liideses ei leidnud.
Diagnostika tasemete haldamine konsoolis on ebamugav.
Alustame sellest, et kahte kasutatud käsku (need on pvs-studio-analyzer ja plog-converter) esitavad erinevates formaatides diagnostikad.
Abiks pvs-studio-analyzer öeldakse:
-a [MODE], --analysis-mode [MODE]
MODE määrab hoiatuste tüübi:
1 - 64-bitised vead;
2 - reserveeritud;
4 - Üldine analüüs;
8 - Mikrooptimeerimised;
16 - Klientide spetsiifilised taotlused;
32 - MISRA.
Mudeleid saab kombineerida väärtuste liitmisega.
Vaikimisi: 4Pikalt üritasin mõista, kuhu tuleb lisada ("adding the values") võtmed. Üritasin loetleda komadega:
pvs-studio-analyzer analyze ... -a 1,4,16Üritasin võtta võtme mitu korda:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Ja alles siis mõistsin, et need on bitmaskid! Ja neid tuleb kokku liita, mitte lisada väärtused. Näiteks, et saada üldised diagnostikad, mikrooptimeerimiste diagnostikad ja MISRA, tuleb need kokku liita (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Bitimaskide kasutamine kasutajaliidetes on tavaliselt halb stiil. Kõik see oleks saanud kokku võtta ka sees, kasutajale jääks vaid flagide komplekt.
Lisaks on veel utiliit plog-converter, mis genereerib inimloetavat teavet staatilise analüüsi kohta. Sel on teised nüansid.
Programmi juhend plog-converter ütleb:
-a, --analyzer Määrab analüsaator(id) ja taseme(id), mida
kasutatakse filtreerimiseks, st.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Vaikimisi: GA:1,2Siia ilmusid mingid «tasemed», mida varem ei olnud, ja ma ei leidnud ka dokumentatsioonist nende kohta midagi.
Üks sõna otseses mõttes ei ole selge. Seetõttu seadsin kõik maksimumini.
Kohutav sõim Catchis
Kahel kolmest projektist, mida analüüsisin, kasutatakse testimise moodulite raamatukogu . Enamik teadetest (!!! 90 138-st ühes ja 297 344-st teises !!!) on järgmise sisuga:

Ei arvesta mitme lõimelisust
Palju valepositiivseid tulemusi puudutavate väidete kohta muutumatute muutujate või lõpmatute tsüklite osas, samas kui nende muutujaid kasutatakse erinevates lõimedes; kui see nii ei oleks, ei oleks moodulitestid ju toimunud.

Kuid kas staatiline analüsaator suudab sellist asja üldse arvesse võtta? Ei tea.
PVS ei leidnud minu avatud projektides ühtegi tõelist viga. ja , samuti töös olevas projektis, mida ma arusaadavatel põhjustel näidata ei saa. Tõsi, tuleb märkida, et mõned puudused on juba varem kinni püütud ja parandatud kasutades ja .
Üldiselt on mul kõigi nende analüsaatorite osas peaaegu sama mulje: jah, nad püüavad midagi kinni, mõnikord isegi midagi olulist, kuid kokkuvõttes piisab compiler’ist.
Võib-olla (ja mulle endale meeldib nii arvata), et meie meeskond kasutab selliseid tarkvaraarenduse praktikaid, mis genereerivad minimaalset hulka halba koodi. Paremini on mitte tekitada probleeme, kui seejärel kangelaslikult neid ületada.
Seetõttu luban endale anda mõned näpunäited, kuidas kirjutada C++ keeles nii, et ei lasta kellelgi jalgu maha ja ei saa ruttu vastu pead.
Kasutage kompilaatori diagnostikat maksimaalselt ära
Meie meeskond kasutab (ja soovitab teil kasutada) järgmisi kompileerimisvõimalusi:
-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-promoLisage need oma projekti, et õppida palju uut oma koodi kohta.
Järgige standardit
Püüdke mitte kasutada platvormispetsiifilisi elemente, kui on olemas standardi analoogid, ja kui neid ei saa vältida, siis mähkige need eriliseks plokkideks (makrode alla või kuidagi muul viisil) ning ärge laske oma koodil mitte toetatud tingimustes kompileerida.
Järgige operatsioonide standardse semantikat
Kogumine peab olema kogumine, korrutamine — korrutamine, funktsiooni kutsumine — funktsiooni kutsumine, kopeerimine peab kopeerima, teisaldamine — teisaldama, konteiner peab olema iteratiivne, iteraator peab omama edasiviimist ++ ja lahtiühendamine *. Ja nii edasi, ja nii edasi.
Mõte on arusaadav. On olemas välja kujunenud kokkulepped, mida ei pruugi järgida, kuid mida kõik teie koodi kasutajad ja lugejad oodata võivad. Ärge püüdkge teisi petta, vastasel juhul petate hoopis iseennast.
Kirjutage ühilduvat koodi
Esiteks mõtlen ma standardteekidele. On väga soovitatav, et teie klasside ja funktsioonide liidesed saaksid töötada standardsete ja teiste raamistikega (näiteks Boostiga).
Ärge kartke piiluda STL ja Boosti liideseid. Harvadel juhtudel leiate sealt väärt näite jäljendamiseks.
Kasutage avatud tööriistu maksimaalselt
Sama staatilise analüüsi jaoks on olemas vähemalt kaks avatud tasuta tööriista, mis ühendavad teie projektiga CMake’i ehitussüsteemi ühe hetkega.
.
Lõpetuseks tahan rõhutada, et ma ei kutsu üles mitte kasutama PVS-i või muid staatilisi analüsaatoreid. Kuid kutsun üles mõtlema sellele, kuidas on võimalik, et staatiline analüsaator leiab teie koodis pidevalt olulisi vigu.
See on vaid tagajärg. Tuleb otsida ja kõrvaldada põhjus.
Allikas: habr.com
