Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 |
|---|---|
upozornění C28101: Modul Ovladače odvodil, že aktuální funkce není správným typem funkce. |
|
upozornění C28110: Ovladače musí chránit stav hardwaru s plovoucí desetinou čárkou. Zobrazit použití plovoucí hodnoty |
|
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í). |
|
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. |
|
upozornění C28120: Funkce není povolena k zavolání na aktuální úrovni IRQ. Aktuální úroveň je příliš nízká. |
|
upozornění C28121: Funkce není povolena k zavolání na aktuální úrovni IRQ. Aktuální úroveň je příliš vysoká. |
|
upozornění C28122: Funkce není povolena na nízké úrovni IRQ. Předchozí volání funkce jsou nekonzistentní s tímto omezením. |
|
upozornění C28123: Funkci nelze volat na vysoké úrovni IRQ. Předchozí volání funkce jsou nekonzistentní s tímto omezením. |
|
upozornění C28124: Volání, které způsobí, že úroveň IRQ bude nastavena pod minimální přijatelnou hodnotu pro analyzovanou funkci. |
|
upozornění C28126: Parametr AccessMode na ObReferenceObject* by měl být IRP–>RequestorMode |
|
upozornění C28127: Funkce použitá jako rutina přesně neodpovídá očekávanému typu. |
|
upozornění C28128: Přístup k poli byl proveden přímo. Měla by být provedena rutinou. |
|
upozornění C28129: Přiřazení operandu, které by mělo být změněno pouze pomocí bitových sad a vymazání |
|
upozornění C28131: Rutina DriverEntry by měla uložit kopii argumentu, nikoli ukazatel, protože V/V Manager uvolní vyrovnávací paměť. |
|
upozornění C28132: Velikost ukazatele |
|
upozornění C28133: IoInitializeTimer je nejlépe volána z AddDevice |
|
upozornění C28134: Typ značky fondu by měl být integrální, nikoli řetězec nebo ukazatel řetězce |
|
upozornění C28135: Pokud první argument keWaitForSingleObject je místní proměnná, parametr Mode musí být KernelMode |
|
upozornění C28139: Argument by měl přesně odpovídat typu |
|
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. |
|
upozornění C28143: Rutina volání IoMarkIrpPending musí také vrátit STATUS_PENDING |
|
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. |
|
upozornění C28145: Neprůzorná struktura MDL by neměla být změněna ovladačem |
|
upozornění C28146: Ovladače režimu jádra by měly používat ntstrsafe.h, nikoli strsafe.h. Nalezeno ve zdrojovém souboru |
|
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. |
|
upozornění C28150: Funkce způsobí, že úroveň IRQ se nastaví nad maximální přijatelnou hodnotu pro analyzovanou funkci. |
|
upozornění C28151: Hodnota není právní hodnotou irQL |
|
upozornění C28152: Návrat z funkce AddDevice-like neočekávaně DO_DEVICE_INITIALIZING |
|
upozornění C28153: V tomto kontextu nelze vyhodnotit hodnotu IRQL z poznámky. |
|
upozornění C28156: Skutečná technologie IRQL je nekonzistentní s požadovanou technologií IRQL |
|
upozornění C28157: IrQL se nikdy neobnovil |
|
upozornění C28158: Nebyl uložen žádný irQL |
|
upozornění C28161: Ukončení bez získání práva k použití plovoucího hardwaru |
|
upozornění C28162: Ukončení při podržení vpravo pro použití hardwaru s plovoucí desetinou čárkou |
|
upozornění C28165: Ukazatel funkce třídy neodpovídá třídě funkce |
|
upozornění C28166: Funkce neobnoví irQL na hodnotu, která byla aktuální při zadání funkce a je k tomu nutná. |
|
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. |
|
upozornění C28168: Funkce dispatch nemá Dispatch_type poznámku odpovídající této položce tabulky odeslání |
|
upozornění C28169: Funkce dispatch nemá žádné Dispatch_type poznámky |
|
upozornění C28170: Funkce byla deklarována jako stránkovaná, ale nebyla nalezena PAGED_CODE ani PAGED_CODE_LOCKED |
|
upozornění C28171: Funkce má více než jednu instanci PAGED_CODE nebo PAGED_CODE_LOCKED |
|
upozornění C28172: Funkce má PAGED_CODE nebo PAGED_CODE_LOCKED, ale není deklarována jako stránkovaná. |
|
upozornění C28173: Aktuální funkce se zřejmě nesprávně přizpůsobí fyzické paměti nad 4 GB |
|
upozornění C28175: Člen struktury by neměl být přístupný ovladačem |
|
upozornění C28176: Člen struktury by neměl být změněn ovladačem |
|
upozornění C28177: Funkce je opatřena poznámkami s více než jednou třídou funkce. Všichni kromě jednoho budou ignorováni. |
|
upozornění C28260: Při analýze vlastnosti uvnitř funkce byla nalezena chyba syntaxe v poznámkách. |
|
Byla nalezena syntaktická chyba v poznámkách pro vlastnost ve funkci. |
|
upozornění C28268: Třída funkce ve funkci neodpovídá třídě funkce na typedef použitém zde |
|
upozornění C28601: Vyhněte se blokování HWND_BROADCAST |
|
upozornění C28602: Vyhněte se volání SendMessageTimeout s HWND_BROADCAST |
|
upozornění C28604: Vyhněte se volání SendMessageTimeout s SMTO_ABORTIFHUNG s vypršením časového limitu 0 |
|
upozornění C28615: Při volání _alloca v bloku __try je nutné volat _resetstkoflw v bloku __except(). Nevolejte _resetstkoflw z bloku catch() |
|
upozornění C28616: Podmínka vícevláknového AV |
|
upozornění C28617: Nepoužívejte návratovou hodnotu _beginthread(). Místo toho použijte _beginthreadex(). |
|
upozornění C28623: Nepřiřazené přetypování souřadnic GetMessagePos(). Místo LOWORD/HIWORD používejte GET_X_LPARAM/GET_Y_LPARAM. |
|
upozornění C28624: Žádné volání release() odpovídající přírůstkové refcount z LResultFromObject |
|
upozornění C28625: Volání funkce použité k vymazání citlivých dat bude optimalizováno pryč |
|
upozornění C28636: Volání LocalFree na nelokovaný ukazatel získaný z volání GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
upozornění C28637: Volání funkce v globálním inicializátoru je nebezpečné |
|
upozornění C28638: Zástupný kód zpoždění načtení funkce chybí odpovídající deklaraci |
|
upozornění C28639: Volání popisovače zavřít s řetězcem |
|
upozornění C28640: Zástupný kód pro zpoždění načtení funkce by měl být statickou funkcí. |
|
upozornění C28644: Vrácená hodnota z DPA_InsertPtr není zaškrtnutá |
|
upozornění C28645: MessageBox byl volána pomocí symbolu zprávy otazníku, který se už nedoporučuje |
|
upozornění C28648: PulseEvent je nespolehlivá funkce |
|
upozornění C28649: Automatické nebo globální pole zásobníku nikdy nemají hodnotu NULL |
|
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í. |
|
upozornění C28651: Statický inicializátor způsobuje kopírování na stránkách zápisu kvůli ukazatelům členské funkce |
|
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 |
|
upozornění C28714: Přetypování mezi séanticky odlišné celočíselné typy |
|
upozornění C28715: Přetypování mezi séanticky odlišné celočíselné typy |
|
upozornění C28716: Přetypování vložené kompilátorem mezi sémanticky odlišné celočíselné typy |
|
upozornění C28717: Neplatný typ VARIANT |
|
upozornění C28718: Nezařazená vyrovnávací paměť |
|
upozornění C28719: Zakázané použití rozhraní API |
|
upozornění C28720: Zakázané použití rozhraní API |
|
upozornění C28721: Zastaralá architektura čítače výkonu |
|
upozornění C28722: Nezařazená vyrovnávací paměť v deklaraci funkce |
|
upozornění C28723: Nezařazená vyrovnávací paměť v definici funkce, která neobsahuje žádnou odpovídající deklaraci |
|
upozornění C28725: Místo tohoto setUnhandledExceptionFilter použijte Watson |
|
upozornění C28726: Zakázané použití rozhraní API |
|
upozornění C28727: Zakázané použití rozhraní API |
|
upozornění C28728: Zakázané použití rozhraní API |
|
upozornění C28730: Možné přiřazení \0 přímo k ukazateli. |
|
upozornění C28735: Zakázané použití crimson api |
|
upozornění C28736: Zakázané použití argumentů rozhraní API |
|
upozornění C28740: Nepřiřazená nepřiřazená vyrovnávací paměť |
|
upozornění C28741: Nezařazená vyrovnávací paměť ve funkci |
|
upozornění C28742: Nezařazená vyrovnávací paměť ve funkci |
|
upozornění C28750: Zakázané použití lstrlenu a jeho variant |
|
upozornění C28751: Zakázané použití exAllocatePool a jejích variant |
|
upozornění C28752: Zakázané použití rozhraní API jádra 32 nebo advapi32 |
|
upozornění C28753: Spoléhání na nedefinované pořadí vyhodnocení parametrů |
|
upozornění C30029: Volání funkce přidělování paměti, která požaduje spustitelné paměti |
|
upozornění C30030: Volání funkce přidělování paměti a předání parametru označující spustitelné paměti |
|
upozornění C30031: Volání funkce přidělování paměti a předání parametru, který označuje spustitelný paměť |
|
upozornění C30032: Volání funkce přidělování paměti a vynucení požadavku spustitelné paměti pomocí direktivy POOL_NX_OPTOUT |
|
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. |
|
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. |
|
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. |