Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As anotações de ponto flutuante podem ajudar a ferramenta de análise de código a detetar o uso de ponto flutuante no código de 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 em modo kernel.
Para algumas famílias de processadores, particularmente processadores x86, o uso de operações de ponto flutuante de dentro do código de modo kernel deve ser feito apenas dentro do escopo de funções que salvam e restauram o estado de ponto flutuante. As violações desta regra podem ser particularmente difíceis de encontrar porque só esporadicamente causarão problemas 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 em detetar o uso de ponto flutuante no código de modo kernel e relatar um erro se o estado de ponto flutuante não estiver devidamente protegido. As regras de ponto flutuante são verificadas apenas para o código do modo kernel.
Adicione as seguintes anotações 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 do 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 chamadora, pode usar a anotação _Kernel_float_used_ para impedir a notificação de erros. No entanto, se a função de chamada não for também anotada com _Kernel_float_used_ ou se 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 às funções do estado KeSaveFloatingPoint e do sistema KeRestoreFloatingPointState, além de anotações para aquisição e liberação de recursos para evitar vazamentos. As funções EngXxx semelhantes também são anotadas desta 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 chamadora, a função pode ser anotada com a anotação _Kernel_float_used_. 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 faz mal 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 quaisquer chamadas para MyDoesFloatingPoint ocorrem em um contexto seguro de ponto flutuante.
_Kernel_float_used_
void
MyDoesFloatingPoint(arguments);