驱动程序的浮点注释

浮点注释可帮助代码分析工具检测内核模式代码中浮点的使用情况,如果浮点状态未得到适当保护,则报告错误。 仅检查内核模式代码的浮点规则。

对于某些处理器系列,尤其是 x86 处理器,只能在保存和还原浮点状态的函数范围内使用内核模式代码中的浮点操作。 违反此规则的情况可能特别难以找到,因为它们只会偶尔在运行时 (导致问题,但这些问题可能非常严重,) 。 正确使用注释后,代码分析工具可以有效地检测内核模式代码中浮点的使用情况,并在浮点状态未得到适当保护时报告错误。 仅检查内核模式代码的浮点规则。

将以下注释添加到函数参数,以指示它们对浮点状态执行的操作。

浮点批注 说明
_Kernel_float_saved_ 批注函数在函数成功返回时保存浮点硬件状态。
_Kernel_float_restored_ 批注函数在函数成功返回时还原浮点硬件状态。
_Kernel_float_used_ 如果调用函数安全地调用函数,则可以使用_Kernel_float_used_注释来禁止报告错误。 但是,如果调用函数未同时使用 _Kernel_float_used_ 进行批注,或者函数调用在分别使用 _Kernel_float_saved_ 和 _Kernel_float_restored_ 进行批注的函数之间没有发生,则代码分析工具将报告错误。

除了用于获取和释放资源以防止泄漏的注释外,这些注释已应用于 KeSaveFloatingPoint 状态和 KeRestoreFloatingPointState 系统函数。 类似的 EngXxx 函数也以这种方式进行批注。 但是,包装这些函数的函数也应该使用这些注释。

如果某个调用函数安全地调用整个函数,则可以使用_Kernel_float_used_注释对函数进行批注。 这会取消警告,并导致代码分析工具确认调用方是否安全地使用 函数。 可以根据需要添加其他级别的_Kernel_float_used_。 当函数结果或函数的参数之一是浮点类型时,代码分析工具会自动提供_Kernel_float_used_注释,但显式提供批注不会造成损害。

例如,_Kernel_float_saved_注释指示浮点状态存储在 KeSaveFloatingPointState 系统函数的 FloatingState 参数中。

_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  
    )  

在以下示例中,_Kernel_float_used_注释禁止显示有关使用浮点状态的警告。 注释还会导致代码分析工具确认对 MyDoesFloatingPoint 的任何调用都发生在安全的浮点上下文中。

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

Windows 驱动程序的 SAL 2.0 注释