Unabhängige Überprüfung von PVS-Studio (Linux, C++)

Ich habe einen Beitrag gesehen, dass PVS jetzt auch unter Linux analysieren kann, und habe beschlossen, es in meinen Projekten auszuprobieren. Und das ist dabei herausgekommen.


Inhalt

  1. Vorteile
  2. Nachteile
  3. Ergebnisse
  4. Nachwort

Vorteile

Reaktionsschneller Support

Ich habe einen Testschlüssel angefordert und erhielt ihn noch am selben Tag.

Die Dokumentation ist recht verständlich

Ich konnte den Analyzer ohne große Probleme starten. Es gibt auch Hilfen zu den Konsolenbefehlen (obwohl es hier einige Anmerkungen gibt, siehe Abschnitt Nachteile).

Möglichkeit zur Parallelanalyse

Der Analyzer hat eine "Standard"-Option -j, die es ermöglicht, die Analyse parallel in mehreren Aufgaben durchzuführen. Das spart erheblich Zeit.

Gute Visualisierung

Viele verschiedene Ausgabeformate, von Text bis hin zu einer kleinen Weboberfläche. Die Weboberfläche ist benutzerfreundlich, übersichtlich, mit Hinweisen neben den Zeilen im Code und Links zu den Diagnosebeschreibungen..

Einfache Integration in den Build-Prozess

Alle Dokumentationen sind auf ihrer Website vorhanden; ich kann nur sagen, dass es sehr einfach ist, wenn Ihr Projekt mit CMake erstellt wird.

Gute Diagnoseschreibungen

Wenn die Ausgabe im Modus fullhtml, generiert wird, hat jede Nachricht einen Link zur Diagnosebeschreibung, mit Erklärungen, Beispielen und zusätzlichen Links.

Nachteile

Das Unwissen des C++-Analysators.

Leider macht PVS manchmal Syntaxfehler und erzeugt falsch-positive Meldungen bei völlig korrektem Code.

Zum Beispiel gibt es eine Funktion, die zurückgibt void:

template 
auto copy (const void *source, void *destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible::value
        >
{
    new (destination) T(*static_cast(source));
}

Ja, das Schlüsselwort auto kann bedeuten void, das ist es auch auto. Aber PVS gab folgende Meldungen aus:

dynamic_tuple_management.hpp:29:1: Fehler: V591 Eine Funktion mit Rückgabewert darf keinen Wert zurückgeben.
dynamic_tuple_management.hpp:29:1: Fehler: V2542 Eine Funktion mit einem nicht-void Rückgabetyp sollte von allen Ausstiegspfaden einen Wert zurückgeben.

Eine sehr langsame Website.

Ja, im Web-Interface gibt es neben jeder Meldung einen Link zur entsprechenden Diagnosetextbeschreibung mit Beispielen. Aber wenn man auf den Link klickt, muss man ziemlich lange warten, und manchmal gibt es auch 504 Gateway Time-out..

Sprache

Alle Beschreibungen sind auf Russisch, das ist hervorragend. Aber die Links aus dem Bericht führen immer zur englischen Version. Es wäre schön, die Möglichkeit zu haben, die Sprache umzuschalten, damit man die Diagnosen sofort auf Russisch lesen kann. Ich habe in der Benutzeroberfläche diese Möglichkeit nicht gefunden.

Es ist unpraktisch, mit den Diagnosestufen über die Konsole zu arbeiten.

Beginnen wir damit, dass die beiden verwendeten Teams (das ist pvs-studio-analyzer und plog-converter) unterschiedliche Formate für die Diagnoseanfragen haben.

Die Hilfe zur pvs-studio-analyzer besagt:

-a [MODE], --analysis-mode [MODE]
    MODE definiert die Art der Warnungen:
    1 - 64-Bit-Fehler;
    2 - reserviert;
    4 - Allgemeine Analyse;
    8 - Mikro-Optimierungen;
    16 - Kundenspezifische Anforderungen;
    32 - MISRA.
    Modi können kombiniert werden, indem die Werte
    addiert werden.
    Standard: 4

Ich habe lange versucht zu verstehen, wo ich hinzufügen („adding the values“) die Schlüssel. Ich habe versucht, sie durch Kommas getrennt aufzulisten:

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

Ich habe versucht, den Schlüssel mehrmals zu schreiben:

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

Und erst dann wurde mir klar, dass es sich um Bitmasken handelt! Man muss die Werte addieren. Zum Beispiel, um die allgemeinen Diagnosen, die Mikro-Optimierungen und MISRA zu erhalten, müssen sie summiert werden (4 + 8 + 32 = 44):, und nicht hinzufügen значения. Например, чтобы получить общие диагностики, диагностики по микрооптимизациям и MISRA, нужно их просуммировать (4 + 8 + 32 = 44):

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

Die Verwendung von Bitmasken in Benutzeroberflächen ist in der Regel unhöflich. Das alles hätte intern summiert werden können, und dem Benutzer hätte ein Satz von Flags präsentiert werden können.

Außerdem gibt es ein weiteres Tool plog-converter, das lesbare Informationen zur statischen Analyse generiert. Es hat seine eigenen Besonderheiten.

Die Hilfe zur Anwendung plog-converter informiert:

-a, --analyzer            Gibt an, welche Analysewerkzeuge und -stufen zum Filtern verwendet werden sollen, z. B. 'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2' Standard: GA:1,2

Hier tauchten einige „Stufen“ auf, die es vorher nirgendwo gab, und in der Dokumentation habe ich nichts darüber gefunden.

Insgesamt ist es unklar. Deshalb habe ich alles auf Maximum eingestellt.

Eine Menge nutzloser Schimpfworte zu Catch

In zwei von drei Projekten, die ich analysiert habe, wird die Bibliothek für Modultests verwendet Catch2. Und der Löwenanteil der Nachrichten (!!! 90 von 138 in einem und 297 von 344 in einem anderen !!!) hat folgenden Inhalt:

Unabhängige Überprüfung von PVS-Studio (Linux, C++)

Berücksichtigt keine Multithreading-Umgebungen

Viele falsch-positive Meldungen über angeblich unveränderte Variablen oder Endlosschleifen, dabei wird mit diesen Variablen aus verschiedenen Threads gearbeitet, und wenn dem nicht so wäre, würden die Modultests nicht auslösen.

Unabhängige Überprüfung von PVS-Studio (Linux, C++)

Kann ein statischer Analyzer so etwas überhaupt berücksichtigen? Ich weiß es nicht.

Ergebnisse

PVS hat keinen einzigen echten Fehler in meinen offenen Projekten gefunden Burst und Proxima, sowie in einem Arbeitsprojekt, das ich aus offensichtlichen Gründen nicht vorlegen kann. Es ist jedoch zu beachten, dass einige Mängel bereits zuvor erkannt und behoben wurden. Cppcheck und scan-build.

Insgesamt ist der Eindruck von all diesen Analysatoren recht ähnlich: Ja, sie erfassen etwas, manchmal sogar etwas Wichtiges, aber insgesamt reicht der Compiler aus.

Vielleicht (und ich freue mich, so zu denken), verwendet unser Team Praktiken in der Softwareentwicklung, die es ermöglichen, die Menge an Millionen von Code zu minimieren. Es ist besser, Probleme gar nicht erst zu schaffen, als sie heroisch zu überwinden.

Deshalb erlaube ich mir, einige Ratschläge zu geben, wie man in C++ schreibt, um niemandem auf die Füße zu treten und nicht mit einer Rake auf die Stirn zu stoßen.

Nutzen Sie die Compiler-Diagnosen in vollem Umfang.

Unser Team verwendet (und empfiehlt Ihnen) die folgenden Kompilierungsoptionen:

-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

Integrieren Sie diese in Ihr Projekt, und Sie werden viel Neues über Ihren Code erfahren.

Halten Sie sich an den Standard.

Vermeiden Sie plattformabhängige Elemente, wenn es Standardalternativen gibt. Falls Sie ohne diese nicht auskommen, kapseln Sie sie in spezielle Blöcke für Makros (oder ähnliches) und stellen Sie sicher, dass Ihr Code nicht unter nicht unterstützten Bedingungen kompiliert wird.

Halten Sie sich an die standardisierte Semantik der Operationen.

Addition sollte Addition sein, Multiplikation – Multiplikation, ein Funktionsaufruf – ein Funktionsaufruf, Kopieren muss kopieren, Verschieben – verschieben, der Container muss durchlaufbar sein, und der Iterator muss vorankommen. ++ und dereferenzieren. *. Und so weiter, und so fort.

Ich denke, der Gedanke ist klar. Es gibt etablierte Konventionen, die zwar nicht zwingend sind, die aber alle Benutzer und Leser Ihres Codes erwarten. Versuchen Sie nicht, andere auszutricksen, denn dabei tricksen Sie möglicherweise sich selbst aus.

Schreiben Sie kompatiblen Code.

Zunächst meine ich die Standardbibliothek. Es wäre sehr wünschenswert, dass die Schnittstellen Ihrer Klassen und Funktionen mit Standard- und anderen Bibliotheken (zum Beispiel Boost) kompatibel sind.

Scheuen Sie sich nicht, die STL- und Boost-Schnittstellen zu durchstöbern. Mit wenigen Ausnahmen werden Sie dort ein Beispiel finden, das zur Nachahmung geeignet ist.

Nutzen Sie die offenen Tools maximal aus.

Für dieselbe Art der statischen Analyse gibt es mindestens zwei kostenlose Open-Source-Tools, die problemlos mit jedem Projekt, das ein CMake-Bausystem nutzt, verbunden werden können.

Weitere Informationen dazu finden Sie in meinem kürzlichen Beitrag..

Nachwort

Abschließend möchte ich betonen, dass ich nicht dazu aufrufe, PVS oder andere statische Analysatoren nicht zu verwenden. Ich ermutige vielmehr dazu, darüber nachzudenken, warum der statische Analysator ständig erhebliche Fehler in Ihrem Code findet.

Das ist lediglich eine Folge. Es gilt, die Ursache zu finden und zu beheben.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster