Upozornění k analýze kódu ovladačů

Tato část obsahuje seznam a popisuje upozornění, která analýza kódu pro ovladače hlásí, když zjistí možnou chybu v kódu ovladače. Všimněte si, že některá upozornění jsou určená pro kód v režimu jádra a při analýze ovladačů uživatelského režimu je možné ignorovat.

Důležité

Analýza kódu pro ovladače je k dispozici ve Windows 24H2 WDK a EWDK, ale upozorňujeme, že se plánuje její vyřazení v budoucnu.
V budoucnu bude CodeQL primárním nástrojem pro statickou analýzu ovladačů. CodeQL poskytuje výkonný dotazovací jazyk, který zpracovává kód jako databázi, která se má dotazovat, což usnadňuje psaní dotazů pro konkrétní chování, vzory a další. Další informace o použití CodeQL naleznete v tématu CodeQL a Static Tools Logo Test.

Analýza kódu pro ovladače hlásí následující typy upozornění:

  • Obecná upozornění (6000–6999): Potenciální chyby v syntaxi C a C++ a obecné postupy kódování Popis těchto upozornění najdete v tématu Analýza kódu pro upozornění C/C++.

  • Upozornění specifická pro Windows (28600–28799): Tato upozornění jsou specifická pro určité vzorce použití ve Windows, ale nejsou specifická pro ovladače.

  • upozorněníDriver-Specific (28100–28199): Chyby v interakci ovladače s aplikací, s jinými ovladači a s operačním systémem.

  • Chyby poznámek (28200-28299 a 36000-36999): Tato upozornění označují, že poznámka byla nesprávně zakódována nebo používána v nesprávném kontextu. Ve většině případů přítomnost takového upozornění značí, že poznámka nemá požadovaný (ani žádný) efekt.

  • Upozornění přidělení paměti (30029–30035): Toto jsou upozornění přidělení paměti.

v této části

Téma Popis

C28101

upozornění C28101: Modul Ovladače odvodil, že aktuální funkce není správným typem funkce.

C28110

upozornění C28110: Ovladače musí chránit stav hardwaru s plovoucí desetinou čárkou. Zobrazit použití plovoucí hodnoty

C28111

upozornění C28111: IRQL, kde byl uložen stav s plovoucí desetinou čárkou, neodpovídá aktuálnímu prostředí IRQL (pro tuto operaci obnovení).

C28114

upozornění C28114: Kopírování celé položky zásobníku IRP ponechává některá pole v původním stavu, která by měla být vymazána nebo aktualizována.

C28120

upozornění C28120: Funkce není povolena k zavolání na aktuální úrovni IRQ. Aktuální úroveň je příliš nízká.

C28121

upozornění C28121: Funkce není povolena k zavolání na aktuální úrovni IRQ. Aktuální úroveň je příliš vysoká.

C28122

upozornění C28122: Funkce není povolena na nízké úrovni IRQ. Předchozí volání funkce jsou nekonzistentní s tímto omezením.

C28123

upozornění C28123: Funkci nelze volat na vysoké úrovni IRQ. Předchozí volání funkce jsou nekonzistentní s tímto omezením.

C28124

upozornění C28124: Volání, které způsobí, že úroveň IRQ bude nastavena pod minimální přijatelnou hodnotu pro analyzovanou funkci.

C28126

upozornění C28126: Parametr AccessMode na ObReferenceObject* by měl být IRP–>RequestorMode

C28127

upozornění C28127: Funkce použitá jako rutina přesně neodpovídá očekávanému typu.

C28128

upozornění C28128: Přístup k poli byl proveden přímo. Měla by být provedena rutinou.

C28129

upozornění C28129: Přiřazení operandu, které by mělo být změněno pouze pomocí bitových sad a vymazání

C28131

upozornění C28131: Rutina DriverEntry by měla uložit kopii argumentu, nikoli ukazatel, protože V/V Manager uvolní vyrovnávací paměť.

C28132

upozornění C28132: Velikost ukazatele

C28133

upozornění C28133: IoInitializeTimer je nejlépe volána z AddDevice

C28134

upozornění C28134: Typ značky fondu by měl být integrální, nikoli řetězec nebo ukazatel řetězce

C28135

upozornění C28135: Pokud první argument keWaitForSingleObject je místní proměnná, parametr Mode musí být KernelMode

C28139

upozornění C28139: Argument by měl přesně odpovídat typu

C28141

upozornění C28141: Argument způsobí, že úroveň IRQ bude nastavena pod aktuální hodnotou IRQL a tuto funkci nelze pro tento účel použít.

C28143

upozornění C28143: Rutina volání IoMarkIrpPending musí také vrátit STATUS_PENDING

C28144

upozornění C28144: V rámci rutiny zrušení by v okamžiku ukončení měl být IRQL v Irp-CancelIrql> aktuální IRQL.

C28145

upozornění C28145: Neprůzorná struktura MDL by neměla být změněna ovladačem

C28146

upozornění C28146: Ovladače režimu jádra by měly používat ntstrsafe.h, nikoli strsafe.h. Nalezeno ve zdrojovém souboru

C28147

upozornění C28147: Použití výchozí značky fondu (kdD nebo mdW) pro volání této funkce porazí účel označování fondu.

C28150

upozornění C28150: Funkce způsobí, že úroveň IRQ se nastaví nad maximální přijatelnou hodnotu pro analyzovanou funkci.

C28151

upozornění C28151: Hodnota není právní hodnotou irQL

C28152

upozornění C28152: Návrat z funkce AddDevice-like neočekávaně DO_DEVICE_INITIALIZING

C28153

upozornění C28153: V tomto kontextu nelze vyhodnotit hodnotu IRQL z poznámky.

C28156

upozornění C28156: Skutečná technologie IRQL je nekonzistentní s požadovanou technologií IRQL

C28157

upozornění C28157: IrQL se nikdy neobnovil

C28158

upozornění C28158: Nebyl uložen žádný irQL

C28161

upozornění C28161: Ukončení bez získání práva k použití plovoucího hardwaru

C28162

upozornění C28162: Ukončení při podržení vpravo pro použití hardwaru s plovoucí desetinou čárkou

C28165

upozornění C28165: Ukazatel funkce třídy neodpovídá třídě funkce

C28166

upozornění C28166: Funkce neobnoví irQL na hodnotu, která byla aktuální při zadání funkce a je k tomu nutná.

C28167

upozornění C28167: Funkce změní irQL a neobnoví IRQL před ukončením. Měla by být opatřena poznámkami, aby odrážela změnu nebo by se měla obnovit technologie IRQL.

C28168

upozornění C28168: Funkce dispatch nemá Dispatch_type poznámku odpovídající této položce tabulky odeslání

C28169

upozornění C28169: Funkce dispatch nemá žádné Dispatch_type poznámky

C28170

upozornění C28170: Funkce byla deklarována jako stránkovaná, ale nebyla nalezena PAGED_CODE ani PAGED_CODE_LOCKED

C28171

upozornění C28171: Funkce má více než jednu instanci PAGED_CODE nebo PAGED_CODE_LOCKED

C28172

upozornění C28172: Funkce má PAGED_CODE nebo PAGED_CODE_LOCKED, ale není deklarována jako stránkovaná.

C28173

upozornění C28173: Aktuální funkce se zřejmě nesprávně přizpůsobí fyzické paměti nad 4 GB

C28175

upozornění C28175: Člen struktury by neměl být přístupný ovladačem

C28176

upozornění C28176: Člen struktury by neměl být změněn ovladačem

C28177

upozornění C28177: Funkce je opatřena poznámkami s více než jednou třídou funkce. Všichni kromě jednoho budou ignorováni.

C28260

upozornění C28260: Při analýze vlastnosti uvnitř funkce byla nalezena chyba syntaxe v poznámkách.

C28266

Byla nalezena syntaktická chyba v poznámkách pro vlastnost ve funkci.

C28268

upozornění C28268: Třída funkce ve funkci neodpovídá třídě funkce na typedef použitém zde

C28601

upozornění C28601: Vyhněte se blokování HWND_BROADCAST

C28602

upozornění C28602: Vyhněte se volání SendMessageTimeout s HWND_BROADCAST

C28604

upozornění C28604: Vyhněte se volání SendMessageTimeout s SMTO_ABORTIFHUNG s vypršením časového limitu 0

C28615

upozornění C28615: Při volání _alloca v bloku __try je nutné volat _resetstkoflw v bloku __except(). Nevolejte _resetstkoflw z bloku catch()

C28616

upozornění C28616: Podmínka vícevláknového AV

C28617

upozornění C28617: Nepoužívejte návratovou hodnotu _beginthread(). Místo toho použijte _beginthreadex().

C28623

upozornění C28623: Nepřiřazené přetypování souřadnic GetMessagePos(). Místo LOWORD/HIWORD používejte GET_X_LPARAM/GET_Y_LPARAM.

C28624

upozornění C28624: Žádné volání release() odpovídající přírůstkové refcount z LResultFromObject

C28625

upozornění C28625: Volání funkce použité k vymazání citlivých dat bude optimalizováno pryč

C28636

upozornění C28636: Volání LocalFree na nelokovaný ukazatel získaný z volání GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

upozornění C28637: Volání funkce v globálním inicializátoru je nebezpečné

C28638

upozornění C28638: Zástupný kód zpoždění načtení funkce chybí odpovídající deklaraci

C28639

upozornění C28639: Volání popisovače zavřít s řetězcem

C28640

upozornění C28640: Zástupný kód pro zpoždění načtení funkce by měl být statickou funkcí.

C28644

upozornění C28644: Vrácená hodnota z DPA_InsertPtr není zaškrtnutá

C28645

upozornění C28645: MessageBox byl volána pomocí symbolu zprávy otazníku, který se už nedoporučuje

C28648

upozornění C28648: PulseEvent je nespolehlivá funkce

C28649

upozornění C28649: Automatické nebo globální pole zásobníku nikdy nemají hodnotu NULL

C28650

upozornění C28650: Typ, pro který se používá !0, není považován za případ selhání.

Vrácení hodnoty stavu, například ! PRAVDA není stejná jako vrácení hodnoty stavu, která značí selhání.

C28651

upozornění C28651: Statický inicializátor způsobuje kopírování na stránkách zápisu kvůli ukazatelům členské funkce

C28652

upozornění C28652: Statický inicializátor způsobí kopírování na stránkách zápisu kvůli přetíženým bitových operátorům

C28714

upozornění C28714: Přetypování mezi séanticky odlišné celočíselné typy

C28715

upozornění C28715: Přetypování mezi séanticky odlišné celočíselné typy

C28716

upozornění C28716: Přetypování vložené kompilátorem mezi sémanticky odlišné celočíselné typy

C28717

upozornění C28717: Neplatný typ VARIANT

C28718

upozornění C28718: Nezařazená vyrovnávací paměť

C28719

upozornění C28719: Zakázané použití rozhraní API

C28720

upozornění C28720: Zakázané použití rozhraní API

C28721

upozornění C28721: Zastaralá architektura čítače výkonu

C28722

upozornění C28722: Nezařazená vyrovnávací paměť v deklaraci funkce

C28723

upozornění C28723: Nezařazená vyrovnávací paměť v definici funkce, která neobsahuje žádnou odpovídající deklaraci

C28725

upozornění C28725: Místo tohoto setUnhandledExceptionFilter použijte Watson

C28726

upozornění C28726: Zakázané použití rozhraní API

C28727

upozornění C28727: Zakázané použití rozhraní API

C28728

upozornění C28728: Zakázané použití rozhraní API

C28730

upozornění C28730: Možné přiřazení \0 přímo k ukazateli.

C28735

upozornění C28735: Zakázané použití crimson api

C28736

upozornění C28736: Zakázané použití argumentů rozhraní API

C28740

upozornění C28740: Nepřiřazená nepřiřazená vyrovnávací paměť

C28741

upozornění C28741: Nezařazená vyrovnávací paměť ve funkci

C28742

upozornění C28742: Nezařazená vyrovnávací paměť ve funkci

C28750

upozornění C28750: Zakázané použití lstrlenu a jeho variant

C28751

upozornění C28751: Zakázané použití exAllocatePool a jejích variant

C28752

upozornění C28752: Zakázané použití rozhraní API jádra 32 nebo advapi32

C28753

upozornění C28753: Spoléhání na nedefinované pořadí vyhodnocení parametrů

C30029

upozornění C30029: Volání funkce přidělování paměti, která požaduje spustitelné paměti

C30030

upozornění C30030: Volání funkce přidělování paměti a předání parametru označující spustitelné paměti

C30031

upozornění C30031: Volání funkce přidělování paměti a předání parametru, který označuje spustitelný paměť

C30032

upozornění C30032: Volání funkce přidělování paměti a vynucení požadavku spustitelné paměti pomocí direktivy POOL_NX_OPTOUT

C30033

upozornění C30033: V ovladači zkompilovaném s POOL_NX_OPTINbylo zjištěno přidělení spustitelného souboru . Tento ovladač byl určen k načtení za běhu jiným ovladačem. Ověřte, že ovladač načítání volá ExInitializeDriverRuntime(DrvRtPoolNxOptIn) v jeho DriverEntry.

C30034

upozornění C30034: Předání hodnoty příznaku funkci přidělení, která by mohla způsobit přidělení spustitelné paměti. Ověřte, že funkce přidělování nevyžaduje formu spustitelného nestránkového fondu.

C30035

upozornění C30035: Volání funkce, která musí být provedena z inicializační funkce (například DriverEntry() nebo DllInitialize()). PrEfast nemohl určit, zda bylo volání provedeno z inicializační funkce.