次の方法で共有


ドライバーの浮動小数点注釈

浮動小数点注釈は、コード分析ツールがカーネル モード コードでの浮動小数点の使用を検出するのに役立ち、浮動小数点状態が適切に保護されていない場合はエラーを報告できます。 浮動小数点ルールは、カーネル モード コードに対してのみチェックされます。

一部のプロセッサ ファミリ (特に 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 注釈