Onofhängeg Bewäertung vum PVS-Studio (Linux, C++)

Ech hunn eng Publikatioun gesinn, déi PVS geléiert huet, ënner Linux ze analyséieren, an hunn decidéiert et op meng eegen Projeten ze probéieren. An dat ass wat doraus erauskomm ass.


Inhalt

  1. Plus
  2. Минусы
  3. Resultater
  4. Afterword

Plus

Reaktiounsfäeger Ënnerstëtzung

Ech hunn e Prozessschlëssel ugefrot a si hunn en dee selwechten Dag un mech geschéckt.

Ganz kloer Dokumentatioun

Mir hunn et fäerdeg bruecht den Analyser ouni Probleemer ze starten. Hëllef fir Konsolbefehl ass och verfügbar (obwuel et e puer Reklamatiounen hei sinn, kuckt Sektioun Минусы).

Méiglechkeet vu Multi-threaded Analyse

Den Analyser huet eng "Standard" Optioun -j, et erlaabt d'Analyse parallel a verschiddenen Aufgaben duerchzeféieren. Dëst spuert vill Zäit.

Gutt Visualiséierung

Vill verschidden Ausgangsformater, vum Text bis zu engem klenge Webmaus. D'Web-Interface ass bequem, präzis, mat Hiweiser nieft Zeilen am Code a Linken op diagnostesch Beschreiwunge.

Einfach Integratioun an der Assemblée

All d'Dokumentatioun ass op hirer Websäit, ech kann nëmme soen datt wann Äre Projet mat CMake gebaut gëtt, dann ass alles ganz einfach.

Gutt diagnostesch Beschreiwungen

Wann Dir Ausgab am Modus generéiert fullhtml, dann huet all Message e Link op eng diagnostesch Beschreiwung, mat Erklärungen, Code Beispiller an zousätzlech Linken.

Минусы

Ignoranz vun der C++ Sprooch vum Analysator

Leider mécht PVS heiansdo Syntaxfehler a generéiert falsch positiv Messagen wann de Code komplett korrekt ass.

Zum Beispill gëtt et eng Funktioun déi zréckkënnt 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));
}

Jo ass de Schlësselwuert auto Kann mengen void, dofir ass et Auto. Awer PVS huet déi folgend Messagen produzéiert:

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.

Ganz lues Site

Jo, an der Web-Interface nieft all Message gëtt et e Link op déi entspriechend Diagnosbeschreiwung mat Beispiller. Awer wann Dir op e Link klickt, musst Dir zimlech laang waarden, an heiansdo geschitt et 504 Gateway Time-out.

Sprooch

All Beschreiwunge sinn op Russesch, déi super ass. Awer Linken aus dem Bericht féieren ëmmer op déi englesch Versioun. Et wier flott d'Sprooch ze wiesselen, sou datt Dir Diagnostik direkt op Russesch kënnt gesinn. Ech hunn net esou eng Optioun am Interface fonnt.

Et ass onbequem fir mat diagnostesche Niveauen iwwer d'Konsole ze schaffen

Loosst eis mat der Tatsaach ufänken datt déi zwee Kommandoen benotzt (dës pvs-studio-analyzer и plog-converter) verschidde Formater fir Diagnostik ze spezifizéieren.

Hëllef fir pvs-studio-analyzer liest:

-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

Ech hunn eng laang Zäit probéiert erauszefannen, wou ech goen addéieren ("Wäerter derbäisetzen") Schlësselen. Ech hu probéiert se mat Komma getrennt ze lëschten:

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

Ech hu probéiert de Schlëssel e puer Mol ze registréieren:

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

An eréischt dunn hunn ech gemierkt, datt dat bësse Masken waren! An Dir braucht zesummefaassen, an net addéieren Bedeitungen. Zum Beispill, fir allgemeng Diagnostik, Diagnostik fir Mikrooptimiséierungen a MISRA ze kréien, musst Dir se summéieren (4 + 8 + 32 = 44):

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

Bitmasken an User Interfaces benotzen ass allgemeng schlecht Form. All dëst kéint intern zesummegefaasst ginn, an eng Rei vu Fändelen kéint fir de Benotzer gesat ginn.

Zousätzlech gëtt et och en Utility plog-converter, déi mënschlech liesbar statesch Analyseinformatioun generéiert. Si huet aner Problemer.

Hëllef fir de Programm plog-converter berichten:

-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

Hei sinn e puer "Niveauen" opgetaucht, déi virdrun net do waren, an ech hunn och näischt iwwer si an der Dokumentatioun fonnt.

Am Allgemengen ass et net kloer. Dofir hunn ech alles op de Maximum gesat.

Eng Rëtsch domm Geschwëster op Catch

Zwee vun den dräi Projeten, déi ech analyséiert hunn, benotzen eng Eenheetstestbibliothéik Fongen2. An de Léiw un de Messagen (!!! 90 vun 138 an engem an 297 vun 344 an der anerer!!!) hunn déi folgend Form:

Onofhängeg Bewäertung vum PVS-Studio (Linux, C++)

Huelt net Multithreading Rechnung

Et gi vill falsch Positiver iwwer vermeintlech onverännert Variabelen oder endlos Schleifen, wärend d'Aarbecht mat dëse Variablen aus verschiddene Threads geschitt, a wann dëst net sou wier, da géifen Eenheetstester net funktionnéieren.

Onofhängeg Bewäertung vum PVS-Studio (Linux, C++)

Wéi och ëmmer, kann e statesche Analyser dëst iwwerhaapt berücksichtegen? Weess net.

Resultater

PVS huet keng richteg Bugs a mengem Open Source Projete fonnt riicht и Nächst, wéi och an engem Aarbechts-Entworf, deen ech aus offensichtleche Grënn net kann presentéieren. True, et ass derwäert am Kapp ze halen datt e puer Mängel scho gefaangen a virdru korrigéiert goufen Cppcheck и scan-build.

Am Allgemengen ass den Androck vun all dësen Analysatoren ongeféier d'selwecht: jo, se fangen eppes, heiansdo souguer eppes Wichtegs, awer allgemeng ass de Compiler genuch.

Et ass méiglech (an ech perséinlech denken et gär) datt eis Team Softwareentwécklungspraktiken benotzt, déi et eis erlaben e Minimum vu scheiss Code ze generéieren. Et ass besser net Problemer ze kreéieren wéi se heroesch ze iwwerwannen.

Dofir huelen ech mech d'Fräiheet, e puer Rotschléi ze ginn, wéi een am C++ esou schreift, datt een net d'Been schéisst oder iergendeen mat enger Rake an d'Stir schloen.

Maacht dat Bescht aus Compiler Diagnostik

Eis Team benotzt (a beréit Iech) déi folgend Kompiléierungsoptiounen:

-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

Aktivéiert se an Ärem Projet a léiert vill iwwer Äre Code.

Halt Iech un de Standard

Probéiert net Plattform-ofhängeg Saache ze benotzen wann et Standardanalogen sinn, a wann Dir absolut net ouni se maache kënnt, wéckelt se a spezielle Blocks fir Makroen (oder soss eppes) a léisst Äre Code einfach net ënner net-ënnerstëtzte Konditiounen kompiléiert ginn.

Halt Iech op Standard Operatioun Semantik

Zousatz muss Zousatz sinn, Multiplikatioun muss Multiplikatioun sinn, Funktiounsruff muss Funktiounsopruff sinn, Kopie muss kopéieren, droen muss droen, Container muss iterabel sinn, Iterator muss Promotioun hunn ++ an dereferencing *. An esou weider a sou weider.

Ech mengen d'Iddi ass kloer. Et ginn etabléiert Konventioune déi net verbindlech sinn, awer déi all Benotzer a Lieser vun Ärem Code erwaarden ze gesinn. Probéiert net anerer ze iwwerzeegen, soss wäert Dir Iech selwer iwwerraschen.

Schreift kompatibel Code

Éischtens, ech mengen d'Standardbibliothéik. Et ass héich wënschenswäert datt d'Interfaces vun Äre Klassen a Funktiounen mat Standard an aner Bibliothéike benotzt kënne ginn (zum Beispill Boost).

Fillen gratis e Bléck op d'STL an Boost Schnëttplazen. Mat rare Ausnahmen gesitt Dir do e wiirdeg Virbild.

Maacht dat Bescht aus Open Source Tools

Fir déiselwecht statesch Analyse ginn et op d'mannst zwee oppe gratis Tools déi just eemol mat engem Projet mam CMake Build System verbonne kënne ginn.

Dir kënnt méi iwwer dëst a menger rezenter Verëffentlechung liesen.

Afterword

Schlussendlech wëll ech ënnersträichen datt ech net plädéieren fir keng PVS oder aner statesch Analysatoren ze benotzen. Awer ech encouragéieren Iech ze denken wéi et geschitt ass datt de statesche Analysator konstant bedeitend Feeler an Ärem Code fënnt.

Dëst ass just eng Konsequenz. Mir mussen d'Ursaach sichen an eliminéieren.

Source: will.com

Setzt e Commentaire