驅動程式的浮點註釋
浮點註釋可協助程式代碼分析工具偵測核心模式程序代碼中的浮點使用,而且如果浮點狀態未正確保護,可以報告錯誤。 只會檢查核心模式程式代碼的浮點規則。
對於某些處理器系列,特別是 x86 處理器,使用核心模式程式代碼中的浮點運算,必須只在儲存和還原浮點狀態的函式範圍內完成。 此規則的違規可能特別難以找到,因為它們只會在運行時間偶爾造成問題 (,但這些問題可能非常嚴重) 。 使用適當的註釋時,程式代碼分析工具在偵測核心模式程序代碼中的浮點使用時有效,並在浮點狀態未正確保護時回報錯誤。 只會檢查核心模式程式代碼的浮點規則。
將下列註釋新增至函式參數,以指出它們使用浮點狀態執行的動作。
浮點註釋 | Description |
---|---|
_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);