Hin und wieder fragen mich Programmierer, die sich mit dem PVS-Studio Code Analyzer vertraut machen: "Gibt es eine Liste von Warnungen, die Fehler genau anzeigen?" Es gibt keine solche Liste, da uninteressante (falsche) Warnungen in einem Projekt in einem anderen sehr wichtig und nützlich sind. Aus den aufregendsten Warnungen kann man jedoch definitiv anfangen, in den Analysator zu graben. Schauen wir uns dieses Thema genauer an.
Das Problem ist in der Regel, dass ein Programmierer zunächst in einer Vielzahl von Warnungen ertrinkt, die er erhält. Natürlich möchte er die interessantesten Warnungen überprüfen, um zu verstehen, ob er seine Zeit damit verbringen sollte, all dies zu klären. Gut, hier sind drei einfache Schritte, mit denen er die aufregendsten Warnungen überprüfen kann.
Schritt 1
Deaktivieren Sie alle Arten von Warnungen mit Ausnahme der allgemeinen (GA). Ein häufiger Fehler besteht darin, alle Arten von Warnungen zu aktivieren. Unerfahrene Benutzer denken, je mehr zu aktivieren, desto besser. Das ist nicht der Fall. Es gibt Diagnosesätze wie 64-Bit-Prüfungen und MISRA-Regeln, die nur verwendet werden sollten, wenn man genau weiß, was sie sind und wie man mit ihnen arbeitet. Wenn Sie beispielsweise die MISRA-Diagnose für ein gewöhnliches Anwendungsprogramm aktivieren, ertrinken Sie in Zehntausenden oder Hunderttausenden von Warnungen, wie z.
- 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, sondern auf Codegerüche. Natürlich beginnt ein Programmierer, Fragen zu stellen. Wie finden Sie etwas Interessantes im Stapel all dieser Warnungen? Welche Zahlen sollte er sehen? Das sind die falschen Fragen. Sie müssen nur das MISRA-Set deaktivieren. Dies ist der Standard zum Schreiben von Qualitätscode für eingebettete Geräte. Der Zweck des Standards besteht darin, den Code äußerst einfach und verständlich zu machen. Versuchen Sie nicht, es dort anzuwenden, wo es unangemessen ist.
Hinweis Ja, MISRA hat Regeln, mit denen echte Fehler identifiziert werden können. Beispiel:
V2538 - Der Wert der nicht initialisierten Variablen sollte nicht verwendet werden. Aber haben Sie keine Angst, den MISRA-Standard zu deaktivieren. Du wirst nichts verlieren. Die tatsächlichen Fehler werden weiterhin im Rahmen der Allgemeinen Diagnose (GA) gefunden. Beispielsweise wird eine nicht initialisierte Variable von der
V614- Diagnose gefunden.
Schritt 2
Jeder statische Analysator gibt bei den ersten Läufen Fehlalarme aus und erfordert einige Konfigurationen. Es kann nichts dagegen unternommen werden, aber es ist nicht so beängstigend, wie es scheinen mag. Selbst eine einfache Schnelleinstellung ermöglicht es Ihnen, die meisten Fehlalarme zu entfernen und einen recht relevanten Bericht anzuzeigen. Ich werde nicht mehr darüber sprechen, wie ich zum Beispiel in diesem Artikel oft darüber geschrieben habe: "
Eigenschaften von PVS-Studio Analyzer am Beispiel von EFL-Kernbibliotheken, 10-15% der falsch positiven Ergebnisse ".
Verbringen Sie ein wenig Zeit damit, offensichtlich irrelevante Warnungen zu deaktivieren und gegen falsch positive Ergebnisse im Zusammenhang mit Makros zu kämpfen. Im Allgemeinen sind Makros der Hauptgrund für Fehlalarme, da in allen Fällen eine Warnung angezeigt wird, wenn ein schlecht implementiertes Makro verwendet wird. Um Warnungen in Makros zu unterdrücken, können Sie Kommentare eines bestimmten Typs neben deren Deklaration schreiben. Das Format für mehr Kommentare wird in der
Dokumentation behandelt .
Ja, die anfängliche Einstellung dauert etwas, verbessert jedoch die Wahrnehmung des Berichts drastisch, indem das störende Rauschen beseitigt wird. Nehmen Sie sich etwas Zeit dafür. Bei Schwierigkeiten oder Fragen stehen wir Ihnen jederzeit mit Rat und Tat zur Verfügung, um den Analysator optimal einzurichten. Fühlen Sie sich frei zu
schreiben und uns Fragen zu stellen.
Schritt 3
Beginnen Sie mit der Anzeige von Warnungen ab Stufe 1. Erst nachdem Sie 2 und 3 gesehen haben. Warnstufen sind nichts anderes als die Richtigkeit einer Warnung. Warnungen der Stufe 1 weisen eher auf einen tatsächlichen Fehler hin als Warnungen der Stufe 2.
Sie können sagen, wenn Sie "Level 1 ansehen" wählen, drücken Sie die Schaltfläche "Die interessantesten Fehler beobachten".
Ausführlicher wird die Klassifizierung von PVS-Studio-Warnungen nach Ebenen im Artikel "
Wie statische Analysegeräte gegen falsch positive Ergebnisse kämpfen und warum sie dies tun " beschrieben.
Warum gibt es keine Liste?
Die Idee, eine Liste der nützlichsten Warnungen zu haben, mag jedoch immer noch vernünftig erscheinen. Lassen Sie mich Ihnen an einem praktischen Beispiel zeigen, dass der Nutzen einer Diagnose relativ ist und vom Projekt abhängt.
Betrachten wir die
V550- Warnung. Die Warnung erkennt einen möglichen Fehler, der damit zusammenhängt, dass zum Vergleichen von Zahlen mit einem Gleitkomma die Operatoren == oder! = Verwendet werden.
Die meisten Entwickler, mit denen ich gesprochen habe, halten diese Diagnose für nutzlos und deaktivieren sie, da alle Auslöser für ihr Projekt falsch sind. Aus diesem Grund weist diese Diagnose ein geringes Maß an Sicherheit auf und bezieht sich auf Stufe 3.
In der Tat werden in den meisten Anwendungen Float / Double-Typen in sehr einfachen Algorithmen verwendet. Oft wird der Vergleich mit der Konstante nur verwendet, um zu überprüfen, ob ein bestimmter Wert standardmäßig festgelegt ist oder ob er sich geändert hat. In diesem Fall ist die genaue Prüfung durchaus angebracht. Ich werde es 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 von 1.0f) korrekt und sicher.
Bedeutet dies, dass die V550-Diagnose uninteressant ist? Nein, nein. Es hängt alles vom Projekt ab. Lassen Sie mich einen Ausschnitt aus dem von unserem Benutzer verfassten Artikel "
Wie wir die statische Analyse in unserem Trainingssimulatorprojekt für endovaskuläre Röntgenchirurgie versucht haben " zitieren.
Worauf unser statischer Analysator hier achtet:
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); }
Fehler dieser Art wiederholen sich in dieser Bibliothek häufig. Ich kann nicht sagen, dass es mich überrascht hat. Zuvor habe ich in diesem Projekt einen falschen Umgang mit Zahlen mit einem Gleitkomma festgestellt. Es gab jedoch keine Ressourcen, um die Quellen systematisch zu überprüfen. Als Ergebnis der Überprüfung wurde klar, dass es notwendig war, dem Entwickler etwas zu geben, um seinen Horizont in Bezug auf die Arbeit mit Gleitkommazahlen zu erweitern. Er wurde mit ein paar guten Artikeln verlinkt. Wir werden sehen, wie sich die Dinge entwickeln. Es ist schwer sicher zu sagen, ob dieser Fehler echte Programmstörungen verursacht. Die aktuelle Lösung stellt eine Reihe von Anforderungen an das ursprüngliche polygonale Netz von Arterien, das die Ausbreitung von Röntgenkontrastmaterial simuliert. Wenn die Anforderungen nicht erfüllt sind, kann das Programm fallen oder die Arbeit ist eindeutig falsch. Einige dieser Anforderungen werden analytisch und andere empirisch ermittelt. Es ist möglich, dass diese empirische Reihe von Anforderungen nur aufgrund der falschen Behandlung von Zahlen mit einem Gleitkomma wächst. Es ist zu beachten, dass nicht alle gefundenen Fälle eines präzisen Vergleichs von Zahlen mit einem Gleitkomma 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 Sie können die Warnstufe auch mithilfe der Einstellungen festlegen. Wenn Sie beispielsweise der Meinung sind, dass die V550-Diagnose besondere Aufmerksamkeit verdient, können Sie sie von Stufe 3 auf Stufe 1 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, indem Sie sich die interessantesten ansehen. Vergessen Sie nicht, in die Dokumentation zu schauen, um eine detaillierte Beschreibung der Warnungen zu erhalten. Manchmal kommt es vor, dass hinter einem unscheinbaren auf den ersten Blick Warnung die Hölle steckt. Ein Beispiel für eine solche Diagnose:
V597 ,
V1026 . Vielen Dank für Ihre Aufmerksamkeit.