다음을 통해 공유


드라이버에 대한 부동 소수점 주석

부동 소수점 주석은 코드 분석 도구가 커널 모드 코드에서 부동 소수점 사용을 감지하는 데 도움이 되며 부동 소수점 상태가 제대로 보호되지 않은 경우 오류를 보고할 수 있습니다. 부동 소수점 규칙은 커널 모드 코드에 대해서만 검사됩니다.

일부 프로세서 제품군, 특히 x86 프로세서의 경우 커널 모드 코드 내에서 부동 소수점 연산을 사용하는 작업은 부동 소수점 상태를 저장하고 복원하는 함수의 scope 내에서만 수행해야 합니다. 이 규칙의 위반은 런타임에 산발적으로 문제를 일으키기 때문에 특히 찾기 어려울 수 있습니다(그러나 이러한 문제는 매우 심각할 수 있습니다). 주석을 적절하게 사용하면 코드 분석 도구가 커널 모드 코드에서 부동 소수점 사용을 감지하고 부동 소수점 상태가 제대로 보호되지 않은 경우 오류를 보고하는 데 효과적입니다. 부동 소수점 규칙은 커널 모드 코드에 대해서만 검사됩니다.

함수 매개 변수에 다음 주석을 추가하여 부동 소수점 상태로 수행하는 작업을 나타냅니다.

부동 소수점 주석 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);

Windows 드라이버용 SAL 2.0 주석