Oberoende granskning av PVS-Studio (Linux, C++)

Jag sÄg en publikation som PVS hade lÀrt sig att analysera under Linux och bestÀmde mig för att prova den pÄ mina egna projekt. Och det hÀr Àr vad som kom ut ur det.


InnehÄll

  1. Fördelar
  2. Nackdelar
  3. Resultat av
  4. efterordet

Fördelar

Responsiv support

Jag begÀrde en testnyckel och de skickade den till mig samma dag.

Ganska tydlig dokumentation

Vi lyckades starta analysatorn utan problem. HjÀlp för konsolkommandon Àr ocksÄ tillgÀnglig (Àven om det finns nÄgra klagomÄl hÀr, se avsnittet Nackdelar).

Möjlighet till flertrÄdig analys

Analysatorn har ett "standard"-alternativ -j, vilket gör att analyser kan utföras parallellt i flera uppgifter. Detta sparar mycket tid.

Bra visualisering

MÄnga olika utdataformat, frÄn text till ett litet nÀtmunkorg. WebbgrÀnssnittet Àr bekvÀmt, kortfattat, med tips bredvid rader i koden och lÀnkar till diagnostiska beskrivningar.

Enkel integration i monteringen

All dokumentation finns pÄ deras hemsida, jag kan bara sÀga att om ditt projekt Àr byggt med CMake sÄ Àr allt vÀldigt enkelt.

Bra diagnostiska beskrivningar

Om du genererar utdata i lÀge fullhtml, dÄ har varje meddelande en lÀnk till en diagnostisk beskrivning, med förklaringar, kodexempel och ytterligare lÀnkar.

Nackdelar

Analysatorns okunskap om C++-sprÄket

TyvÀrr gör PVS ibland syntaxfel och genererar falska positiva meddelanden nÀr koden Àr helt korrekt.

Det finns till exempel en funktion som returnerar 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, nyckelord auto Kan betyda void, det Àr vad det Àr till för bil. Men PVS producerade följande meddelanden:

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.

Mycket lÄngsam sida

Ja, i webbgrÀnssnittet bredvid varje meddelande finns en lÀnk till motsvarande diagnostiska beskrivning med exempel. Men nÀr man klickar pÄ en lÀnk fÄr man vÀnta ganska lÀnge, och ibland hÀnder det 504 Gateway Time-out.

sprÄk

Alla beskrivningar Àr pÄ ryska, vilket Àr bra. Men lÀnkar frÄn rapporten leder alltid till den engelska versionen. Det skulle vara trevligt att kunna byta sprÄk sÄ att du kan se diagnostik direkt pÄ ryska. Jag hittade inte ett sÄdant alternativ i grÀnssnittet.

Det Àr obekvÀmt att arbeta med diagnostiska nivÄer via konsolen

LÄt oss börja med det faktum att de tvÄ kommandona som anvÀnds (detta pvs-studio-analyzer О plog-converter) olika format för att specificera diagnostik.

HjÀlp för pvs-studio-analyzer lyder:

-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

Jag tillbringade lĂ„ng tid med att försöka komma pĂ„ vart jag skulle gĂ„ lĂ€gga till (“att lĂ€gga till vĂ€rdena”) nycklar. Jag försökte lista dem separerade med kommatecken:

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

Jag försökte registrera nyckeln flera gÄnger:

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

Och först dÄ insÄg jag att det hÀr var bitmasker! Och du behöver summeraOch inte lÀgga till betydelser. Till exempel, för att fÄ allmÀn diagnostik, diagnostik för mikrooptimeringar och MISRA, mÄste du summera dem (4 + 8 + 32 = 44):

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

Att anvÀnda bitmasker i anvÀndargrÀnssnitt Àr i allmÀnhet dÄlig form. Allt detta kan sammanfattas internt och en uppsÀttning flaggor kan stÀllas in för anvÀndaren.

Dessutom finns det ocksÄ ett verktyg plog-converter, som genererar statisk analysinformation som kan lÀsas av mÀnniskor. Hon har andra problem.

HjÀlp till programmet plog-converter rapporterar:

-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

NÄgra "nivÄer" dök upp hÀr som inte fanns dÀr tidigare, och jag hittade inget om dem i dokumentationen heller.

I allmÀnhet Àr det inte klart. DÀrför satte jag allt till max.

Ett gÀng dumma svordomar pÄ Catch

TvÄ av de tre projekt jag analyserade anvÀnder ett enhetstestningsbibliotek Catch2. Och lejonparten av meddelanden (!!! 90 av 138 i det ena och 297 av 344 i det andra!!!) har följande form:

Oberoende granskning av PVS-Studio (Linux, C++)

Tar inte hÀnsyn till multithreading

Det finns mÄnga falska positiva resultat om förmodat oförÀnderliga variabler eller Àndlösa loopar, medan arbete med dessa variabler sker frÄn olika trÄdar, och om det inte vore sÄ skulle enhetstester inte fungera.

Oberoende granskning av PVS-Studio (Linux, C++)

Men kan en statisk analysator ens ta hÀnsyn till detta? Vet inte.

Resultat av

PVS hittade inga riktiga buggar i mina projekt med öppen kÀllkod Brista О NÀsta, samt i ett arbetsutkast, som jag av naturliga skÀl inte kan lÀgga fram. Det Àr sant att det Àr vÀrt att komma ihÄg att vissa brister redan har fÄngats och korrigerats tidigare Cppcheck О scan-build.

I allmÀnhet Àr intrycket frÄn alla dessa analysatorer ungefÀr detsamma: ja, de fÄngar nÄgot, ibland till och med nÄgot viktigt, men totalt sett rÀcker kompilatorn.

Det Àr möjligt (och jag personligen gillar att tro det) att vÄrt team anvÀnder metoder för mjukvaruutveckling som tillÄter oss att generera en minimal mÀngd taskig kod. Det Àr bÀttre att inte skapa problem Àn att heroiskt övervinna dem.

DÀrför tar jag mig friheten att ge nÄgra rÄd om hur man skriver i C++ pÄ ett sÄdant sÀtt att man inte skjuter nÄgons ben eller slÄr nÄgon i pannan med en kratta.

FĂ„ ut det mesta av kompilatordiagnostik

VÄrt team anvÀnder (och rÄder dig att) följande sammanstÀllningsalternativ:

-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

Aktivera dem i ditt projekt och lÀr dig mycket om din kod.

HÄll dig till standarden

Försök att inte anvÀnda plattformsberoende saker om det finns standardanaloger, och om du absolut inte klarar dig utan dem, linda in dem i speciella block för makron (eller nÄgot annat) och lÄt helt enkelt inte din kod kompileras under förhÄllanden som inte stöds.

HÄll dig till standardoperationssemantik

Addition mÄste vara addition, multiplikation mÄste vara multiplikation, funktionsanrop mÄste vara funktionsanrop, kopia mÄste vara copy, carry mÄste vara carry, container mÄste vara iterabel, iterator mÄste ha marknadsföring ++ och dÀrifrÄn *. Och sÄ vidare.

Jag tror att tanken Àr klar. Det finns etablerade konventioner som inte Àr bindande, men som alla anvÀndare och lÀsare av din kod förvÀntar sig att se. Försök inte överlista andra, annars kommer du att överlista dig sjÀlv.

Skriv kompatibel kod

Först och frÀmst menar jag standardbiblioteket. Det Àr mycket önskvÀrt att grÀnssnitten för dina klasser och funktioner kan anvÀndas med standardbibliotek och andra bibliotek (till exempel Boost).

Ta gÀrna en titt pÄ STL- och Boost-grÀnssnitten. Med sÀllsynta undantag kommer du att se en vÀrdig förebild dÀr.

FÄ ut det mesta av verktyg med öppen kÀllkod

För samma statiska analys finns det minst tvÄ öppna gratisverktyg som bara kan kopplas en gÄng till vilket projekt som helst med CMake-byggsystemet.

Du kan lÀsa mer om detta i min senaste publikation.

efterordet

Slutligen vill jag betona att jag inte föresprÄkar att inte anvÀnda PVS eller nÄgon annan statisk analysator. Men jag uppmuntrar dig att tÀnka pÄ hur det gick till att den statiska analysatorn hela tiden hittar betydande fel i din kod.

Detta Àr bara en konsekvens. Vi mÄste leta efter och eliminera orsaken.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster