Onafhanklike hersiening van PVS-Studio (Linux, C++)

Ek het 'n publikasie gesien wat PVS onder Linux geleer het om te ontleed, en besluit om dit op my eie projekte te probeer. En dit is wat daaruit gekom het.


inhoud

  1. Pros
  2. Nadele
  3. Resultate van
  4. nawoord

Pros

Responsiewe ondersteuning

Ek het 'n proefsleutel aangevra en hulle het dit dieselfde dag vir my gestuur.

Redelik duidelike dokumentasie

Ons het daarin geslaag om die ontleder sonder enige probleme te begin. Hulp vir konsole-opdragte is ook beskikbaar (alhoewel daar 'n paar klagtes hier is, sien afdeling Nadele).

Moontlikheid van multi-threaded analise

Die ontleder het 'n "standaard" opsie -j, wat toelaat dat ontleding parallel in verskeie take uitgevoer kan word. Dit spaar baie tyd.

Goeie visualisering

Baie verskillende uitvoerformate, van teks tot 'n klein websnuit. Die webkoppelvlak is gerieflik, bondig, met wenke langs lyne in die kode en skakels na diagnostiese beskrywings.

Maklike integrasie in die samestelling

Al die dokumentasie is op hul webwerf, ek kan net sê dat as jou projek met CMake gebou is, dan is alles baie eenvoudig.

Goeie diagnostiese beskrywings

As jy uitset in modus genereer fullhtml, dan het elke boodskap 'n skakel na 'n diagnostiese beskrywing, met verduidelikings, kodevoorbeelde en bykomende skakels.

Nadele

Onkunde van die C++-taal deur die ontleder

Ongelukkig maak PVS soms sintaksfoute en genereer vals positiewe boodskappe wanneer die kode heeltemal korrek is.

Daar is byvoorbeeld 'n funksie wat terugkeer 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));
}

Ja is die sleutelwoord auto Kan beteken void, dit is waarvoor dit is motor. Maar PVS het die volgende boodskappe geproduseer:

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.

Baie stadige webwerf

Ja, in die webkoppelvlak langs elke boodskap is daar 'n skakel na die ooreenstemmende diagnostiese beskrywing met voorbeelde. Maar wanneer jy op 'n skakel klik, moet jy nogal lank wag, en soms gebeur dit 504 Gateway Time-out.

Taal

Alle beskrywings is in Russies, wat wonderlik is. Maar skakels uit die berig lei altyd na die Engelse weergawe. Dit sal lekker wees om die taal te kan verander sodat jy diagnostiek dadelik in Russies kan sien. Ek het nie so 'n opsie in die koppelvlak gevind nie.

Dit is ongerieflik om met diagnostiese vlakke via die konsole te werk

Kom ons begin met die feit dat die twee opdragte wat gebruik is (hierdie pvs-studio-analyzer и plog-converter) verskillende formate om diagnostiek te spesifiseer.

Hulp vir pvs-studio-analyzer lees:

-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

Ek het lank probeer uitvind waarheen om te gaan byvoeg (“byvoeging van die waardes”) sleutels. Ek het probeer om hulle geskei deur kommas te lys:

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

Ek het verskeie kere probeer om die sleutel te registreer:

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

En toe eers besef ek dat dit bietjie maskers is! En jy het nodig som open nie byvoeg betekenisse. Byvoorbeeld, om algemene diagnostiek, diagnostiek vir mikro-optimalisasies en MISRA te kry, moet jy dit opsom (4 + 8 + 32 = 44):

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

Die gebruik van bitmaskers in gebruikerskoppelvlakke is oor die algemeen slegte vorm. Dit alles kan intern opgesom word, en 'n stel vlae kan vir die gebruiker gestel word.

Daarbenewens is daar ook 'n nut plog-converter, wat mens-leesbare statiese analise-inligting genereer. Sy het ander probleme.

Hulp vir die program plog-converter berigte:

-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

Sommige "vlakke" het hier verskyn wat nie voorheen daar was nie, en ek het ook niks daaroor in die dokumentasie gevind nie.

Oor die algemeen is dit nie duidelik nie. Daarom stel ek alles op die maksimum.

'n Klomp dom vloek oor Catch

Twee van die drie projekte wat ek ontleed het, gebruik 'n eenheidstoetsbiblioteek Catch2. En die leeueaandeel van boodskappe (!!! 90 uit 138 in die een en 297 uit 344 in die ander!!!) het die volgende vorm:

Onafhanklike hersiening van PVS-Studio (Linux, C++)

Neem nie multithreading in ag nie

Daar is baie vals positiewes oor veronderstelde onveranderlike veranderlikes of eindelose lusse, terwyl werk met hierdie veranderlikes van verskillende drade plaasvind, en as dit nie so was nie, sou eenheidstoetse nie werk nie.

Onafhanklike hersiening van PVS-Studio (Linux, C++)

Kan 'n statiese ontleder dit egter selfs in ag neem? Weet nie.

Resultate van

PVS het geen werklike foute in my oopbronprojekte gevind nie Gebarste и Volgende, asook in 'n werkende konsep, wat ek om ooglopende redes nie kan aanbied nie. Dit is weliswaar die moeite werd om in gedagte te hou dat sommige tekortkominge reeds vroeër opgespoor en reggestel is met behulp van Cppcheck и scan-build.

Oor die algemeen is die indruk van al hierdie ontleders ongeveer dieselfde: ja, hulle vang iets, soms selfs iets belangriks, maar oor die algemeen is die samesteller genoeg.

Dit is moontlik (en ek persoonlik hou daarvan om so te dink) dat ons span sagteware-ontwikkelingspraktyke gebruik wat ons toelaat om 'n minimum hoeveelheid kak kode te genereer. Dit is beter om nie probleme te skep as om dit heldhaftig te oorkom nie.

Daarom neem ek die vrymoedigheid om raad te gee oor hoe om in C++ te skryf op so 'n manier om nie iemand se bene af te skiet of iemand met 'n hark in die voorkop te slaan nie.

Maak die meeste van samestellerdiagnostiek

Ons span gebruik (en raai jou aan om) die volgende samestellingsopsies:

-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

Aktiveer hulle in jou projek en leer baie oor jou kode.

Hou by die standaard

Probeer om nie platform-afhanklike dinge te gebruik as daar standaard analoë is nie, en as jy absoluut nie daarsonder kan klaarkom nie, draai dit in spesiale blokke vir makro's (of iets anders) en laat eenvoudig nie jou kode saamstel onder onondersteunde toestande nie.

Hou by standaard bewerking semantiek

Optelling moet optel wees, vermenigvuldiging moet vermenigvuldiging wees, funksie-oproep moet funksie-oproep wees, kopie moet kopie wees, dra moet dra, houer moet herhaalbaar wees, iterator moet bevordering hê ++ en afwysing *. Ensovoorts ensovoorts.

Ek dink die idee is duidelik. Daar is gevestigde konvensies wat nie bindend is nie, maar wat alle gebruikers en lesers van jou kode verwag om te sien. Moenie probeer om ander te uitoorlê nie, anders sal jy jouself uitoorlê.

Skryf versoenbare kode

Eerstens bedoel ek die standaard biblioteek. Dit is hoogs wenslik dat die koppelvlakke van jou klasse en funksies met standaard- en ander biblioteke (byvoorbeeld Boost) gebruik kan word.

Kyk gerus na die STL- en Boost-koppelvlakke. Met seldsame uitsonderings sal jy 'n waardige rolmodel daar sien.

Maak die meeste van oopbronnutsgoed

Vir dieselfde statiese ontleding is daar ten minste twee oop gratis nutsgoed wat net een keer aan enige projek gekoppel kan word met die CMake-boustelsel.

Jy kan meer hieroor lees in my onlangse publikasie.

nawoord

Ten slotte wil ek beklemtoon dat ek nie bepleit om nie PVS of enige ander statiese ontleders te gebruik nie. Maar ek moedig jou aan om na te dink oor hoe dit gebeur het dat die statiese ontleder voortdurend beduidende foute in jou kode vind.

Dit is net 'n gevolg. Ons moet die oorsaak soek en uitskakel.

Bron: will.com

Voeg 'n opmerking