Wie kann man schnell interessante Warnungen sehen, die vom PVS-Studio Analyzer für C- und C ++ - Code generiert wurden?


Von Zeit zu Zeit fragen Programmierer, die sich mit dem PVS-Studio-Codeanalysator vertraut machen: „Gibt es eine Liste von Warnungen, die Fehler genau anzeigen?“ Es gibt keine solche Liste, da sich uninteressante (falsche) Warnungen in einem Projekt und in einem anderen als sehr wichtig und nützlich herausstellen. Es ist jedoch durchaus möglich, den Analysator mit den interessantesten Warnungen bekannt zu machen. Schauen wir uns dieses Thema genauer an.

Das Problem ist, dass der Programmierer beim ersten Start in der Regel eine Vielzahl von Warnungen erhält, in denen er „ertrinkt“. Natürlich hat er den Wunsch, sich mit den interessantesten Warnungen vertraut zu machen, um zu verstehen, ob er die ganze Zeit überhaupt verbringen sollte. Großartig, hier sind drei einfache Schritte, mit denen Sie die interessantesten positiven Aspekte kennenlernen können.

Schritt 1





Deaktivieren Sie alle Arten von Warnungen mit Ausnahme von Allgemein (GA). Ein häufiger Fehler: Aktivieren Sie alle Arten von Warnungen. Für unerfahrene Benutzer scheint es, dass je mehr Sie es einschalten, desto besser. Es ist nicht so! Es gibt Diagnosesätze wie 64-Bit-Überprüfungen und MISRA-Regeln, die nur mit einer klaren Vorstellung davon verwendet werden sollten, was es ist und wie mit ihnen gearbeitet werden soll. Wenn Sie beispielsweise die MISRA-Diagnose für ein gewöhnliches Anwendungsprogramm aktivieren, ertrinken Sie in Zehntausenden, Tausenden oder Hunderttausenden von Nachrichten wie:

  • V2506 . Misra. Eine Funktion sollte am Ende einen einzigen Austrittspunkt haben.
  • V2507 . Misra. Der Hauptteil einer Anweisung loop \ conditional sollte in geschweiften Klammern stehen.
  • V2523 . Misra. Alle Ganzzahlkonstanten vom Typ ohne Vorzeichen sollten das Suffix 'u' oder 'U' haben.

Die meisten MISRA-Warnungen weisen nicht auf Fehler hin, aber Code riecht. Natürlich beginnt eine Person, Fragen zu stellen. Wie kann man in der Masse all dieser Warnungen etwas Interessantes finden? Diagnose unter welchen Zahlen sollte er suchen? Das sind die falschen Fragen. Sie müssen nur das MISRA-Kit deaktivieren. Dies ist der Standard zum Schreiben von Qualitätscode für eingebettete Geräte. Das Wesentliche des Standards: Den Code extrem einfach und verständlich zu machen. Versuchen Sie nicht, es dort anzuwenden, wo es unangemessen ist.

Hinweis Ja, der MISRA-Standard enthält Regeln, mit denen echte Fehler identifiziert werden sollen. Beispiel: V2538 - Der Wert der nicht initialisierten Variablen sollte nicht verwendet werden. Aber haben Sie keine Angst, den MISRA-Standard zu deaktivieren. Sie werden nichts verlieren. Echte Fehler werden weiterhin in der Allzweckdiagnose (GA) gefunden. Beispielsweise wird dank der V614- Diagnose eine nicht initialisierte Variable gefunden.

Schritt 2





Jeder statische Analysator erzeugt beim ersten Start falsch positive Ergebnisse und erfordert eine bestimmte Konfiguration. Damit kann man nichts anfangen, aber es ist nicht so beängstigend, wie es scheinen mag. Selbst eine einfache schnelle Einrichtung ermöglicht es Ihnen, die meisten falschen Warnungen zu entfernen und sich mit einem bereits angemessenen Bericht vertraut zu machen. Wir werden nicht näher darauf eingehen, da ich zum Beispiel in diesem Artikel viele Male darüber geschrieben habe: " Eigenschaften des PVS-Studio-Analysators am Beispiel der EFL-Kernbibliotheken, 10-15% der falsch positiven Ergebnisse ."

Verbringen Sie ein wenig Zeit damit, explizit irrelevante Warnungen zu deaktivieren und Fehlalarme aufgrund von Makros zu bekämpfen. Makros sind im Allgemeinen die Hauptursache für Fehlalarme, da überall dort eine Warnung angezeigt wird, wo ein fehlgeschlagenes Makro verwendet wird. Um Warnungen in Makros zu unterdrücken, können spezielle Kommentare neben deren Deklaration eingefügt werden. Das Format zum Schreiben von Kommentaren wird in der Dokumentation näher erläutert.

Ja, die Ersteinrichtung dauert etwas, verbessert jedoch die Wahrnehmung des Berichts erheblich, indem störende Geräusche vermieden werden. Nehmen Sie sich dafür etwas Zeit. Wenn es irgendwelche Schwierigkeiten oder Fragen gibt, sind wir immer bereit zu helfen und schlagen vor, wie der Analysator am besten konfiguriert werden kann. Fühlen Sie sich frei zu schreiben und uns Fragen zu stellen.

Schritt 3





Beginnen Sie mit dem Lernen von Warnungen ab Stufe 1. Und erst dann schauen Sie sich 2 und 3 an. Warnstufen sind nichts anderes als die Zuverlässigkeit der Warnung. Warnungen der Stufe 1 weisen eher auf einen echten Fehler als auf 2 hin.

Wir können sagen, dass Sie bei Auswahl von „Watch Level 1“ die Taste „Watch the Interestest Error“ drücken.

Die Klassifizierung von PVS-Studio-Warnungen nach Ebenen wird im Artikel „ Wie und warum statische Analysegeräte mit falsch positiven Ergebnissen umgehen “ ausführlicher beschrieben.

Warum gibt es noch keine Liste?





Eine Idee mit einer Liste der nützlichsten Warnungen mag jedoch immer noch vernünftig erscheinen. Lassen Sie mich anhand eines praktischen Beispiels zeigen, dass der Nutzen der Diagnostik relativ ist und vom Projekt abhängt.

Beachten Sie die Warnung V550 . Eine Warnung zeigt einen möglichen Fehler an, da der Operator == oder! = Zum Vergleichen von Gleitkommazahlen verwendet wird.

Die meisten Entwickler, mit denen ich gesprochen habe, glauben, dass diese Diagnose von geringem Nutzen ist, und schalten sie aus, da alle positiven Ergebnisse für ihr Projekt falsch sind. Und deshalb hat diese Diagnose eine geringe Zuverlässigkeit und befindet sich auf der 3. Ebene.

In der Tat werden in den meisten Anwendungen die Float / Double-Typen in sehr einfachen Algorithmen verwendet. Und oft wird ein Vergleich mit einer Konstante nur verwendet, um zu überprüfen, ob ein Standardwert festgelegt ist oder ob er sich geändert hat. In diesem Fall ist eine genaue Überprüfung durchaus angebracht. Ich werde dies mit Pseudocode erklären.

float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value); 

Hier ist der Vergleich (Wert == 1.0f) korrekt und sicher.

Bedeutet dies, dass der V550 eine uninteressante Diagnose ist? Nein. Es hängt alles vom Projekt ab. Ich zitiere ein Fragment aus dem Artikel " Wie wir die statische Analyse in unserem Projekt eines Trainingssimulators für endovaskuläre Chirurgie getestet haben ", der von einem unserer Benutzer geschrieben wurde.

Worauf der statische Analysator hier unsere Aufmerksamkeit lenkt:

V550 Ein ungerader genauer Vergleich: t! = 0. Es ist wahrscheinlich besser, einen Vergleich mit definierter Genauigkeit zu verwenden: fabs (A - B)> Epsilon. objectextractpart.cpp 3401

 D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); } 

Ähnliche Fehler werden in dieser Bibliothek häufig wiederholt. Ich werde nicht sagen, dass mich das überrascht hat. Bereits zuvor bin ich in diesem Projekt auf falsche Arbeit mit Gleitkommazahlen gestoßen. Es gab jedoch keine Ressourcen, um die Quellen dafür systematisch zu überprüfen. Den Ergebnissen der Überprüfung zufolge wurde klar, dass Sie dem Entwickler etwas zum Lesen geben müssen, um seinen Horizont in Bezug auf die Arbeit mit Gleitkommazahlen zu erweitern. Ich warf ihm Links zu ein paar guten Artikeln. Schauen wir uns das Ergebnis an. Es ist schwer eindeutig zu sagen, ob dieser Fehler echte Fehlfunktionen im Programm verursacht. Die aktuelle Lösung stellt eine Reihe von Anforderungen an das anfängliche polygonale Netzwerk von Arterien, entlang derer die Ausbreitung einer röntgendichten Substanz simuliert wird. Wenn die Anforderungen nicht erfüllt sind, kann das Programm abstürzen oder offensichtlich falsch funktionieren. Einige dieser Anforderungen werden analytisch und andere empirisch ermittelt. Es ist möglich, dass dieser zweite Teil der Anforderungen nur durch falsche Arbeit mit Gleitkommazahlen entsteht. Es ist zu beachten, dass nicht alle gefundenen Fälle eines exakten Vergleichs von Gleitkommazahlen ein Fehler waren.

Wie Sie sehen, ist das, was bei einigen Projekten nicht interessant ist, für andere von Interesse. Dies macht es unmöglich, eine Liste der "interessantesten" zu erstellen.

Hinweis Es ist möglich, die Warnstufe über die Einstellungen einzustellen. Wenn Sie beispielsweise der Meinung sind, dass die V550-Diagnose besondere Aufmerksamkeit verdient, können Sie sie von der dritten in die erste Ebene verschieben. Diese Art von Einstellungen wird in der Dokumentation beschrieben (siehe "So stellen Sie Ihren Pegel für bestimmte Diagnosen ein").

Fazit




Jetzt wissen Sie, wie Sie mit dem Studium der Warnungen des Analysators beginnen können, wenn Sie die interessantesten berücksichtigen. Vergessen Sie nicht, in der Dokumentation nachzuschauen, um sich mit der detaillierten Beschreibung der Warnungen vertraut zu machen. Manchmal kommt es vor, dass hinter einer auf den ersten Blick unscheinbaren Warnung die Hölle steckt. Ein Beispiel für eine solche Diagnose: V597 , V1026 . Vielen Dank für Ihre Aufmerksamkeit.



Wenn Sie diesen Artikel einem englischsprachigen Publikum zugänglich machen möchten, verwenden Sie bitte den Link zur Übersetzung: Andrey Karpov. Wie kann man schnell interessante Warnungen des PVS-Studio-Analysators für C- und C ++ - Code überprüfen?

Source: https://habr.com/ru/post/de457332/


All Articles