Anotações de ponto flutuante para drivers
Anotações de ponto flutuante podem ajudar a ferramenta de análise de código a detectar o uso de ponto flutuante no código do modo kernel e podem relatar erros se o estado de ponto flutuante não estiver protegido corretamente. As regras de ponto flutuante são verificadas apenas para o código do modo kernel.
Para algumas famílias de processadores, especialmente processadores x86, o uso de operações de ponto flutuante de dentro do código do modo kernel deve ser feito somente dentro do escopo de funções que salvam e restauram o estado de ponto flutuante. As violações dessa regra podem ser particularmente difíceis de encontrar porque só causarão problemas esporadicamente em tempo de execução (mas esses problemas podem ser muito graves). Com o uso adequado de anotações, as ferramentas de análise de código são eficazes para detectar o uso de ponto flutuante no código do modo kernel e relatar um erro se o estado de ponto flutuante não estiver protegido corretamente. As regras de ponto flutuante são verificadas apenas para o código do modo kernel.
Adicione as anotações a seguir aos parâmetros de função para indicar o que eles fazem com o estado de ponto flutuante.
Anotação de ponto flutuante | Descrição |
---|---|
_Kernel_float_saved_ | A função anotada salva o estado de hardware de ponto flutuante quando a função retorna com êxito. |
_Kernel_float_restored_ | A função anotada restaura o estado de hardware de ponto flutuante quando a função retorna com êxito. |
_Kernel_float_used_ | Se a função for chamada com segurança por uma função de chamada, você poderá usar a anotação _Kernel_float_used_ para suprimir o relatório de erros. No entanto, se a função de chamada também não for anotada com _Kernel_float_used_ ou a chamada de função não ocorrer entre funções anotadas com _Kernel_float_saved_ e _Kernel_float_restored_, respectivamente, as ferramentas de análise de código relatarão um erro. |
Essas anotações já são aplicadas ao estado KeSaveFloatingPoint e às funções do sistema KeRestoreFloatingPointState, além de anotações para adquirir e liberar recursos para evitar vazamentos. As funções EngXxx semelhantes também são anotadas dessa forma. No entanto, as funções que encapsulam essas funções também devem usar essas anotações.
Se a função como um todo for chamada com segurança por alguma função de chamada, a função poderá ser anotada com _Kernel_float_used_ anotação. Isso suprime o aviso e também faz com que as ferramentas de análise de código confirmem que o chamador está usando a função com segurança. Níveis adicionais de _Kernel_float_used_ podem ser adicionados conforme necessário. A anotação _Kernel_float_used_ é fornecida automaticamente pelas ferramentas de análise de código quando o resultado da função ou um dos parâmetros da função é um tipo de ponto flutuante, mas não prejudica fornecer a anotação explicitamente.
Por exemplo, a anotação _Kernel_float_saved_ indica que o estado de ponto flutuante é armazenado no parâmetro FloatingState da função de sistema KeSaveFloatingPointState.
_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
)
No exemplo a seguir, a anotação _Kernel_float_used_ suprime avisos sobre o uso do estado de ponto flutuante. A anotação também faz com que as ferramentas de análise de código confirmem que todas as chamadas para MyDoesFloatingPoint ocorrem em um contexto de ponto flutuante seguro.
_Kernel_float_used_
void
MyDoesFloatingPoint(arguments);