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
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 ).
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. .
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.
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 .
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: 4Ich 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,16Ich habe versucht, den Schlüssel mehrmals zu schreiben:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Und 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 44Die 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,2Hier 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 . Und der Löwenanteil der Nachrichten (!!! 90 von 138 in einem und 297 von 344 in einem anderen !!!) hat folgenden Inhalt:

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.

Kann ein statischer Analyzer so etwas überhaupt berücksichtigen? Ich weiß es nicht.
PVS hat keinen einzigen echten Fehler in meinen offenen Projekten gefunden und , 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. und .
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-promoIntegrieren 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.
.
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
