Inwiefern unterscheidet sich die statische Analyse von Compiler-Warnungen?



    In Foren sieht man manchmal Leute, die glauben, dass Compiler-Warnungen mehr als genug sind, um die Hauptfehlerarten im Programmcode zu kontrollieren. Ich möchte zeigen, dass dies nicht so ist.

    Spezielle statische Analyse-Tools und Standard-Warn-Tools in Compilern zielen darauf ab, die Qualität des Quellcodes zu verbessern und potenzielle, schwer wahrnehmbare Fehler beim Debuggen zu minimieren. Auf die eine oder andere Weise werden Compiler-Meldungen auf der Grundlage einer statischen Analyse des Quellcodes zur Kompilierungszeit ausgegeben. Die Verwendung der einen oder anderen Methode zur Diagnose potenzieller Fehler weist jedoch viele Unterschiede sowohl in der Qualität der Warnungen als auch in den Verwendungsmöglichkeiten auf.



    Compiler-Analyse


    Die Hauptaufgabe des Compilers besteht darin, Binärcode aus kompilierten Quelldateien abzurufen. Die Geschwindigkeit der Kompilierung ist eines der wichtigsten Merkmale. Daher benötigt die statische Analyse des Quellcodes nicht viel Zeit, um eine eingehende Analyse durchzuführen oder mit einer großen Anzahl von Diagnoseregeln zu arbeiten. Daher melden Compiler nur die häufigsten problematischen Konstrukte im Code.

    Als Produkte verschiedener Unternehmen können sich viele Compiler in ihrer Fähigkeit, Nachrichten an verdächtige Teile des Quellcodes zu senden, erheblich unterscheiden. Die Verwendung verschiedener Compiler kann daher auch die Qualität von Programmen verbessern. Aber oft gibt es keine Möglichkeit, ein Programm mit verschiedenen Compilern zu kompilieren, selbst für dasselbe Betriebssystem. Einige Compiler stellen möglicherweise ihre eigenen Spracherweiterungen zur Verfügung, die von anderen Compilern nicht unterstützt werden und deren Verwendung die Portabilität des Quellcodes beeinträchtigt. Die Verwendung plattformabhängiger Konstrukte erschwert es außerdem, das Programm mit einem anderen Compiler zu überprüfen, wenn es nur für ein anderes Betriebssystem vorhanden ist.

    Analysatoren von Drittanbietern


    Bei Verwendung spezieller Tools für die statische Analyse ist die Situation anders. Solche Werkzeuge werden in eine Richtung entwickelt, sind flexibler und werden auf dem Gebiet der Analyse des Quellcodes von Programmen entwickelt. Im Gegensatz zu Compilern bieten statische Analysegeräte mehr Diagnoseregeln, von denen viele nicht standardmäßige und nicht die häufigsten Fehler diagnostizieren.

    Am Beispiel von Visual C ++ Compiler und PVS-Studio


    Der Visual C ++ - Compiler verfügt über eine C4265- Diagnose, die Warnungen zum Deklarieren einer Klasse ohne virtuellen Destruktor ausgibt . Dies ist eine sehr nützliche Diagnose, gibt aber Warnungen an alle Klassen aus, die keinen virtuellen Destruktor haben, und ist daher standardmäßig deaktiviert.

    Eine ähnliche Diagnose von V599 gibt es auch im statischen Analysator PVS-Studio. Als spezialisiertes Tool in diesem Bereich verfügt der Analyzer über einen intelligenteren Algorithmus, der nur dann eine Warnung ausgibt, wenn im Basiskonstruktor mindestens eine virtuelle Funktion vorhanden ist und das Objekt dieser Klasse mit dem Operator delete zerstört wird.

    Ein weiteres Beispiel ist die Verwendung der Memset-Funktion. Betrachten Sie das folgende Codebeispiel.
    void Foo()
    {
      char password[MAX_PASSWORD_LEN];
      InputPassword(password);
      ProcessPassword(password);
      memset(password, 0, sizeof(password));
    }

    Hier soll der Puffer mit dem Passwort gelöscht werden. Dieser Code ist aus Sicht des Compilers völlig korrekt, aber der Aufruf der Memset-Funktion wird vom Compiler ohne Warnung gelöscht, wenn Sie ihn mit der Taste "/ O2" ausführen. Der PVS-Studio-Analysator findet mithilfe der V597- Diagnose einen ähnlichen Ort .

    Der richtige Code lautet wie folgt:
    void Foo()
    {
      char password[MAX_PASSWORD_LEN];
      InputPassword(password);
      ProcessPassword(password);
      RtlSecureZeroMemory(password, sizeof(password));
    }

    Um Puffer mit privaten Informationen zu löschen, müssen Sie die spezielle Funktion RtlSecureZeroMemory verwenden .

    Fazit


    Abschließend stellen wir die wichtigsten Punkte zu den Tools für die Quellcode-Analyse fest:
    • Die Code-Analyse ist nicht die Hauptaufgabe des Compilers.
    • Die Verwendung verschiedener Compiler zur Analyse ist schwierig, jedoch wünschenswert.
    • Compiler decken eine kleine Liste der häufigsten Fehler ab.
    • Statische Analysegeräte sind ausschließlich auf die Analyse spezialisiert.
    • Statische Analysegeräte verfügen über eine umfangreiche Datenbank mit Diagnoseregeln.
    • Die Ideologie einiger Diagnosen schließt Fehlalarme nicht aus.
    • Unabhängig vom verwendeten Compiler können verschiedene Analysatoren verwendet werden.

    Durch die Verwendung verschiedener statischer Analysetools, die sich in der Analysemethode unterscheiden, wird die Qualität Ihres Programmcodes mit Sicherheit verbessert.

    Jetzt auch beliebt: