Annotations à virgule flottante pour les pilotes

Les annotations à virgule flottante peuvent aider l’outil d’analyse du code à détecter l’utilisation de virgule flottante dans le code en mode noyau et peuvent signaler des erreurs si l’état à virgule flottante n’est pas correctement protégé. Les règles à virgule flottante sont vérifiées uniquement pour le code en mode noyau.

Pour certaines familles de processeurs, en particulier les processeurs x86, l’utilisation d’opérations à virgule flottante à partir du code en mode noyau ne doit être effectuée que dans l’étendue des fonctions qui enregistrent et restaurent l’état à virgule flottante. Les violations de cette règle peuvent être particulièrement difficiles à trouver, car elles ne provoquent que des problèmes sporadiques au moment de l’exécution (mais ces problèmes peuvent être très graves). Avec l’utilisation appropriée des annotations, les outils d’analyse du code sont efficaces pour détecter l’utilisation de virgule flottante dans le code en mode noyau et signaler une erreur si l’état à virgule flottante n’est pas correctement protégé. Les règles à virgule flottante sont vérifiées uniquement pour le code en mode noyau.

Ajoutez les annotations suivantes aux paramètres de fonction pour indiquer ce qu’ils font avec l’état à virgule flottante.

Annotation à virgule flottante Description
_Kernel_float_saved_ La fonction annotée enregistre l’état matériel à virgule flottante lorsque la fonction retourne correctement.
_Kernel_float_restored_ La fonction annotée restaure l’état matériel à virgule flottante lorsque la fonction retourne correctement.
_Kernel_float_used_ Si la fonction est appelée en toute sécurité par une fonction appelante, vous pouvez utiliser l’annotation _Kernel_float_used_ pour supprimer le signalement des erreurs. Toutefois, si la fonction appelante n’est pas également annotée avec _Kernel_float_used_ ou si l’appel de fonction ne se produit pas entre les fonctions annotées avec _Kernel_float_saved_ et _Kernel_float_restored_, respectivement, les outils d’analyse du code signalent une erreur.

Ces annotations sont déjà appliquées à l’état keSaveFloatingPoint et aux fonctions système KeRestoreFloatingPointState, en plus des annotations permettant d’acquérir et de libérer des ressources afin d’éviter les fuites. Les fonctions EngXxx similaires sont également annotées de cette façon. Toutefois, les fonctions qui encapsulent ces fonctions doivent également utiliser ces annotations.

Si la fonction dans son ensemble est appelée en toute sécurité par une fonction appelante, la fonction peut être annotée avec _Kernel_float_used_ annotation. Cela supprime l’avertissement et entraîne également la confirmation par les outils d’analyse du code que l’appelant utilise la fonction en toute sécurité. Des niveaux supplémentaires de _Kernel_float_used_ peuvent être ajoutés en fonction des besoins. L’annotation _Kernel_float_used_ est automatiquement fournie par les outils d’analyse du code lorsque le résultat de la fonction ou l’un des paramètres de la fonction est un type à virgule flottante, mais il n’est pas préjudiciable de fournir l’annotation explicitement.

Par exemple, l’annotation _Kernel_float_saved_ indique que l’état à virgule flottante est stocké dans le paramètre FloatingState de la fonction système 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  
    )  

Dans l’exemple suivant, l’annotation _Kernel_float_used_ supprime les avertissements concernant l’utilisation de l’état à virgule flottante. L’annotation amène également les outils d’analyse du code à confirmer que tous les appels à MyDoesFloatingPoint se produisent dans un contexte à virgule flottante sécurisé.

_Kernel_float_used_
void
    MyDoesFloatingPoint(arguments);

Annotations SAL 2.0 pour les pilotes Windows