PVS-Studio sõltumatu ülevaade (Linux, C++)

Nägin väljaannet, mida PVS oli õppinud Linuxi all analüüsima, ja otsustasin seda oma projektides proovida. Ja see on see, mis sellest välja tuli.


Sisu

  1. Plusse
  2. Miinused
  3. Tulemused
  4. järelsõna

Plusse

Vastutulelik tugi

Küsisin proovivõtit ja nad saatsid selle mulle samal päeval.

Üsna selge dokumentatsioon

Analüsaatori käivitamine õnnestus probleemideta. Saadaval on ka konsoolikäskude abi (kuigi siin on kaebusi, vt jaotist Miinused).

Mitme keermega analüüsi võimalus

Analüsaatoril on "standardne" valik -j, mis võimaldab analüüsida paralleelselt mitmes ülesandes. See säästab palju aega.

Hea visualiseerimine

Palju erinevaid väljundformaate alates tekstist kuni väikese veebikortsuni. Veebiliides on mugav, sisutihe, koodi ridade kõrval on vihjed ja lingid diagnostikakirjeldustele.

Lihtne montaaži integreerimine

Kogu dokumentatsioon on nende veebisaidil, võin ainult öelda, et kui teie projekt on üles ehitatud CMake'i abil, on kõik väga lihtne.

Head diagnostilised kirjeldused

Kui genereerite väljundit režiimis fullhtml, siis on igal sõnumil link diagnostilise kirjelduse juurde koos selgituste, koodinäidete ja lisalinkidega.

Miinused

C++ keele teadmatus analüsaatori poolt

Kahjuks teeb PVS mõnikord süntaksivigu ja genereerib valepositiivseid sõnumeid, kui kood on täiesti õige.

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 on võtmesõna auto Võib tähendada void, selleks see ongi auto. Kuid PVS koostas järgmised 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 iga sõnumi juures on link vastavale diagnostikakirjeldusele koos näidetega. Aga lingile vajutades tuleb päris kaua oodata ja vahel juhtub 504 Gateway Time-out.

Keel

Kõik kirjeldused on vene keeles, mis on suurepärane. Kuid aruande lingid viivad alati ingliskeelse versioonini. Oleks tore, kui saaks keelt vahetada, et saaks kohe vene keeles diagnostikat vaadata. Liidesest ma sellist valikut ei leidnud.

Konsooli kaudu diagnostikatasemetega töötamine on ebamugav

Alustame sellest, et kaks käsku kasutasid (see pvs-studio-analyzer и plog-converter) erinevad vormingud diagnostika määramiseks.

Abi selleks pvs-studio-analyzer loeb:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

Üritasin tükk aega aru saada, kuhu minna lisa (“väärtuste lisamine”). Proovisin neid komadega eraldatuna loetleda:

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

Üritasin võtit mitu korda registreerida:

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

Ja alles siis sain aru, et need on natuke maskid! Ja sa vajad kokku võtmaJa mitte lisa tähendusi. Näiteks ülddiagnostika, mikrooptimeerimise diagnostika ja MISRA saamiseks peate need kokku võtma (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

Bitmaskide kasutamine kasutajaliidestes on üldiselt halb vorm. Seda kõike võiks sisemiselt kokku võtta ja kasutajale määrata lippe.

Lisaks on olemas ka utiliit plog-converter, mis genereerib inimesele loetavat staatilise analüüsi teavet. Tal on muid probleeme.

Abi programmi jaoks plog-converter aruanded:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

Siia ilmusid mõned “tasemed”, mida varem polnud, ja ka nende kohta ei leidnud ma dokumentatsioonist midagi.

Üldiselt pole see selge. Seetõttu panin kõik maksimumi.

Hunnik Catchi lolli sõimu

Kolmest analüüsitud projektist kaks kasutavad ühikutestimise teeki Catch2. Ja lõviosa sõnumitest (!!! 90 138-st ühes ja 297 344-st teises!!!) on järgmisel kujul:

PVS-Studio sõltumatu ülevaade (Linux, C++)

Ei arvesta mitmelõimega

Väidetavalt muutumatute muutujate või lõputute tsüklite kohta on palju valepositiivseid tulemusi, samas kui töö nende muutujatega toimub erinevatest lõimedest ja kui see nii poleks, siis ühiktestid ei töötaks.

PVS-Studio sõltumatu ülevaade (Linux, C++)

Samas, kas staatiline analüsaator võib sellega üldse arvestada? Ei tea.

Tulemused

PVS ei leidnud minu avatud lähtekoodiga projektides tõelisi vigu Burst и Järgmine, samuti töökavandis, mida ma arusaadavatel põhjustel esitada ei saa. Tõsi, tasub meeles pidada, et mõned puudused on juba varasemal kasutamisel tabatud ja parandatud Cppcheck и scan-build.

Üldiselt on kõigi nende analüsaatorite mulje umbes sama: jah, nad tabavad midagi, mõnikord isegi midagi olulist, kuid üldiselt piisab kompilaatorist.

Võimalik (ja mulle isiklikult meeldib nii arvata), et meie meeskond kasutab tarkvaraarenduspraktikaid, mis võimaldavad meil genereerida minimaalselt jaburat koodi. Parem on mitte probleeme tekitada, kui neist kangelaslikult üle saada.

Seetõttu võtan endale vabaduse anda nõu, kuidas kirjutada C++ keeles nii, et mitte kellelgi jalgu maha lasta ega rehaga vastu lauba lüüa.

Kasutage kompilaatori diagnostikat maksimaalselt

Meie meeskond kasutab (ja soovitab teil seda teha) järgmisi koostamisvõ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

Lubage need oma projektis ja õppige palju oma koodi kohta.

Pidage kinni standardist

Proovige standardsete analoogide olemasolul mitte kasutada platvormist sõltuvaid asju ja kui te ei saa ilma nendeta absoluutselt hakkama, mähkige need makrode (või millegi muu) jaoks spetsiaalsetesse plokkidesse ja lihtsalt ärge laske oma koodil toetamata tingimustel kompileerida.

Pidage kinni standardse operatsiooni semantikast

Liitmine peab olema liitmine, korrutamine peab olema korrutamine, funktsiooni kutsumine funktsiooni kutsumine, kopeerimine peab olema kopeerimine, kandmine peab kandma, konteiner peab olema itereeritav, iteraatoril peab olema reklaam ++ ja viitamise tühistamine *. Ja nii edasi.

Arvan, et mõte on selge. On kehtestatud kokkulepped, mis ei ole siduvad, kuid mida kõik teie koodi kasutajad ja lugejad näevad. Ära ürita teisi üle kavaldada, muidu kavaldad ennast üle.

Kirjutage ühilduv kood

Esiteks pean silmas tavapärast raamatukogu. On väga soovitav, et teie klasside ja funktsioonide liideseid saaks kasutada standardsete ja muude teekide puhul (näiteks Boost).

Vaadake julgelt STL-i ja Boosti liideseid. Harvade eranditega näete seal väärilist eeskuju.

Kasutage avatud lähtekoodiga tööriistu maksimaalselt ära

Sama staatilise analüüsi jaoks on vähemalt kaks avatud tasuta tööriista, mida saab CMake'i ehitussüsteemiga ainult üks kord ühendada mis tahes projektiga.

Lisateavet selle kohta saate lugeda minu hiljutisest väljaandest.

järelsõna

Lõpetuseks tahaksin rõhutada, et ma ei soovita mitte kasutada PVS-i ega muid staatilisi analüsaatoreid. Kuid soovitan teil mõelda, kuidas juhtus, et staatiline analüsaator leiab teie koodis pidevalt olulisi vigu.

See on lihtsalt tagajärg. Peame põhjuse otsima ja kõrvaldama.

Allikas: www.habr.com

Lisa kommentaar