Täpsemalt nägin postitust, et PVS on nüüd suuteline analüüsima Linuxi keskkondades ja otsustasin proovida oma projektide peal. Ja siin on tulemused.
Sisukord
Reageeriv tugi
Küsin proovi võtme, ja samal päeval saadeti see mulle.
Arusaadav dokumentatsioon
Analüsaatori käivitamine ei põhjustanud erilisi probleeme. Konsooli käskude kohta on samuti abi saadaval (kuigi siin on etteheiteid, vt lõiku ).
Mitme lõime analüüsi võimalus
Analüsaatoril on "standardne" valik -j, mis võimaldab analüüsi teostada paralleelselt mitmes ülesandes. See säästab oluliselt aega.
Hea visualiseerimine
Palju erinevaid väljundiformaate, alates tekstilistest kuni väikse veebiliidese. .
Lihtne integreerimine kogumisse
Kogu dokumentatsioon on nende veebisaidil, mainin ainult, et kui teie projekt koguneb CMake abil, siis on kõik väga lihtne.
Head diagnostikakirjeldused
Kui genereerida väljund režiimis fullhtml, siis iga teate juures on link diagnostika kirjeldamisele, koos selgitustega, koodinäidete ja täiendavate linkidega.
Analüsaatori teadmatus C++ keelest
Kahjuks teeb PVS mõnikord süntaksivigu ja genereerib valepositiivseid teadandeid täiesti korrektse koodi puhul.
Näiteks on funktsioon, mis tagastab 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));
}Jah, märksõna auto võib tähendada void, sellepärast on see auto. Kuid PVS andis sellised teadete:
dynamic_tuple_management.hpp:29:1: error: V591 Mitte-tühine funktsioon peaks tagastama väärtuse.
dynamic_tuple_management.hpp:29:1: error: V2542 Funktsiooniga, millel on mitte-tühine tagastus tüüp, peaks tagastama väärtuse kõigist väljapääsuteedest.Väga aeglane sait
Jah, veebiliideses on iga teate kõrval link vastava diagnostika kirjeldamisele koos näidetega. Kuid lingile klikkides tuleb oodata piisavalt kaua, mõnikord isegi .
Keele
Kõik kirjeldused on vene keeles, mis on suurepärane. Kuid raportist viidatud lingid viivad alati ingliskeelsele versioonile. Oleks tore, kui oleks võimalus keelt vahetada, et diagnostikasid saaks vaadata kohe vene keeles. Sellist võimalust ma kasutajaliideses ei leidnud.
Ebastav on ebamugav töötada diagnostika tasemete kaudu konsoolist
Alustame sellest, et kahel kasutataval komandil (nimelt pvs-studio-analyzer ja plog-converter) on erinevad diagnostika määramise formaadid.
Abi pvs-studio-analyzer ütleb:
-a [MODE], --analysis-mode [MODE]
MODE määrab hoiatuste tüübi:
1 - 64-bitise vead;
2 - reserveeritud;
4 - Üldine analüüs;
8 - Mikro-optimeerimised;
16 - Klientide spetsiifilised nõuded;
32 - MISRA.
Mudeleid võib kombineerida, lisades väärtusi
Vaikimisi: 4Pikalt püüdsin aru saada, kuhu tuleks lisada ("adding the values") võtmed. Proovisin neid komaga loetleda:
pvs-studio-analyzer analyze ... -a 1,4,16Proovisin määrata võtme mitu korda:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Ja siis taipasin, et need on bitmaskid! Ja tuleks liita, mitte lisada väärtused. Näiteks, et saada ülddiagnostika, mikro-optimeerimiste diagnostika ja MISRA, tuleks need liita (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Bitmaskide kasutamine kasutajaliideses on tavaliselt halb vorm. Kõik need võinuks kokku liita ka sees, ja kasutajale esitada lipuväli.
Lisaks on veel utiliit plog-converter, mis genereerib inimloetavat teavet staatilisest analüüsist. Sel on teised probleemid.
Programmi abi plog-converter ütleb:
-a, --analyzer Määrab analüsaatori(d) ja taseme(d),
mida kasutada filtreerimiseks, st.
'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
Vaikimisi: GA:1,2Siin on tulnud mingid "tasemed", mida varem ei olnud, ja dokumentatsioonis ei leidnud ma midagi nende kohta.
Ühesõnaga, ei ole selge. Seetõttu seadistasin kõik maksimaalselt.
Kuhja mõttetut pahandamist Catch’il
Kahe kolmest projektist, mida analüüsisin, kasutatakse moodulitestimise raamatukogu . Ja suur osa teadetest (!!! 90 138-st ühes ja 297 344-st teises !!!) on sellise välimusega:

Ei arvesta mitme lõime kasutamist
Palju valepositiivseid tulemusi väidetavalt muutumatute muutujate või lõpmatute tsüklite kohta, kuigi nende muutujatega töötatakse erinevatest lõimedes, ja kui see poleks nii, siis moodulitestid ei toimiks.

Kuid kas saab sellist olukorda arvesse võtta staatiline analüsaator? Ei tea.
PVS ei leidnud ühtki tõelist viga minu avatud projektides ja , samuti töötavas projektis, mida ma ilmselgetel põhjustel ei saa esitada. Tuleb märkida, et mõned puudujäägid olid juba varasemalt leitud ja parandatud ja .
Kokkuvõttes on kõikide nende analüsaatorite mulje enam-vähem sama: jah, nad püüavad midagi kinni, mõnikord isegi midagi olulist, kuid üldiselt piisab kompilaatorist.
Võib-olla (ja mulle endale meeldib nii mõelda), et meie meeskond kasutab selliseid tarkvaraarenduse praktikaid, mis võimaldavad genereerida minimaalset hulka rämpskoodi. Parim on mitte probleeme tekitada, kui neid saab lihtsalt vältida, mitte kangelaslikult üle saada.
Seetõttu võtan julguse endale ja jagan mõningaid näpunäiteid, kuidas C++ keeles kirjutada nii, et mitte kellelegi jalga tulistada ega labidaga pähe saada.
Kasutage kompilaatori diagnoose maksimumini
Meie meeskond kasutab (ja soovitab teile) 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-promoKäivitage need oma projektis, saate palju uut teada oma koodist.
Järgige standardit
Püüdke mitte kasutada platvormispetsiifilisi elemente, kui on olemas standardseid analooge, ja kui ilma nendeta tõesti ei saa, siis pakendage need spetsiaalsetesse plokkidesse makrodega (või kuidagi muul viisil) ning ärge laske oma koodil kompileerida toetamata tingimustes.
Järgige operatsioonide standardsemantikat
Liitmine peaks olema liitmine, korrutamine – korrutamine, funktsiooni kutsumine – funktsiooni kutsumine, kopeerimine peab kopeerima, edasiviimine – edasiviima, konteiner peab olema iteratiivne, iterator peab edasi liikuma ++ ja de-referentseerima. *. Ja nii edasi, ja nii edasi.
Arvan, et mõte on selge. On kehtestatud kokkulepped, mida ei pea täitma, kuid mida kõik teie koodi kasutajad ja lugejad ootavad. Ära püüa petta teisi, või muidu petad iseennast.
Kirjutage ühilduvat koodi
Kuidas aga first ja siis räägin standardse raamatukogu. Väga soovitav oleks, et teie klasside ja funktsioonide liidesed saaksid kasutada standardseid ja teisi raamatukogusid (näiteks Boost).
Ärge kartke piiluda STL ja Boost liideste sisse. Harva esinevatel eranditel näete seal väärt näidiseid.
Kasutage avatud tööriistu maksimumini.
Kaks tasuta avatud tööriista on olemas sama staatilise analüüsi jaoks, mis ühenduvad iga CMake ehitusüsteemiga projekti juurde "üks" korra.
.
Lõpetuseks tahan rõhutada, et ma ei soovita PVS-i ega mingeid teisi staatilisi analüsaatoreid mitte kasutada. Kuid ma kutsun üles mõtlema sellele, kuidas juhtus, et staatiline analüsaator avastab pidevalt teie koodis olulisi vigu.
See on lihtsalt tagajärg. Tuleb otsida ja kõrvaldada põhjus.
Allikas: habr.com
