Uavhengig omtale av PVS-Studio (Linux, C++)

Jeg sÄ et innlegg om at PVS endelig har lÊrt seg Ä analysere under Linux, og bestemte meg for Ä prÞve det ut pÄ prosjektene mine. Her er hva som kom ut av det.


Innhold

  1. Fordeler
  2. Ulemper
  3. Resultater
  4. Etterord

Fordeler

Reaktiv stĂžtte

Jeg ba om en prĂžveversjon, og samme dag fikk jeg den.

Ganske forstÄelig dokumentasjon

Det var ikke store problemer med Ä starte analysatoren. Det finnes ogsÄ hjelp til kommandolinjeverktÞyene (selv om det er noen klager, se seksjonen Ulemper).

Muligheten for multitrÄdet analyse

Analysatoren har et «standard» alternativ -j, som gjÞr det mulig Ä analysere parallelt pÄ flere oppgaver. Dette sparer mye tid.

God visualisering

Mange forskjellige utdataformater, fra tekst til en liten nettgrensesnitt. Nettsiden er brukervennlig, kompakt, med hjelpetips ved siden av linjene i koden og lenker til diagnostiske beskrivelser.

Enkel integrasjon i byggprosessen

All dokumentasjon finnes pÄ nettstedet deres, jeg vil bare si at hvis prosjektet ditt bygges med CMake, sÄ er alt veldig enkelt.

Gode beskrivelser av diagnostikkene

Hvis du genererer utdata i modusen fullhtml, vil hver melding ha en lenke til beskrivelsen av diagnosen, med forklaringer, kodeeksempler og flere lenker.

Ulemper

Analysatoren har ikke kunnskap om C++

Dessverre gjÞr PVS noen ganger syntaksfeil og genererer falske positive meldinger nÄr koden er helt korrekt.

For eksempel er det en funksjon som returnerer 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, nĂžkkelordet auto kan bety void, nettopp som det skal. auto. Men PVS ga meg disse meldingene:

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.

Veldig treg nettside

Ja, i nettgrensesnittet er det en lenke ved siden av hver melding som peker til den tilsvarende diagnosens beskrivelse med eksempler. Men nÄr du klikker pÄ lenken, mÄ du vente ganske lenge, og noen ganger er det 504 Gateway Time-out.

SprÄk

Alle beskrivelser er pÄ russisk, det er flott. Men lenkene i rapporten fÞrer alltid til den engelske versjonen. Det ville vÊrt bra Ä ha muligheten til Ä bytte sprÄk, slik at jeg kunne se diagnostikkene umiddelbart pÄ russisk. Jeg fant ikke en slik mulighet i grensesnittet.

Det er ukomfortabelt Ä jobbe med diagnostikk-nivÄer via konsollen

La oss begynne med at de to brukte kommandoene (dette er pvs-studio-analyzer og plog-converter) har forskjellige formater for Ă„ sette diagnostikk.

Hjelpen til pvs-studio-analyzer sier:

-a [MODE], --analysis-mode [MODE]
    MODE definerer typen varsler:
    1 - 64-bit feil;
    2 - reservert;
    4 - Generell Analyse;
    8 - Mikrooptimaliseringer;
    16 - Kundespesifikke forespÞrsmÄl;
    32 - MISRA.
    Moduser kan kombineres ved Ă„ legge sammen verdiene
    Standard: 4

Jeg prÞvde lenge Ä forstÄ hvor jeg skulle legge til («adding the values») nÞkler. Jeg prÞvde Ä oppgi dem med komma:

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

Jeg prĂžvde Ă„ skrive nĂžkkelen flere ganger:

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

Og fÞrst etterpÄ innsÄ jeg at dette er bitmasker! Og jeg mÄ summere, og ikke legge til verdiene. For eksempel, for Ä fÄ generell diagnostikk, diagnostikk for mikrooptimaliseringer og MISRA, mÄ jeg summere dem (4 + 8 + 32 = 44):

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

Bruken av bitmasker i brukergrensesnitt er som regel dÄrlig stil. Alt dette kunne vÊrt summert internt, mens brukeren fÄr et sett med flagg.

I tillegg finnes det et verktĂžy plog-converter, som genererer menneske-leselig informasjon om statisk analyse. Den har andre problemer.

Hjelpen til programmet plog-converter opplyser:

-a, --analyzer             Angir analyzer(e) og nivÄ(er) som skal
                           brukes for filtrering, dvs.
                           'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                           Standard: GA:1,2

Her dukker det opp noen «nivÄer» som ikke har vÊrt nevnt noe sted tidligere, og jeg fant heller ikke noe om dem i dokumentasjonen.

Generelt sett er det uklart. Derfor satte jeg alt til maks.

Masse meningslÞs klaging pÄ Catch

I to av tre prosjekter jeg analyserte, brukes bibliotekt for modulĂŠr testing Catch2. Og en stor del av meldingene (!!! 90 av 138 i ett og 297 av 344 i et annet !!!) har fĂžlgende form:

Uavhengig omtale av PVS-Studio (Linux, C++)

Tar ikke hensyn til multitrÄding

Mange falske positive varsler om angivelig uforanderlige variabler eller uendelige slÞyfer, mens det jobbes med disse variablene fra forskjellige trÄder, og hvis det ikke hadde vÊrt tilfelle, ville ikke enhetstestene ha utlÞst.

Uavhengig omtale av PVS-Studio (Linux, C++)

Men kan en statisk analyserer i det hele tatt ta hensyn til dette? Vet ikke.

Resultater

PVS fant ingen virkelige feil i mine Äpne prosjekter Burst og Proxima, samt i et arbeidsprosjekt som jeg, av Äpenbare grunner, ikke kan vise frem. Det er imidlertid verdt Ä merke seg at noen mangler allerede har blitt oppdaget og rettet tidligere med hjelp av Cppcheck og scan-build.

Generelt er inntrykket av alle disse analysatorene omtrent det samme: ja, de oppdager noe, noen ganger til og med noe viktig, men generelt er kompilatoren tilstrekkelig.

Det er mulig (og jeg liker Ä tenke slik) at vÄrt team bruker utviklingsmetoder som gjÞr det mulig Ä generere et minimum av dÄrlig kode. Det er bedre Ä unngÄ problemer enn Ä mÄtte overvinne dem pÄ heroisk vis.

Derfor tar jeg mot til meg Ä gi noen rÄd om hvordan man kan skrive i C++ slik at man ikke skyter seg selv i foten og unngÄr Ä bli truffet av rake.

Bruk kompilatorens diagnostikk maksimalt

VÄrt team bruker (og anbefaler dere) fÞlgende kompilasjonsvalg:

-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

Inkluder dem i prosjektet ditt, sÄ vil du lÊre mye nytt om koden din.

Hold deg til standarden

ForsÞk Ä unngÄ plattformavhengige elementer hvis det finnes standardanalyser, og hvis du absolutt mÄ bruke dem, pakk dem inn i spesielle blokker med makroer (eller pÄ en annen mÄte) og sÞrg for at koden din ikke kan kompileres under uforenlige forhold.

Hold deg til standard semantikk for operasjoner

Addisjon bÞr vÊre addisjon, multiplikasjon bÞr vÊre multiplikasjon, funksjonskall skal vÊre funksjonskall, kopiering bÞr kopiere, flytting skal flytte, beholdere mÄ vÊre itererbare, og iteratorer mÄ kunne oppgradere ++ og dereferere *. Og sÄ videre, og sÄ videre.

Jeg tror tanken er forstÄtt. Det finnes etablerte konvensjoner som ikke er obligatoriske, men som alle brukere og lesere av koden din forventer Ä se. PrÞv ikke Ä overkloke andre, da kan du ende opp med Ä overkloke deg selv.

Skriv kompatibel kode

FÞrst og fremst tenker jeg pÄ standardbiblioteket. Det er meget Þnskelig at grensesnittene til klassene og funksjonene dine kan brukes med standard- og andre biblioteker (for eksempel Boost).

Ikke nÞl med Ä se pÄ grensesnittene i STL og Boost. Med sjeldne unntak finner du der verdige eksempler Ä etterligne.

Bruk Äpne verktÞy maksimalt

For the same static analysis, there are at least two open-source free tools that can connect to any project with a CMake build system.

You can read more about this in my recent publication..

Etterord

Finally, I want to emphasize that I am not advocating against using PVS or any other static analyzers. However, I encourage you to think about how it happened that the static analyzer continually finds significant errors in your code.

This is just a consequence. You need to look for and eliminate the cause.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster