共用方式為


驅動程式的浮點註釋

浮點批注可協助程序代碼分析工具偵測在內核模式程式代碼中使用浮點,而且如果浮點狀態未受到適當保護,可以報告錯誤。 只會檢查核心模式程式碼的浮點規則。

對於某些處理器系列,特別是 x86 處理器,使用核心模式程式代碼中的浮點運算,必須只在儲存和還原浮點狀態的函式範圍內完成。 違反此規則可能特別難以發現,因為這些問題會偶爾在執行時發生(而這些問題可能會非常嚴重)。 使用適當的註釋時,程式碼分析工具能有效偵測到核心模式代碼中浮點數的使用,如果浮點數的狀態沒有受到適當保護,便會報告錯誤。 只會檢查核心模式程式代碼的浮點規則。

將下列批註新增至函式參數,以指出它們對浮點狀態執行的動作。

浮點標註 說明
_Kernel_float_saved_ 批註函式會在函式成功傳回時儲存浮點硬體狀態。
核心浮點數已恢復 批註函式會在函式成功傳回時還原浮點硬體狀態。
_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 註釋