Sdílet prostřednictvím


Anotace s plovoucí desetinnou čárkou pro ovladače

Poznámky k pohyblivé desetinné čárce mohou pomoci nástroji pro analýzu kódu rozpoznat použití pohyblivé desetinné čárky v kódě jádra a hlásit chyby, pokud není stav pohyblivé desetinné čárky správně chráněn. Pravidla pro plovoucí desetinnou čárku se kontrolují pouze pro kód v jádrovém režimu.

U některých rodin procesorů, zejména procesorů x86, musí být použití operací s plovoucí desetinou čárkou z kódu v režimu jádra provedeno pouze v rámci funkcí, které ukládají a obnovují stav s plovoucí desetinou čárkou. Porušení tohoto pravidla může být obzvláště obtížné najít, protože způsobí pouze sporadicky problémy za běhu (ale tyto problémy mohou být velmi závažné). Při správném použití poznámek jsou nástroje pro analýzu kódu efektivní při zjišťování použití plovoucí řádové čárky v kódu v režimu jádra a hlášení chyby, pokud stav plovoucí řádové čárky není řádně chráněn. Pravidla pro číselné operace s plovoucí desetinnou čárkou se kontrolují pouze pro kód v režimu kernelu.

Do parametrů funkce přidejte následující anotace, které označují, jak pracují se stavem v hodnotách s plovoucí desetinnou čárkou.

Anotace s pohyblivou řádovou čárkou Popis
_Kernel_float_saved_ Anotovaná funkce uloží stav hardwaru pro plovoucí bod, když je funkce úspěšně dokončena.
_Kernel_float_restored_ Funkce s poznámkami obnoví stav hardwaru s plovoucí desetinnou čárkou, když se funkce úspěšně vrátí.
_Použito_jádro_float_ Jestliže ji volající funkce volá bezpečně, můžete k potlačení hlášení chyb použít anotaci _Kernel_float_used_. Pokud však volající funkce není také opatřena poznámkami _Kernel_float_used_ nebo k volání funkce nedojde mezi funkcemi anotovanými _Kernel_float_saved_ a _Kernel_float_restored_, nástroje pro analýzu kódu nahlásí chybu.

Tyto poznámky jsou již použity pro stav KeSaveFloatingPoint a systémové funkce KeRestoreFloatingPointState, kromě poznámek pro získání a uvolnění prostředků, aby se zabránilo únikům. Podobné funkce EngXxx jsou tímto způsobem také opatřeny poznámkami. Funkce, které tyto funkce zabalí, by ale měly používat i tyto poznámky.

Pokud je funkce jako celek bezpečně volána nějakou volající funkcí, může být funkce opatřena _Kernel_float_used_ poznámkou. Tím se potlačí upozornění a také způsobí, že nástroje pro analýzu kódu potvrdí, že volající funkci bezpečně používá. Podle potřeby je možné přidat další úrovně _Kernel_float_used_. _Kernel_float_used_ anotace je automaticky poskytována nástroji pro analýzu kódu, pokud je výsledkem funkce nebo jedním z parametrů funkce typ s plovoucí desetinnou čárkou, ale není na škodu tuto anotaci explicitně zadat.

Například anotace _Kernel_float_saved_ označuje, že plovoucí desetinný stav je uložen v parametru FloatingState systémové funkce KeSaveFloatingPointState.

_Must_inspect_result_  
_IRQL_requires_max_(DISPATCH_LEVEL)  
__drv_valueIs(<0;==0)  
_When_(return==0, _Kernel_float_saved_)  
_At_(*FloatingState, _Kernel_requires_resource_not_held_(FloatState) _When_(return==0, _Kernel_acquires_resource_(FloatState)))  
__forceinline  
NTSTATUS  
KeSaveFloatingPointState (  
    _Out_ PVOID FloatingState  
    )  

V následujícím příkladu poznámka _Kernel_float_used_ potlačí upozornění týkající se použití stavu plovoucí desetinné čárky. Anotace také způsobí, že nástroje pro analýzu kódu potvrdí, že všechna volání MyDoesFloatingPoint probíhají v bezpečném kontextu s plovoucí desetinnou čárkou.

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

poznámky SAL 2.0 pro ovladače systému Windows