Anotaciones de punto flotante para controladores

Las anotaciones de punto flotante pueden ayudar a la herramienta de análisis de código a detectar el uso de punto flotante en código en modo kernel y pueden notificar errores si el estado de punto flotante no está protegido correctamente. Las reglas de punto flotante solo se comprueban para el código en modo kernel.

Para algunas familias de procesadores, especialmente los procesadores x86, el uso de operaciones de punto flotante desde el código en modo kernel solo debe realizarse dentro del ámbito de las funciones que guardan y restauran el estado de punto flotante. Las infracciones de esta regla pueden ser especialmente difíciles de encontrar porque solo causarán problemas esporádicamente en tiempo de ejecución (pero estos problemas pueden ser muy graves). Con el uso adecuado de anotaciones, las herramientas de análisis de código son eficaces para detectar el uso de punto flotante en el código en modo kernel e informar de un error si el estado de punto flotante no está protegido correctamente. Las reglas de punto flotante solo se comprueban para el código en modo kernel.

Agregue las siguientes anotaciones a los parámetros de función para indicar lo que hacen con el estado de punto flotante.

Anotación de punto flotante Descripción
_Kernel_float_saved_ La función anotada guarda el estado de hardware de punto flotante cuando la función vuelve correctamente.
_Kernel_float_restored_ La función anotada restaura el estado de hardware de punto flotante cuando la función devuelve correctamente.
_Kernel_float_used_ Si una función de llamada llama a la función de forma segura, puede usar la anotación _Kernel_float_used_ para suprimir los informes de errores. Sin embargo, si la función de llamada no se anota también con _Kernel_float_used_ o la llamada de función no se produce entre funciones anotadas con _Kernel_float_saved_ y _Kernel_float_restored_, respectivamente, las herramientas de análisis de código notificarán un error.

Estas anotaciones ya se aplican al estado KeSaveFloatingPoint y a las funciones del sistema KeRestoreFloatingPointState, además de anotaciones para adquirir y liberar recursos para evitar pérdidas. Las funciones EngXxx similares también se anotan de esta manera. Sin embargo, las funciones que encapsulan estas funciones también deben usar estas anotaciones.

Si se llama a la función como un todo de forma segura mediante alguna función de llamada, la función se puede anotar con _Kernel_float_used_ anotación. Esto suprime la advertencia y también hace que las herramientas de análisis de código confirmen que el autor de la llamada usa la función de forma segura. Se pueden agregar niveles adicionales de _Kernel_float_used_ según sea necesario. Las herramientas de análisis de código proporcionan automáticamente la anotación _Kernel_float_used_ cuando el resultado de la función o uno de los parámetros de la función es un tipo de punto flotante, pero no resulta afectado proporcionar la anotación explícitamente.

Por ejemplo, la anotación _Kernel_float_saved_ indica que el estado de punto flotante se almacena en el parámetro FloatingState de la función del sistema 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  
    )  

En el ejemplo siguiente, la anotación _Kernel_float_used_ suprime las advertencias sobre el uso del estado de punto flotante. La anotación también hace que las herramientas de análisis de código confirmen que las llamadas a MyDoesFloatingPoint se producen en un contexto de punto flotante seguro.

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

Anotaciones SAL 2.0 para controladores de Windows