Übersicht über die Codeanalyse für Treiber
Das Windows Driver Kit stellt eine treiberspezifische Erweiterung für das Codeanalysetool in Microsoft Visual Studio bereit. Die Codeanalyse für Treiber enthält Regeln, die nur für Treiber gelten, insbesondere Kernelmodustreiber. Die Codeanalyse für Treiber kann potenzielle Fehler in Ihrem Code erkennen, sobald der Code kompiliert werden kann.
Wichtig
Codeanalyse für Treiber ist in Windows 24H2 WDK und EWDK verfügbar, aber es wird empfohlen, dass sie zu einem zukünftigen Datum eingestellt wird.
In Zukunft wird CodeQL das primäre statische Analysetool für Treiber sein. CodeQL stellt eine leistungsstarke Abfragesprache bereit, die Code als abgefragte Datenbank behandelt, sodass Abfragen für bestimmte Verhaltensweisen, Muster und vieles mehr einfach geschrieben werden können.
Weitere Informationen zur Verwendung von CodeQL finden Sie unter CodeQL und dem Logotest für statische Tools.
Funktionsweise des Codeanalysetools
Das Codeanalysetool fängt den Aufruf des Buildhilfsprogramms an den Standardcompiler ab, Cl.exe und führt stattdessen einen CL-Intercept-Compiler aus, der den Treiberquellcode analysiert und eine Protokolldatei mit Fehlermeldungen und Warnmeldungen erstellt. Sie können das Codeanalysetool selbst ausführen oder das Codeanalysetool so konfigurieren, dass es ausgeführt wird, wenn Sie den Treiber erstellen. Wenn Sie das Codeanalysetool selbst ausführen (Analyse der Codeanalyse auf Lösung analysieren>), werden die Ergebnisse im Fenster "Codeanalysebericht" angezeigt. Wenn Sie das Codeanalysetool als Teil des Builds ausführen, erstellt der CL-Intercept-Compiler eine Protokolldatei mit Fehlermeldungen und Warnmeldungen und ruft dann die Standardversion von Cl.exe auf, um die Buildausgabe zu erzeugen. Die resultierenden Objektdateien sind identisch mit denen, die von einem Standardbuildbefehl erstellt werden.
Wenn der Abfangen-Compiler ausgeführt wird, untersucht die Codeanalyse für Treiber jede Funktion im Code unabhängig und simuliert dann die Ausführung aller möglichen Pfade durch den Code, sucht nach allgemeinen Treiberfehlern und unweisen Codierungsmethoden. Das Codeanalysetool wird relativ schnell ausgeführt, auch bei größeren Treibern, und der Bericht, den es generiert, identifiziert genau die Zeile des Treibercodes mit dem verdächtigen Fehler.
Die Arten der Fehlercodeanalyse können erkannt werden.
Die Codeanalyse kann verschiedene Arten von Fehlern erkennen, einschließlich Fehlern in den folgenden Kategorien:
Speicher: Potenzielle Speicherverluste, abgeleitete NULL-Zeiger , Zugriff auf nicht initialisierte Arbeitsspeicher, übermäßige Verwendung des Kernelmodusstapels und unsachgemäße Verwendung von Pooltags.
Ressourcen: Fehler beim Freigeben von Ressourcen wie Sperren, Ressourcen, die beim Aufrufen einiger Funktionen gehalten werden sollen, und Ressourcen, die beim Aufrufen anderer Funktionen nicht gehalten werden sollten.
Funktionsverwendung: Potenziell falsche Verwendung bestimmter Funktionen, Funktionsargumente, die falsch erscheinen, mögliche Argumenttypkonflikten für Funktionen, die nicht streng überprüfen Typen, mögliche Verwendung bestimmter veralteter Funktionen und Funktionsaufrufe bei einem potenziell falschen IRQL.
Gleitkommastatus: Fehler beim Schutz des Gleitkommahardwarezustands in einem Treiber und Versuch, den Gleitkommazustand nach dem Speichern in einem anderen IRQL wiederherzustellen.
Rangfolgeregeln: Code, der sich möglicherweise nicht wie der Programmierer verhält, der aufgrund der Rangfolgeregeln der C-Programmierung beabsichtigt ist.
Codierungsmethoden im Kernelmodus: Codierungsmethoden, die Fehler verursachen können, z. B. das Ändern einer undurchsichtigen Speicherbeschreibungsliste (MDL)-Struktur, das Fehlschlagen des Werts einer Variablen, die durch eine aufgerufene Funktion festgelegt wurde, und die Verwendung von C/C++-Zeichenfolgenmanipulationsfunktionen anstelle der in Ntstrsafe.h definierten sicheren Zeichenfolgenfunktionen.
Treiberspezifische Codierungsmethoden: Bestimmte Vorgänge, die häufig eine Quelle von Fehlern in Kernelmodustreibern sind. Kopieren Sie z. B. ein ganzes E/A-Anforderungspaket (IRP), ohne Elemente zu ändern und einen Zeiger auf ein Zeichenfolgen- oder Strukturargument zu speichern, anstatt ein Argument in eine DriverEntry-Routine zu kopieren.
Codeanalysewarnungen
Das Codeanalysetool verwendet ein regelbasiertes Modell, um Fehler im Programm- oder Treibercode zu identifizieren. Jede Regel ist einer Warnung zugeordnet, die gemeldet wird, wenn das Codeanalysetool einen Verstoß gegen die Regel erkennt. Ausführliche Informationen zu treiberspezifischen Warnungen finden Sie in der Codeanalyse für Treiberwarnungen. Informationen zu den wichtigsten Warnungen, die das Codeanalysetool in Visual Studio-Berichten enthält, finden Sie unter Codeanalysewarnungen.
Anmerkungen
Eine der wichtigen Funktionen, die das Codeanalysetool bereitstellt, ist die Möglichkeit, Funktionsbeschreibungen und einige andere Entitäten im Quellcode des Treibers zu kommentieren. Das Codeanalysetool verfügt über einen intrafunktionellen Bereich; d. h., es analysiert die Interaktionen zwischen Funktionen. Ziel der Anmerkungen ist es, einen vollständigeren Ausdruck des Vertrags zwischen den aufgerufenen und aufrufenden Funktionen bereitzustellen, damit das Codeanalysetool überprüfen kann, ob der Vertrag erfüllt ist. Ein weiteres Ziel der Anmerkungen ist, dass sie darüber informieren, wer den Code liest, wie die Funktion verwendet werden soll und welche Ergebnisse erwartet werden können. Die Anmerkungen deklarieren den Vertrag der Schnittstelle und versuchen nicht, zu beschreiben, wie dieser Vertrag erreicht wird. In vielen Fällen spiegeln die Ergebnisse der Ausführung des Codeanalysetools das Fehlen einer geeigneten Anmerkung wider, und durch Hinzufügen der Anmerkung werden sowohl die Warnung über die fehlende Anmerkung unterdrückt, als auch zusätzliche Überprüfungen aktiviert. Weitere Informationen finden Sie unter SAL 2.0 Anmerkungen für Windows-Treiber. Weitere Informationen zu SAL 2.0 finden Sie unter Verwendung von SAL-Anmerkungen zur Reduzierung von C/C++-Codefehlern. SAL 2.0 ersetzt SAL 1.0. SAL 2.0 sollte mit dem WDK für Windows 8 verwendet werden. Wenn Sie Informationen zu SAL 1.0 für Treiber benötigen, lesen Sie die PREfast for Drivers Annotations-Dokumentation, die mit dem WDK für Windows 7 ausgeliefert wurde.
Interpretieren des Ergebnisses
Die Codeanalyse für Treiber ist einfach auszuführen und wird auch bei sehr großen Treibern und Programmen schnell ausgeführt. Die Arbeit für den Entwickler untersucht die Ausgabe, analysiert die Fehler, die das Codeanalysetool erkannt hat, und unterscheidet reale Codierungsfehler von gültigem Code, den das Codeanalysetool falsch interpretiert hat.
Eine umfassende Referenz, in der jede Warnung beschrieben wird, die vom Codeanalysetool erkannt werden kann, finden Sie unter Codeanalyse für Treiberwarnungen. Informationen zu den wichtigsten Warnungen, die das Codeanalysetool in Visual Studio-Berichten enthält, finden Sie unter Codeanalysewarnungen.
Das Auflösen einer Codeanalysewarnung umfasst in der Regel das Aktualisieren des Quellcodes bei Bedarf oder das Hinzufügen einer Anmerkung zur Klärung des Funktionsvertrags. Durch das Hinzufügen einer Anmerkung kann der Analyzer den Vertrag für alle zukünftigen Anrufer erzwingen und auch die Lesbarkeit verbessern.
Wenn in den Codeanalyseergebnissen Fehler angezeigt werden, die Sie nach sorgfältiger Untersuchung feststellen, sind ungültig und können nicht sogar mit der Verwendung von Anmerkungen vermieden werden, können Sie diese Warnungen ausschließen oder unterdrücken. Weitere Informationen finden Sie unter Ausführen der Codeanalyse für Treiber.
Zugehörige Themen
Ausführen der Codeanalyse für Treiber
Codeanalysetool in Visual Studio