Freigeben über


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

C28101

Warnung C28101: Das Treibermodul hat abgeleitet, dass die aktuelle Funktion nicht der richtige Funktionstyp ist.

C28110

Warnung C28110: Treiber müssen Gleitkommahardwarestatus schützen. Anzeigen der Verwendung von Float

C28111

Warnung C28111: Die IRQL, in der der Gleitkommazustand gespeichert wurde, stimmt nicht mit dem aktuellen IRQL überein (für diesen Wiederherstellungsvorgang).

C28114

Warnung: C28114: Beim Kopieren eines gesamten IRP-Stapeleintrags werden bestimmte Felder initialisiert, die gelöscht oder aktualisiert werden sollen.

C28120

Warnung C28120: Die Funktion darf nicht auf der aktuellen IRQ-Ebene aufgerufen werden. Die aktuelle Ebene ist zu niedrig.

C28121

Warnung C28121: Die Funktion darf nicht auf der aktuellen IRQ-Ebene aufgerufen werden. Die aktuelle Ebene ist zu hoch.

C28122

Warnung C28122: Die Funktion darf nicht auf niedriger IRQ-Ebene aufgerufen werden. Frühere Funktionsaufrufe sind mit dieser Einschränkung inkonsistent.

C28123

Warnung C28123: Die Funktion darf nicht auf hoher IRQ-Ebene aufgerufen werden. Frühere Funktionsaufrufe sind mit dieser Einschränkung inkonsistent.

C28124

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.

C28126

Warnung C28126: Der AccessMode-Parameter für ObReferenceObject* sollte "IRP-RequestorMode>" sein.

C28127

Warnung C28127: Die als Routine verwendete Funktion stimmt nicht genau mit dem erwarteten Typ überein.

C28128

Warnung C28128: Ein Zugriff auf ein Feld wurde direkt vorgenommen. Es sollte von einer Routine gemacht werden.

C28129

Warnung C28129: An einem Operanden wurde eine Zuordnung vorgenommen, die nur mithilfe von Bitsätzen und Löschungen geändert werden sollte.

C28131

Warnung C28131: Die DriverEntry-Routine sollte eine Kopie des Arguments speichern, nicht der Zeiger, da der E/A-Manager den Puffer frei gibt.

C28132

Warnung C28132: Nehmen der Größe des Zeigers

C28133

Warnung C28133: IoInitializeTimer wird am besten von AddDevice aufgerufen

C28134

Warnung C28134: Der Typ eines Pooltags sollte integral sein, keine Zeichenfolge oder ein Zeichenfolgenzeiger.

C28135

Warnung C28135: Wenn das erste Argument für KeWaitForSingleObject eine lokale Variable ist, muss der Mode-Parameter KernelMode sein.

C28139

Warnung C28139: Das Argument sollte exakt mit dem Typ übereinstimmen.

C28141

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.

C28143

Warnung C28143: Eine Verteilerroutine, die IoMarkIrpPending aufruft, muss auch STATUS_PENDING

C28144

Warnung C28144: Innerhalb einer Abbruchroutine sollte die IRQL in Irp-CancelIrql> der aktuelle IRQL sein.

C28145

Warnung C28145: Die undurchsichtige MDL-Struktur sollte nicht von einem Treiber geändert werden.

C28146

Warnung C28146: Kernelmodustreiber sollten ntstrsafe.h verwenden, nicht strsafe.h. In der Quelldatei gefunden

C28147

Warnung C28147: Die Verwendung eines Standardpooltags (' kdD' oder 'mdW') für Aufrufe dieser Funktion hat den Zweck der Pool-Tagging-Markierungen zu besiegen.

C28150

Warnung C28150: Die Funktion bewirkt, dass die IRQ-Ebene über dem maximal zulässigen Wert für die zu analysierende Funktion festgelegt wird.

C28151

Warnung C28151: Der Wert ist kein rechtlicher Wert für einen IRQL

C28152

Warnung C28152: Die Rückgabe von einer AddDevice-ähnlichen Funktion DO_DEVICE_INITIALIZING

C28153

Warnung C28153: Der Wert für eine IRQL aus Anmerkung konnte in diesem Kontext nicht ausgewertet werden.

C28156

Warnung C28156: Die tatsächliche IRQL ist mit dem erforderlichen IRQL inkonsistent.

C28157

Warnung C28157: Die IRQL wurde nie wiederhergestellt.

C28158

Warnung C28158: Es wurde keine IRQL gespeichert.

C28161

Warnung C28161: Beenden ohne Erwerb des Rechts auf verwendung unverankerte Hardware

C28162

Warnung C28162: Beenden beim Halten des Rechts auf Verwendung von Gleitkommahardware

C28165

Warnung C28165: Der Funktionszeiger der Klasse stimmt nicht mit der Funktionsklasse überein.

C28166

Warnung C28166: Die Funktion stellt die IRQL nicht auf den Wert zurück, der aktuell beim Funktionseintrag war und dazu erforderlich ist.

C28167

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.

C28168

Warnung C28168: Die Verteilerfunktion weist keine Dispatch_type Anmerkung auf, die diesem Verteilertabelleneintrag entspricht.

C28169

Warnung C28169: Die Verteilerfunktion enthält keine Dispatch_type Anmerkungen.

C28170

Warnung C28170: Die Funktion wurde in einem seitenseitigen Segment deklariert, aber weder PAGED_CODE noch PAGED_CODE_LOCKED gefunden.

C28171

Warnung C28171: Die Funktion verfügt über mehrere Instanzen von PAGED_CODE oder PAGED_CODE_LOCKED

C28172

Warnung C28172: Die Funktion weist PAGED_CODE oder PAGED_CODE_LOCKED auf, wird jedoch nicht als seitensegment deklariert.

C28173

Warnung C28173: Die aktuelle Funktion scheint sich fälschlicherweise an den physischen Arbeitsspeicher über 4 GB anzupassen.

C28175

Warnung C28175: Auf das Mitglied der Struktur sollte nicht von einem Treiber zugegriffen werden

C28176

Warnung C28176: Das Element der Struktur sollte nicht von einem Treiber geändert werden

C28177

Warnung C28177: Funktion wird mit mehr als einer Funktionsklasse kommentiert. Alle, aber eine wird ignoriert.

C28260

Warnung C28260: Ein Syntaxfehler in den Anmerkungen wurde beim Analysieren einer Eigenschaft innerhalb einer Funktion gefunden.

C28266

Für die Eigenschaft in der Funktion wurde ein Syntaxfehler in den Anmerkungen gefunden.

C28268

Warnung C28268: Die Funktionsklasse für die Funktion stimmt nicht mit der Funktionsklasse für den hier verwendeten Typedef überein.

C28601

Warnung C28601: Blockieren bei HWND_BROADCAST vermeiden

C28602

Warnung C28602: Vermeiden des Aufrufs von SendMessageTimeout mit HWND_BROADCAST

C28604

Warnung C28604: Vermeiden des Aufrufens von SendMessageTimeout mit SMTO_ABORTIFHUNG mit einem Timeout von 0

C28615

Warnung C28615: Muss _resetstkoflw im __except()-Block aufrufen, wenn _alloca im __try-Block aufgerufen wird. Rufen Sie _resetstkoflw nicht innerhalb eines Catch()-Blocks auf

C28616

Warnung C28616: Multithreaded AV-Bedingung

C28617

Warnung C28617: Vermeiden Sie die Verwendung des Rückgabewerts von _beginthread(). Verwenden Sie stattdessen _beginthreadex()

C28623

Warnung C28623: Nicht signierte Umwandlung von GetMessagePos()-Koordinaten. Verwenden von GET_X_LPARAM/GET_Y_LPARAM anstelle von LOWORD/HIWORD

C28624

Warnung C28624: Kein Aufruf von Release() zum Abgleichen der inkrementierten Refcount von LResultFromObject

C28625

Warnung C28625: Funktionsaufruf, der zum Löschen vertraulicher Daten verwendet wird, wird entfernt optimiert.

C28636

Warnung C28636: Aufrufen von LocalFree für nicht zugewiesene Zeiger, die von Aufrufen von GetSecurityDescriptorOwner/Group/Dacl/Sacl abgerufen wurden

C28637

Warnung C28637: Das Aufrufen der Funktion in einem globalen Initialisierer ist unsicher.

C28638

Warnung C28638: Funktionsverzögerungs-Stub fehlt eine übereinstimmende Deklaration.

C28639

Warnung C28639: Aufrufen des Schließhandles mit Zeichenfolge

C28640

Warnung C28640: Funktionsverzögerungs-Stub sollte eine statische Funktion sein

C28644

Warnung C28644: Rückgabewert von DPA_InsertPtr nicht aktiviert

C28645

Warnung C28645: MessageBox wurde mithilfe des Fragezeichen-Nachrichtensymbols aufgerufen, das nicht mehr empfohlen wird.

C28648

Warnung C28648: PulseEvent ist eine unzuverlässige Funktion

C28649

Warnung C28649: Automatische oder globale Stapelarrays sind nie NULL.

C28650

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.

C28651

Warnung C28651: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund von Memberfunktionszeigern kopiert wird.

C28652

Warnung C28652: Statische Initialisierung bewirkt, dass die Kopie auf Schreibseiten aufgrund überladener bitweiser Operatoren kopiert wird.

C28714

Warnung C28714: Umwandlung zwischen semantisch unterschiedlichen ganzzahligen Typen

C28715

Warnung C28715: Umwandlung zwischen semantisch unterschiedlichen ganzzahligen Typen

C28716

Warnung C28716: Compiler eingefügte Umwandlung zwischen semantisch unterschiedlichen integralen Typen

C28717

Warnung C28717: Ungültiger VARIANT-Typ

C28718

Warnung C28718: Nicht kommentierter Puffer

C28719

Warnung C28719: Gesperrte API-Verwendung

C28720

Warnung C28720: Gesperrte API-Verwendung

C28721

Warnung C28721: Veraltete Architektur des Leistungsindikators

C28722

Warnung C28722: Nicht kommentierter Puffer in Funktionsdeklaration

C28723

Warnung C28723: Nicht kommentierter Puffer in Funktionsdefinition ohne entsprechende Deklaration

C28725

Warnung C28725: Verwenden Sie Watson anstelle dieses SetUnhandledExceptionFilters.

C28726

Warnung C28726: Gesperrte API-Verwendung

C28727

Warnung C28727: Gesperrte API-Verwendung

C28728

Warnung C28728: Gesperrte API-Verwendung

C28730

Warnung C28730: Mögliche Zuordnung von "\0" direkt zu einem Zeiger.

C28735

Warnung C28735: Gesperrte Crimson-API-Verwendung

C28736

Warnung C28736: Verwendung gesperrter API-Argumente

C28740

Warnung C28740: Nicht signierter Puffer

C28741

Warnung C28741: Nicht kommentierter Puffer in der Funktion

C28742

Warnung C28742: Nicht kommentierter Puffer in der Funktion

C28750

Warnung C28750: Verbotene Verwendung von lstrlen und deren Varianten

C28751

Warnung C28751: Verbotene Verwendung von ExAllocatePool und deren Varianten

C28752

Warnung C28752: Gesperrte Verwendung von kernel32- oder advapi32-API

C28753

Warnung C28753: Vertrauen auf nicht definierte Reihenfolge der Auswertung von Parametern

C30029

Warnung C30029: Aufrufen einer Speicherzuweisungsfunktion, die ausführbaren Speicher anfordert

C30030

Warnung C30030: Aufrufen einer Speicherzuweisungsfunktion und Übergeben eines Parameters, der ausführbaren Speicher angibt

C30031

Warnung C30031: Aufrufen einer Speicherzuweisungsfunktion und Übergeben eines Parameters, der ausführbaren Speicher angibt

C30032

Warnung C30032: Aufrufen einer Speicherzuweisungsfunktion und Erzwingen der Anforderung des ausführbaren Speichers mithilfe der POOL_NX_OPTOUT-Direktive

C30033

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.

C30034

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.

C30035

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.