Iseseisev PVS-Studio ülevaade (Linux, C++)

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

  1. Plussid
  2. Miinused
  3. Kokkuvõte
  4. Järelsõna

Plussid

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 Miinused).

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. Veebiliides on mugav, kompaktne, koos koodiridade kõrval olevate vihjetega ja diagnostikakirjelduste linkidega..

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.

Miinused

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 504 Gateway Time-out.

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: 4

Pikalt ü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 16

Ja 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 44

Bitimaskide 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,2

Siia 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 Catch2. Enamik teadetest (!!! 90 138-st ühes ja 297 344-st teises !!!) on järgmise sisuga:

Iseseisev PVS-Studio ülevaade (Linux, C++)

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.

Iseseisev PVS-Studio ülevaade (Linux, C++)

Kuid kas staatiline analüsaator suudab sellist asja üldse arvesse võtta? Ei tea.

Kokkuvõte

PVS ei leidnud minu avatud projektides ühtegi tõelist viga. Burst ja Proxima, 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 Cppcheck ja scan-build.

Ü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-promo

Lisage 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.

Sel teemal saate rohkem lugeda minu hiljutisest postitusest.

Järelsõna

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

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster