Codeanalyse für Treiberwarnungen
In diesem Abschnitt werden die Warnungen aufgelistet und beschrieben, die von der Codeanalyse für Treiber gemeldet werden, wenn ein möglicher Fehler im Treibercode erkannt wird. Beachten Sie, dass einige Warnungen für Kernelmoduscode vorgesehen sind und beim Analysieren von Benutzermodustreibern ignoriert werden können.
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.
Die Codeanalyse für Treiber meldet die folgenden Arten von Warnungen:
Allgemeine Warnungen (6000-6999): Mögliche Fehler in der C- und C++-Syntax und allgemeine Codierungspraxis. Eine Beschreibung dieser Warnungen finden Sie unter Codeanalyse für C/C++-Warnungen.
Windows Specific Warnings (28600-28799): Diese Warnungen sind spezifisch für bestimmte Verwendungsmuster in Windows, sind jedoch nicht spezifisch für Treiber.
Treiberspezifische Warnungen (28100-28199): Fehler in der Interaktion eines Treibers mit der Anwendung, mit anderen Treibern und mit dem Betriebssystem.
Anmerkungsfehler (28200-28299 und 36000-36999): Diese Warnungen deuten darauf hin, dass eine Anmerkung falsch codiert oder in einem unsachgemäßen Kontext verwendet wurde. In den meisten Fällen weist das Vorhandensein einer solchen Warnung darauf hin, dass die Anmerkung nicht den gewünschten (oder irgendeinen) Effekt hat.
Speicherzuordnungswarnungen (30029-30035): Hierbei handelt es sich um Speicherzuweisungswarnungen .
In diesem Abschnitt
Thema | Beschreibung |
---|---|
Warnung C28101: Das Treibermodul hat abgeleitet, dass die aktuelle Funktion nicht der richtige Funktionstyp ist. |
|
Warnung C28110: Treiber müssen Gleitkommahardwarestatus schützen. Anzeigen der Verwendung von Float |
|
Warnung C28111: Die IRQL, in der der Gleitkommazustand gespeichert wurde, stimmt nicht mit dem aktuellen IRQL überein (für diesen Wiederherstellungsvorgang). |
|
Warnung: C28114: Beim Kopieren eines gesamten IRP-Stapeleintrags werden bestimmte Felder initialisiert, die gelöscht oder aktualisiert werden sollen. |
|
Warnung C28120: Die Funktion darf nicht auf der aktuellen IRQ-Ebene aufgerufen werden. Die aktuelle Ebene ist zu niedrig. |
|
Warnung C28121: Die Funktion darf nicht auf der aktuellen IRQ-Ebene aufgerufen werden. Die aktuelle Ebene ist zu hoch. |
|
Warnung C28122: Die Funktion darf nicht auf niedriger IRQ-Ebene aufgerufen werden. Frühere Funktionsaufrufe sind mit dieser Einschränkung inkonsistent. |
|
Warnung C28123: Die Funktion darf nicht auf hoher IRQ-Ebene aufgerufen werden. Frühere Funktionsaufrufe sind mit dieser Einschränkung inkonsistent. |
|
Warnung C28124: Der Aufruf führt dazu, dass die IRQ-Ebene unter dem minimal zulässigen Mindestwert für die zu analysierende Funktion festgelegt wird. |
|
Warnung C28126: Der AccessMode-Parameter für ObReferenceObject* sollte "IRP-RequestorMode>" sein. |
|
Warnung C28127: Die als Routine verwendete Funktion stimmt nicht genau mit dem erwarteten Typ überein. |
|
Warnung C28128: Ein Zugriff auf ein Feld wurde direkt vorgenommen. Es sollte von einer Routine gemacht werden. |
|
Warnung C28129: An einem Operanden wurde eine Zuordnung vorgenommen, die nur mithilfe von Bitsätzen und Löschungen geändert werden sollte. |
|
Warnung C28131: Die DriverEntry-Routine sollte eine Kopie des Arguments speichern, nicht der Zeiger, da der E/A-Manager den Puffer frei gibt. |
|
Warnung C28132: Nehmen der Größe des Zeigers |
|
Warnung C28133: IoInitializeTimer wird am besten von AddDevice aufgerufen |
|
Warnung C28134: Der Typ eines Pooltags sollte integral sein, keine Zeichenfolge oder ein Zeichenfolgenzeiger. |
|
Warnung C28135: Wenn das erste Argument für KeWaitForSingleObject eine lokale Variable ist, muss der Mode-Parameter KernelMode sein. |
|
Warnung C28139: Das Argument sollte exakt mit dem Typ übereinstimmen. |
|
Warnung C28141: Das Argument bewirkt, dass die IRQ-Ebene unter dem aktuellen IRQL festgelegt wird, und diese Funktion kann für diesen Zweck nicht verwendet werden. |
|
Warnung C28143: Eine Verteilerroutine, die IoMarkIrpPending aufruft, muss auch STATUS_PENDING |
|
Warnung C28144: Innerhalb einer Abbruchroutine sollte die IRQL in Irp-CancelIrql> der aktuelle IRQL sein. |
|
Warnung C28145: Die undurchsichtige MDL-Struktur sollte nicht von einem Treiber geändert werden. |
|
Warnung C28146: Kernelmodustreiber sollten ntstrsafe.h verwenden, nicht strsafe.h. In der Quelldatei gefunden |
|
Warnung C28147: Die Verwendung eines Standardpooltags (' kdD' oder 'mdW') für Aufrufe dieser Funktion hat den Zweck der Pool-Tagging-Markierungen zu besiegen. |
|
Warnung C28150: Die Funktion bewirkt, dass die IRQ-Ebene über dem maximal zulässigen Wert für die zu analysierende Funktion festgelegt wird. |
|
Warnung C28151: Der Wert ist kein rechtlicher Wert für einen IRQL |
|
Warnung C28152: Die Rückgabe von einer AddDevice-ähnlichen Funktion DO_DEVICE_INITIALIZING |
|
Warnung C28153: Der Wert für eine IRQL aus Anmerkung konnte in diesem Kontext nicht ausgewertet werden. |
|
Warnung C28156: Die tatsächliche IRQL ist mit dem erforderlichen IRQL inkonsistent. |
|
Warnung C28157: Die IRQL wurde nie wiederhergestellt. |
|
Warnung C28158: Es wurde keine IRQL gespeichert. |
|
Warnung C28161: Beenden ohne Erwerb des Rechts auf verwendung unverankerte Hardware |
|
Warnung C28162: Beenden beim Halten des Rechts auf Verwendung von Gleitkommahardware |
|
Warnung C28165: Der Funktionszeiger der Klasse stimmt nicht mit der Funktionsklasse überein. |
|
Warnung C28166: Die Funktion stellt die IRQL nicht auf den Wert zurück, der aktuell beim Funktionseintrag war und dazu erforderlich ist. |
|
Warnung C28167: Die Funktion ändert die IRQL und stellt die IRQL nicht wieder her, bevor sie beendet wird. Es sollte mit Anmerkungen versehen werden, um die Änderung widerzuspiegeln, oder die IRQL sollte wiederhergestellt werden. |
|
Warnung C28168: Die Verteilerfunktion weist keine Dispatch_type Anmerkung auf, die diesem Verteilertabelleneintrag entspricht. |
|
Warnung C28169: Die Verteilerfunktion enthält keine Dispatch_type Anmerkungen. |
|
Warnung C28170: Die Funktion wurde in einem seitenseitigen Segment deklariert, aber weder PAGED_CODE noch PAGED_CODE_LOCKED gefunden. |
|
Warnung C28171: Die Funktion verfügt über mehrere Instanzen von PAGED_CODE oder PAGED_CODE_LOCKED |
|
Warnung C28172: Die Funktion weist PAGED_CODE oder PAGED_CODE_LOCKED auf, wird jedoch nicht als seitensegment deklariert. |
|
Warnung C28173: Die aktuelle Funktion scheint sich fälschlicherweise an den physischen Arbeitsspeicher über 4 GB anzupassen. |
|
Warnung C28175: Auf das Mitglied der Struktur sollte nicht von einem Treiber zugegriffen werden |
|
Warnung C28176: Das Element der Struktur sollte nicht von einem Treiber geändert werden |
|
Warnung C28177: Funktion wird mit mehr als einer Funktionsklasse kommentiert. Alle, aber eine wird ignoriert. |
|
Warnung C28260: Ein Syntaxfehler in den Anmerkungen wurde beim Analysieren einer Eigenschaft innerhalb einer Funktion gefunden. |
|
Für die Eigenschaft in der Funktion wurde ein Syntaxfehler in den Anmerkungen gefunden. |
|
Warnung C28268: Die Funktionsklasse für die Funktion stimmt nicht mit der Funktionsklasse für den hier verwendeten Typedef überein. |
|
Warnung C28601: Blockieren bei HWND_BROADCAST vermeiden |
|
Warnung C28602: Vermeiden des Aufrufs von SendMessageTimeout mit HWND_BROADCAST |
|
Warnung C28604: Vermeiden des Aufrufens von SendMessageTimeout mit SMTO_ABORTIFHUNG mit einem Timeout von 0 |
|
Warnung C28615: Muss _resetstkoflw im __except()-Block aufrufen, wenn _alloca im __try-Block aufgerufen wird. Rufen Sie _resetstkoflw nicht innerhalb eines Catch()-Blocks auf |
|
Warnung C28616: Multithreaded AV-Bedingung |
|
Warnung C28617: Vermeiden Sie die Verwendung des Rückgabewerts von _beginthread(). Verwenden Sie stattdessen _beginthreadex() |
|
Warnung C28623: Nicht signierte Umwandlung von GetMessagePos()-Koordinaten. Verwenden von GET_X_LPARAM/GET_Y_LPARAM anstelle von LOWORD/HIWORD |
|
Warnung C28624: Kein Aufruf von Release() zum Abgleichen der inkrementierten Refcount von LResultFromObject |
|
Warnung C28625: Funktionsaufruf, der zum Löschen vertraulicher Daten verwendet wird, wird entfernt optimiert. |
|
Warnung C28636: Aufrufen von LocalFree für nicht zugewiesene Zeiger, die von Aufrufen von GetSecurityDescriptorOwner/Group/Dacl/Sacl abgerufen wurden |
|
Warnung C28637: Das Aufrufen der Funktion in einem globalen Initialisierer ist unsicher. |
|
Warnung C28638: Funktionsverzögerungs-Stub fehlt eine übereinstimmende Deklaration. |
|
Warnung C28639: Aufrufen des Schließhandles mit Zeichenfolge |
|
Warnung C28640: Funktionsverzögerungs-Stub sollte eine statische Funktion sein |
|
Warnung C28644: Rückgabewert von DPA_InsertPtr nicht aktiviert |
|
Warnung C28645: MessageBox wurde mithilfe des Fragezeichen-Nachrichtensymbols aufgerufen, das nicht mehr empfohlen wird. |
|
Warnung C28648: PulseEvent ist eine unzuverlässige Funktion |
|
Warnung C28649: Automatische oder globale Stapelarrays sind nie NULL. |
|
Warnung C28650: Der Typ, für den !0 verwendet wird, behandelt sie nicht als Fehlerfall. Zurückgeben eines Statuswerts wie ! TRUE ist nicht identisch mit dem Zurückgeben eines Statuswerts, der einen Fehler angibt. |
|
Warnung C28651: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund von Memberfunktionszeigern kopiert wird. |
|
Warnung C28652: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund überladener bitweiser Operatoren kopiert wird. |
|
Warnung C28714: Umwandlung zwischen semantisch unterschiedlichen ganzzahligen Typen |
|
Warnung C28715: Umwandlung zwischen semantisch unterschiedlichen ganzzahligen Typen |
|
Warnung C28716: Compiler eingefügte Umwandlung zwischen semantisch unterschiedlichen integralen Typen |
|
Warnung C28717: Ungültiger VARIANT-Typ |
|
Warnung C28718: Nicht kommentierter Puffer |
|
Warnung C28719: Gesperrte API-Verwendung |
|
Warnung C28720: Gesperrte API-Verwendung |
|
Warnung C28721: Veraltete Architektur des Leistungsindikators |
|
Warnung C28722: Nicht kommentierter Puffer in Funktionsdeklaration |
|
Warnung C28723: Nicht kommentierter Puffer in Funktionsdefinition ohne entsprechende Deklaration |
|
Warnung C28725: Verwenden Sie Watson anstelle dieses SetUnhandledExceptionFilters. |
|
Warnung C28726: Gesperrte API-Verwendung |
|
Warnung C28727: Gesperrte API-Verwendung |
|
Warnung C28728: Gesperrte API-Verwendung |
|
Warnung C28730: Mögliche Zuordnung von "\0" direkt zu einem Zeiger. |
|
Warnung C28735: Gesperrte Crimson-API-Verwendung |
|
Warnung C28736: Verwendung gesperrter API-Argumente |
|
Warnung C28740: Nicht signierter Puffer |
|
Warnung C28741: Nicht kommentierter Puffer in der Funktion |
|
Warnung C28742: Nicht kommentierter Puffer in der Funktion |
|
Warnung C28750: Verbotene Verwendung von lstrlen und deren Varianten |
|
Warnung C28751: Verbotene Verwendung von ExAllocatePool und deren Varianten |
|
Warnung C28752: Gesperrte Verwendung von kernel32- oder advapi32-API |
|
Warnung C28753: Vertrauen auf nicht definierte Reihenfolge der Auswertung von Parametern |
|
Warnung C30029: Aufrufen einer Speicherzuweisungsfunktion, die ausführbaren Speicher anfordert |
|
Warnung C30030: Aufrufen einer Speicherzuweisungsfunktion und Übergeben eines Parameters, der ausführbaren Speicher angibt |
|
Warnung C30031: Aufrufen einer Speicherzuweisungsfunktion und Übergeben eines Parameters, der ausführbaren Speicher angibt |
|
Warnung C30032: Aufrufen einer Speicherzuweisungsfunktion und Erzwingen der Anforderung des ausführbaren Speichers mithilfe der POOL_NX_OPTOUT-Direktive |
|
Warnung C30033: Die ausführbare Zuordnung wurde in einem Treiber erkannt, der mit POOL_NX_OPTIN kompiliert wurde. Dieser Treiber wurde festgestellt, dass er zur Laufzeit von einem anderen Treiber geladen wird. Überprüfen Sie, ob der Ladetreiber ExInitializeDriverRuntime(DrvRtPoolNxOptIn) in seinem DriverEntry aufruft. |
|
Warnung C30034: Übergeben eines Flagwerts an eine Zuordnungsfunktion, die dazu führen kann, dass ausführbarer Speicher zugewiesen wird. Stellen Sie sicher, dass die Zuweisungsfunktion keine Form eines ausführbaren Nichtseitenpools anfordert. |
|
Warnung C30035: Es wurde ein Aufruf an eine Funktion ausgeführt, die innerhalb der Initialisierungsfunktion erfolgen muss (z . B. DriverEntry() oder DllInitialize()). PREfast konnte nicht ermitteln, ob der Aufruf von der Initialisierungsfunktion ausgeführt wurde. |