Wie binde ich statische Analyse in ein Projekt mit mehr als 10 Megabyte Quellcode ein?


    Sie sind also ein Entwickler in einem Projekt, in dem es viel (oder sogar viel) Quellcode gibt. Zum Beispiel mehr als 10 Megabyte. Sie haben Artikel über das Prüfen von Open Source-Projekten gelesen und wollten Ihr eigenes Projekt mit einem Code Analyzer testen. Sie haben das Projekt überprüft und mehr als tausend Nachrichten vom Analysator erhalten. Tausend ist eine optimistische Option. Vielleicht mehr als ein Dutzendtausend. Aber Sie sind kein fauler Entwickler? Sie haben begonnen, sie anzuzeigen. Und die fünfte Meldung des Analysators erwies sich schrecklich als echter Fehler! Und auch der siebte, neunte, zwölfte und fünfzehnte. Sie haben sich ein Dutzend echte Fehler geschrieben, auf die der Analysator hingewiesen hat, und sind mit den folgenden Worten auf den Chef zugegangen:

    „Chef, schau. Ich habe einen coolen Analyzer heruntergeladen. Er hatte in nur einer halben Stunde bereits zehn echte Fehler für uns gefunden. Insgesamt gab er tausend (zwei, drei, vier) Nachrichten heraus. Kaufen wir diesen Analysator, die Jungs und ich werden uns in zwei bis drei Wochen um alle Nachrichten kümmern und sie korrigieren. Und wenn wir dann alles reparieren, gibt er uns 0 Nachrichten. Wir sind coole Programmierer und erstellen qualitativ hochwertigen Code! “



    Und obwohl Sie in Gedanken bereits eine neue Medaille gegen die Truhe eintauschen (schließlich freuen Sie sich über die Qualität des Projekts!), Wird Ihr Chef höchstwahrscheinlich so etwas beantworten:

    „Hast du nichts zu tun? Sie möchten das gesamte Team drei Wochen lang ablenken, um Fehler zu korrigieren, und wir haben eine Veröffentlichung in einem Monat! Also was, welche Fehler sind real? Wir haben irgendwie mit ihnen gelebt und nichts. Ja, ich verstehe, dass es großartig wäre, im neuen Code keine Fehler zu machen. Nun, du tust es nicht! Ich werde nicht zulassen, dass Sie den alten Code anfassen! Es wurde bereits getestet und die Kunden haben dafür bezahlt. Und wer bezahlt die drei Wochen des Teams? Also werden wir den Analysator nicht kaufen und den alten Code nicht anfassen. Und anscheinend sind deine gegenwärtigen Aufgaben vorbei. Also werden wir dich jetzt werfen. Und morgen fertig zu sein! “

    Das wahre Szenario? Der Echte. Das Schlimmste ist, dass die gute Idee, eine statische Analyse einzuführen, daran gescheitert ist, alle Meldungen zu verarbeiten, die der Code Analyzer ausgibt. Schließlich ist es unmöglich zu verstehen, wo neue Nachrichten und wo alte Nachrichten sind, wenn jeder Lauf des Analysegeräts tausend Nachrichten erzeugt. Oder gibt es noch eine Möglichkeit, dieses Problem zu lösen?

    Wie kann dieses Problem in PVS-Studio behoben werden?


    Ein paar Releases in PVS-Studio, ein Mechanismus, der alte oder "uninteressante" Nachrichten aus dem Code-Analyzer zu unterdrücken schien. Mit Version 5.22 haben wir es endlich debuggt, es ausgearbeitet und es hat sich nun als so praktisch herausgestellt, dass wir es jedem empfehlen, der darüber nachdenkt, statische Analysen in sein Projekt einzuführen. Und jetzt erkläre ich Ihnen, wie man es benutzt.

    Hier ist also ein Projekt für 5 Millionen Codezeilen (nur zum Beispiel), in denen 150 Megabyte Quellcode enthalten sind. Sie haben es mit einem Analysegerät überprüft und mehrere Tausend Meldungen für allgemeine Zwecke erhalten (Allgemeine Analyse). Sie sind gerne bereit, diese zu beheben, aber der Projektmanager reserviert keine Zeit.

    OK, keine Frage. Nachdem die Analyse der gesamten Lösung abgeschlossen ist, rufen Sie das Menü PVS-Studio -> Nachrichten unterdrücken ... auf. Der Dialog ist einfach. Klicken Sie auf "Aktuelle Nachrichten unterdrücken" und dann auf Schließen. Als Ergebnis haben Sie 0 Nachrichten im PVS-Studio-Fenster. Und selbst wenn Sie die Analyse des gesamten Codes erneut ausführen, werden nach Abschluss der Analyse 0 Meldungen angezeigt. Wenn Sie jedoch damit beginnen, neuen Code zu schreiben oder den alten Code zu ändern, wird der Analysator diesen Code bestätigen. Es sei denn, Sie schreiben es natürlich sofort perfekt.

    Wie funktioniert es


    Dieser Mechanismus funktioniert ganz einfach. Vielmehr ist es jetzt einfach, aber wie viele Experimente wurden durchgeführt, um diese Option zu finden ... Nun, okay, was passiert aus Sicht des Benutzers, wenn er auf die Schaltfläche "Aktuelle Nachrichten unterdrücken" klickt?

    Aus .suppress-Dateien wird eine Datenbank im Projektordner erstellt. Für jedes Projekt (.vcxproj-Datei) wird in der Nähe eine eigene .suppress-Datei erstellt. Es speichert Informationen zu allen Meldungen, die vom Analysator bei der Überprüfung dieses Projekts ausgegeben wurden. Mit diesen Berichten vergleichen wir die Ergebnisse jeder neuen Analyse.

    Nachrichten werden natürlich nicht direkt verglichen. Wir berücksichtigen den Nachrichtencode, den Text der aktuellen Codezeile sowie den Text der vorherigen und nächsten Codezeile. Die Zeilennummer wird jedoch nicht berücksichtigt. Wenn die Nachricht hingegen am Ende der Datei angezeigt wurde (und somit in der Datenbank gespeichert ist), ändert das Einfügen von Zeilen am Anfang der Datei die Nachrichtenzeile. Wir werden dies verfolgen und nicht noch einmal eine "uninteressante" Nachricht ausgeben. Aber wenn sich eine der Zeilen geändert hat (vorherige, aktuelle oder nächste), dann schwören wir schon, weil Der Nachrichtenkontext war betroffen, und wir können davon ausgehen, dass diese Nachricht bereits an einen neuen (geänderten) Code gesendet wurde.

    Was ist damit zu tun? Dateien unterdrücken? Wenn PVS-Studio auf demselben Computer wie ein Build-Server ausgeführt wird, können Sie diese Dateien direkt in den Projektordnern speichern. Wenn dies nicht bequem ist (z. B. wenn eine saubere Baugruppe erstellt wurde), können Sie vor dem Starten des Analysegeräts Dateien mithilfe von Robocopy von einem anderen Ort in den Projektordner kopieren. Dabei wird die Ordnerstruktur gespeichert.

    Wenn mehrere Entwickler mit dem Analyzer arbeiten, können .suppress-Dateien in das Repository gestellt werden. Es stellt sich die Frage, wie diese .suppress-Dateien zwischen Entwicklern synchronisiert werden können. Einerseits ist die Antwort einfach - es ist XML, also gibt es kein Problem. Andererseits stellt sich heraus, dass Sie diese Dateien nicht synchronisieren müssen (und sie in der Tat irgendwie modifizieren). Es reicht aus, sie einmal zu erstellen, wenn Sie den Analysator einführen, und warum sie nicht mehr ändern. Versuchen Sie nun, zukünftig 0 Meldungen des Analysegeräts für das Projekt beizubehalten.

    Hinweis Aber wie kann man zukünftig 0 Meldungen vom Analysator verwalten, wenn dies nicht der Fall ist, nein, und es werden falsche Warnungen ausgegeben? In diesem Fall gibt es verschiedene Möglichkeiten, einzelne Warnungen zu unterdrücken. Über diesen wird weiter unten gesprochen.

    Wozu dient dieser Mechanismus?


    Wenn plötzlich noch jemand nicht versteht, dann werde ich ein absolut konkretes Beispiel geben. Sie können alle Nachrichten zu einer solchen Datenbank hinzufügen (bei der Überprüfung erhalten wir 0 Nachrichten). Auf dem Build-Server startet der Analyzer dann jede Nacht ( Konfigurieren des Starts des Analyzers auf dem Build-Server ), wobei nur neue Nachrichten angezeigt werden, d. H. Nachrichten zu dem neuen Code, den das Team an einem Tag geschrieben hat. Diese Nachrichten werden nicht nur im .plog-Format (Analysebericht im XML-Format) gespeichert, sondern auch in einer Textdatei in der Nähe. Und diese Textdatei kann bereits mit jedem geeigneten Programm per Mail an die Projektteilnehmer versendet werden. Zum Beispiel mit SendEmail .

    Am Morgen sehen die Leute Nachrichten vom Analysator in ihrer Mail und können Fehler korrigieren, auch ohne PVS-Studio auf ihren Maschinen zu installieren. Wenn Sie dennoch einen Bericht (.plog) öffnen möchten, ist dieser auf dem Build-Server verfügbar. Mit diesem Trick können Sie viel Geld für Lizenzen für PVS-Studio sparen.

    Übrigens können Sie konfigurieren, welche Nachrichten (bzw. welche Ebenen) in den Textbericht aufgenommen werden sollen. Dies geschieht mit der Option OutputLogFilter, die sich in den PVS-Studio-Einstellungen auf der Registerkarte Specific Analyzer Settings befindet. Es wird empfohlen, dass Sie Nachrichten der allgemeinen Analyseebene 1 und 2 in die Textdatei aufnehmen.

    Ein kleiner Vorbehalt zur inkrementellen Analyse.


    Trotzdem empfehlen wir Entwicklern, PVS-Studio in erster Linie, auch auf lokalen Rechnern, im inkrementellen Analysemodus zu verwenden . Dies ist ein Häkchen bei "Analyse nach dem Erstellen (nur geänderte Dateien)" im PVS-Studio-Menü. Wenn das Kontrollkästchen aktiviert ist, überwacht der Analyzer Ihre Arbeit und startet automatisch für die Dateien, die kompiliert wurden (er verfolgt die Änderung von OBJ-Dateien). Wenn der Analysator nichts findet, werden Sie nicht einmal bemerken, dass er gestartet ist. Und wenn es gefunden wird, wird eine Popup-Fehlermeldung angezeigt.

    Die inkrementelle Analyse unterstützt eine Datenbank mit "uninteressanten" Nachrichten. Wenn Sie über eine solche Datenbank verfügen, beziehen sich Nachrichten aus der inkrementellen Analyse nur auf den neuen Code. Und wenn nicht, dann komplett zu der Datei, die analysiert wird.

    Mit dem inkrementellen Analysemodus können Sie Fehler sofort korrigieren, wenn sie auftreten, noch bevor der Fehler im Versionskontrollsystem auftritt. Was bekannt ist , in diesem Stadium der billigsten von McConnell, Korrektur von Fehlern. Daher empfehlen wir, wenn möglich, PVS-Studio sowohl für tägliche Überprüfungen auf dem Server als auch im inkrementellen Analysemodus auf den Maschinen der Programmierer zu verwenden.

    Wie behebe ich Nachrichten in der Datenbank?


    Nun, Sie haben eine statische Analyse für das Projekt implementiert. Der Analyzer gibt Ihnen nicht mehr als ein paar Nachrichten pro Tag, die Sie und das Team sofort bearbeiten. Großartig. Aber hier war eine Woche Freizeit, in der Sie alte Fehler bearbeiten können. Wie komme ich zu ihnen? Es gibt zwei Möglichkeiten.
    1. Sie können das Dialogfeld über den Befehl "Nachrichten unterdrücken ..." aufrufen, in dem das Häkchen "Unterdrückte Nachrichten anzeigen" angezeigt wird. Wenn Sie es einschalten, wird eine Meldung angezeigt.
    2. Wenn Sie den täglichen Start auf dem Build-Server konfiguriert haben, wechseln Sie einfach in den Ordner mit den Ergebnissen der letzten Analyse und sehen dort die folgenden Dateien:
      1. SolutionName.plog - ein Protokoll mit nur neuen Nachrichten;
      2. SolutionName.plog.txt - ein Textprotokoll, dasselbe wie SolutionName.plog;
      3. SolutionName_WithSuppressedMessages.plog - alle Nachrichten, einschließlich "uninteressanter".

    Mit dieser Datei solutionName_WithSuppressedMessages.plog müssen Sie arbeiten. Öffne es und erhalte alle Nachrichten. Diese Datei ist zunächst sehr groß, da viele Nachrichten vorhanden sind. Aber wenn Sie sie zumindest gelegentlich korrigieren, wird sie mit der Zeit kleiner, und vielleicht können Sie sie sogar ablehnen (bzw. auch .suppress-Dateien).

    Es ist wichtig, dies zu verstehen. Wenn Sie Zeit und Gelegenheit haben, können Sie jederzeit zu den alten "uninteressanten" Nachrichten zurückkehren und diese korrigieren. Wir empfehlen Ihnen, dies zu tun, da es schließlich Fehler gibt, die korrigiert werden müssen.

    Und das widerspricht nicht der Funktion Als Fehlalarm markieren?


    Das PVS-Studio - Team hat die Mark als Alarm False Die - Marke als Fehlalarm. In diesem Fall wird ein Kommentar der Form // - V501 in die Zeile mit der Nachricht eingefügt. Wenn ein solcher Kommentar angezeigt wird, zeigt der Analysator in dieser Zeile keine V501-Meldung an.

    Der in diesem Artikel beschriebene Mechanismus und Als Fehlalarm markieren widersprechen sich nicht. Sie dienen aber etwas anderen Zwecken. Massenunterdrückung uninteressanter Nachrichten - für Massenmarkup bei der Implementierung des Analysators in einem Projekt. Und als Fehlalarm markieren - damit der Analysator nicht auf einzelne Fragmente schwört.

    Grundsätzlich wäre es möglich, den gesamten Code früher als Fehlalarm zu kennzeichnen, aber normalerweise ist es für die Leute unheimlich, so viele Änderungen am Code vorzunehmen. Außerdem ist nicht klar, wie mit alten Fehlern umgegangen werden soll - alles entfernen, was als Fehlalarm markiert ist? Und wenn es wirklich einen Fehlalarm gibt.

    Es ist jedoch auch falsch, den Mechanismus der Massenunterdrückung zum Unterdrücken einzelner Nachrichten zu verwenden.

    Im Allgemeinen sind dies zwei Mechanismen, die unterschiedliche Probleme lösen. Verwechsle sie nicht.

    Fazit


    Der Ansatz zur Implementierung der statischen Analyse in einem lebenden Projekt sieht also folgendermaßen aus:
    1. Mit dem Befehl "Nachrichten unterdrücken ..." markieren wir alle Nachrichten als "uninteressant".
    2. Jetzt gibt der Analysator beim nächsten Start nur noch Meldungen an den neuen Code aus.
    3. Bei Bedarf können Sie immer Fehler beheben, die während der Implementierung ausgeblendet wurden.
    So können Sie sofort von der statischen Analyse profitieren.

    Sitelinks


    1. Code mit PVS-Studio über die Befehlszeile überprüfen.
    2. Inkrementeller Analysemodus von PVS-Studio.
    3. Unterdrückung falscher Warnungen.
    4. Statische Code-Analyse.
    5. Eine aktualisierte Liste von Open-Source-Projekten, die wir mit PVS-Studio getestet haben.

    Jetzt auch beliebt: