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

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

  1. Plussid
  2. Miinused
  3. Summary
  4. Eessõna

Plussid

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

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. Veebiliides on mugav, lakooniline, koodireaktsioonide kõrval on vihjed ja lingid diagnostika kirjeldustele..

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.

Miinused

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

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

Pikalt püüdsin aru saada, kuhu tuleks lisada ("adding the values") võtmed. Proovisin neid komaga loetleda:

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

Proovisin määrata võtme mitu korda:

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

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

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

Siin 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 Catch2. Ja suur osa teadetest (!!! 90 138-st ühes ja 297 344-st teises !!!) on sellise välimusega:

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

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.

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

Kuid kas saab sellist olukorda arvesse võtta staatiline analüsaator? Ei tea.

Summary

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

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

Kä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.

Selle kohta saab lähemalt lugeda minu hiljutises postituses.

Eessõna

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

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster