Statische und dynamische Überprüfungstools
Es gibt zwei grundlegende Arten von Überprüfungstools:
Statische Überprüfungstools untersuchen den Treibercode, ohne den Treiber auszuführen. Da diese Tools nicht auf Tests angewiesen sind, die den Code ausführen, können sie sehr gründlich sein. Theoretisch können statische Überprüfungstools den gesamten Treibercode untersuchen, einschließlich Codepfaden, die selten in der Praxis ausgeführt werden. Da der Treiber jedoch nicht tatsächlich ausgeführt wird, könnten sie falsch positive Ergebnisse erzielen. Das heißt, sie melden möglicherweise einen Fehler in einem Codepfad, der möglicherweise nicht in der Praxis auftritt.
Dynamische Überprüfungstools untersuchen den Treibercode, während der Treiber ausgeführt wird, in der Regel durch Abfangen von Aufrufen von häufig verwendeten Treiberunterstützungsroutinen und Substituieren von Aufrufen ihrer eigenen Fehlerüberprüfungsversionen derselben Routinen. Da der Treiber tatsächlich ausgeführt wird, während die dynamischen Tools die Überprüfung durchführen, sind falsch positive Ergebnisse selten. Da die dynamischen Tools jedoch nur die Aktionen erkennen, die während der Überwachung des Treibers auftreten, können die Tools bestimmte Treiberfehler verpassen, wenn die Treibertestabdeckung nicht ausreichend ist. Gleichzeitig können mithilfe von informationen, die zur Laufzeit verfügbar sind, z. B. Informationen, die schwieriger sind, statisch aus dem Quellcode zu extrahieren, dynamische Überprüfungstools bestimmte Klassen von Treiberfehlern erkennen, die mit statischen Analysetools schwieriger zu erkennen sind.
Die bewährte Methode besteht darin, eine Kombination aus statischen und dynamischen Überprüfungstools zu verwenden. Mit statischen Tools können Sie Codepfade überprüfen, die in der Praxis schwierig zu üben sind, während die dynamischen Tools schwerwiegende Fehler finden, die im Treiber auftreten.
Wichtig
Das Windows-Hardwarekompatibilitätsprogramm erfordert CodeQL für statische Tool-Logo-Tests (STL) auf unseren Client- und Server-Betriebssystemen. Wir werden die Unterstützung für SDV und CA auf älteren Produkten weiterhin aufrechterhalten. Den Partnern wird dringend empfohlen, die CodeQL-Anforderungen für den Static Tool Logo Test zu prüfen. Weitere Informationen zur Verwendung von CodeQL finden Sie unter CodeQL und dem Logotest für statische Tools.
Umfrage der Überprüfungstools
Die folgenden Überprüfungstools werden im WDK beschrieben und für die Verwendung von Treiberentwicklern und Testern empfohlen. Sie werden in der Reihenfolge aufgeführt, in der sie normalerweise verwendet werden.
Sobald der Code kompiliert wird
- CodeQL von GitHub ist eine leistungsstarke semantische Code-Analyse-Engine. Die Kombination aus einer umfangreichen Suite hochwertiger Sicherheitsabfragen und einer robusten Plattform macht CodeQL zu einem unschätzbaren Tool zur Sicherung von Treibercode. Weitere Informationen finden Sie unter CodeQL und dem Logotest für statische Tools.
Zusätzliche statische Tools
Je nachdem, aus welcher Windows-Version Sie einen Treiber erstellen, sind möglicherweise andere statische Tools erforderlich.
Die Codeanalyse für Treiber ist ein statisches Überprüfungstool, das zur Kompilierungszeit ausgeführt wird. Die Codeanalyse für Treiber kann treiber überprüfen, die in C/C++ und verwaltetem Code geschrieben wurden. Er untersucht den Code in jeder Funktion eines Treibers unabhängig voneinander, sodass Sie ihn ausführen können, sobald Sie den Treiber erstellen können. Es wird relativ schnell ausgeführt und verwendet nur wenige Ressourcen.
Die grundlegenden Features des Codeanalysetools in Visual Studio erkennen allgemeine Codierungsfehler, z. B. die Überprüfung von Rückgabewerten. Die treiberspezifischen Features erkennen dezentere Treibercodierungsfehler, z. B. das Verlassen nicht initialisierter Felder in einem kopierten IRP und das Fehlschlagen einer geänderten IRQL am Ende einer Routine.
Static Driver Verifier (SDV) ist ein statisches Überprüfungstool, das zur Kompilierungszeit ausgeführt wird und den in C/C++ geschriebenen Kernelmodustreibercode überprüft. Sie ist im WDK enthalten und kann mit Visual Studio Ultimate 2012 oder über ein Visual Studio-Eingabeaufforderungsfenster mit MSBuild gestartet werden.
Basierend auf einer Reihe von Schnittstellenregeln und einem Modell des Betriebssystems bestimmt static Driver Verifier, ob der Treiber ordnungsgemäß mit dem Windows-Betriebssystem-Kernel interagiert. Static Driver Verifier ist äußerst gründlich - es untersucht alle erreichbaren Pfade im Treiberquellcode und führt sie symbolisch aus. Daher findet es Fehler, die nicht mithilfe anderer herkömmlicher Methoden zum Testen von Treibern erkannt werden.
Wichtig
SDV wird nicht mehr unterstützt, und SDV ist in Windows 24H2 WDK- oder EWDK-Versionen nicht verfügbar. Sie ist in WDKs neuer als Build 26017 nicht verfügbar und nicht im Windows 24H2 RTM WDK enthalten.
SDV kann weiterhin verwendet werden, indem Sie das Windows 11, Version 22H2 EWDK (veröffentlicht am 24. Oktober 2023) mit Visual Studio-Buildtools 17.1.5 aus dem Windows Driver Kit (WDK) herunterladen. Es wird nur die Verwendung von Enterprise WDK zum Ausführen von SDV empfohlen. Die Verwendung älterer Versionen des Standard-WDK in Verbindung mit den letzten Versionen von Visual Studio wird nicht empfohlen, da dies wahrscheinlich zu Analysefehlern führt.
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.
Wenn der Treiber ausgeführt wird
Verwenden Sie die folgenden dynamischen Überprüfungstools, sobald der Treiber erstellt wurde und ohne offensichtliche Fehler ausgeführt wird.
Driver Verifier ist ein dynamisches Überprüfungstool, das speziell für Windows-Treiber geschrieben wurde. Sie enthält mehrere Tests, die gleichzeitig auf mehreren Treibern ausgeführt werden können. Driver Verifier ist so effektiv bei der Suche nach schwerwiegenden Fehlern in Treibern, die erfahrene Treiberentwickler und Tester konfigurieren Treiberüberprüfung so, dass sie ausgeführt wird, wenn ihr Treiber in einer Entwicklungs- oder Testumgebung ausgeführt wird. Driver Verifier ist in Windows enthalten. Wenn Sie die Treiberüberprüfung für einen Treiber aktivieren, müssen Sie auch mehrere Tests auf dem Treiber ausführen. Die Treiberüberprüfung kann bestimmte Treiberfehler erkennen, die nur mit statischen Überprüfungstools schwer zu erkennen sind. Beispiele für diese Arten von Fehlern sind die folgenden:
Kernelpoolpufferüberläufe. Wenn der überprüfte Treiber Poolspeicherpuffer zuordnet, schützt Driver Verifier sie mit einer nicht zugänglichen Speicherseite. Wenn der Treiber versucht, arbeitsspeicherüber das Ende des Puffers zu verwenden, gibt die Treiberüberprüfung eine Fehlerüberprüfung aus.
Verwenden des Arbeitsspeichers nach dem Freigeben. Spezielle Poolspeicherblöcke verwenden ihre eigene Speicherseite und teilen keine Speicherseiten mit anderen Zuordnungen. Wenn der Treiber den Speicherblock des Pools freigibt, wird die entsprechende Speicherseite nicht zugänglich. Wenn der Treiber versucht, diesen Speicher nach dem Freigeben zu verwenden, stürzt der Treiber sofort ab.
Verwenden des ausgelagerten Speichers beim Ausführen mit erhöhten RECHTEN IRQL. Wenn ein überprüfter Treiber den IRQL bei DISPATCH_LEVEL oder höher auslöst, schneidet Driver Verifier den gesamten ausgelagerten Arbeitsspeicher aus dem Systemarbeitssatz ab und simuliert ein System unter Arbeitsspeicherdruck. Der Treiber stürzt ab, wenn versucht wird, eine dieser ausserseitigen virtuellen Adressen zu verwenden.
Simulation mit geringen Ressourcen. Um ein System unter bedingungen mit niedrigen Ressourcen zu simulieren, kann Driver Verifier verschiedene Betriebssystem-Kernel-APIs fehlschlagen, die von Treibern aufgerufen werden.
Speicherverluste. Driver Verifier verfolgt speicherzuordnungen eines Treibers und stellt sicher, dass der Speicher freigegeben wird, bevor der Treiber entladen wird.
E/A-Vorgänge, die zu viel Zeit in Anspruch nehmen, um abgeschlossen oder abgebrochen zu werden. Die Treiberüberprüfung kann die Logik des Treibers testen, um auf STATUS_PENDING Rückgabewerte von IoCallDriver zu reagieren.
DDI-Complianceüberprüfung. (Ab Windows 8 verfügbar) Driver Verifier wendet eine Reihe von DDI-Regeln (Device Driver Interface) an, die die richtige Interaktion zwischen einem Treiber und der Kernelschnittstelle des Betriebssystems überprüfen. Diese Regeln entsprechen Regeln, die static Driver Verifier beim Analysieren von Treiberquellcode verwendet. Wenn die Treiberüberprüfung einen Fehler findet, wenn die DDI-Kompatibilitätsprüfung aktiviert ist, führen Sie statische Treiberüberprüfung aus, und wählen Sie die gleiche Regel aus, die den Fehler verursacht hat. Statische Treiberüberprüfung kann Ihnen helfen, die Ursache des Fehlers im Treiberquellcode zu finden.
Der Kernel Address Sanitizer (KASAN) ist eine Fehlererkennungstechnologie, die von Windows-Treibern unterstützt wird, mit der Sie mehrere Klassen illegaler Speicherzugriffe erkennen können, z. B. Pufferüberläufe und verwendungsfreie Ereignisse.
Application Verifier ist ein dynamisches Überprüfungstool für Benutzermodusanwendungen und Treiber, die in C/C++ geschrieben wurden. Verwalteter Code wird nicht überprüft.