Annotation de paramètres de fonction et valeurs de retour
Cet article décrit les utilisations classiques des annotations pour les paramètre-scalaires de fonction simple, et les pointeurs vers des structures et des classes et la plupart des types de mémoires tampons.Cet article indique également les modèles d'utilisation communs pour les annotations.Pour les annotations supplémentaires qui sont liées aux fonctions, consultez l' Annotation du comportement d'une fonction
Paramètres des pointeurs
Pour les annotations dans le tableau suivant, lorsqu'un paramètre de type pointeur est annoté, l'analyseur signale une erreur si le pointeur est null.Cela s'applique aux pointeurs et tout élément de données vers lequel il pointe.
Annotation |
Description |
---|---|
_In_ |
Annote les paramètres d'entrée qui sont scalaires, les structures, les pointeurs vers les structures et similaire.Explicitement, cela peut être utilisé sur les amplitudes scalaires simples.Le paramètre doit être valide à l'état préalable et ne sera pas modifié. |
_Out_ |
L'annotation de paramètres qui sont des scalaires, des structures, des pointeurs vers des structures et similaires. N'appliquez pas cette opération à un objet qui ne peut pas retourner un valeur - pour l'exemple, une variable scalaire qui est passé par valeur.Le paramètre ne doit pas être valide à l'état préalable, mais doit être valide dans l'état d'après. |
_Inout_ |
Annote un paramètre qui sera modifié par la fonction.Il suppose qu'il doit être valide à l'état préalable et après le rapport, mais a différentes valeurs avant et après l'appel.Doit s'appliquer à une valeur modifiable. |
_In_z_ |
Un pointeur vers une chaîne terminée par le caractère NULL qui est utilisée comme entrée.La chaîne doit être valide à l'état préalable.Les variantes de PSTR, qui possèdent déjà des annotations correctes, sont préférées. |
_Inout_z_ |
Un pointeur vers un tableau de caractères se terminant par null qui sera modifié.Il doit être valide avant et après le supposé appel, mais la valeur change.La marque de fin null peut être déplacée, mais uniquement les éléments jusqu'à la marque de fin null d'origine sont accessibles. |
_In_reads_(s) _In_reads_bytes_(s) |
Un pointeur vers un tableau, qui est indiquée par la fonction.Le tableau est d'une taille de s éléments, qui doivent être valides. Le variant _bytes_ donne la taille en octets au lieu des éléments.Utilisez ce paramètre lorsque la taille ne peut pas être exprimée comme éléments.Par exemple, la chaîne de caractère char voudra utiliser le variant _bytes_ uniquement si une fonction similaire qui utilise wchar_t le désire. |
_In_reads_z_(s) |
Un pointeur vers un tableau qui se termine par null et qui a une taille connue.Les éléments vont jusqu'à Terminator- null ou jusqu'à s s'il n'existe aucun null Terminatorvalides à l'état préalable.Si la taille est connue en octets, évaluez s par la taille d'élément. |
_In_reads_or_z_(s) |
Un pointeur vres un tableau qui se termine par NULL ou a une taille connue, voire les deux.Les éléments vont jusqu'à Terminator- null ou jusqu'à s s'il n'existe aucun null Terminatorvalides à l'état préalable.Si la taille est connue en octets, évaluez s par la taille d'élément.(utilisé pour la famille strn. |
_Out_writes_(s) _Out_writes_bytes_(s) |
Pointeur vers un tableau d'éléments s (resp.octets) qui sont écrits par la fonction.Les éléments de tableau ne doivent pas être valides à l'état préalable, et le nombre d'éléments valides de l'état d'après n'est pas spécifié.S'il existe des annotations sur le type paramètre, elles sont appliquées à l'état d'après.Par exemple, prenons le code suivant.
Dans cet exemple, l'appelant fournit une mémoire tampon des éléments size pour p1.MyStringCopy rend certains de ces éléments valides.Plus important encore, l'annotation _Null_terminated_ sur PWSTR signifie que p1 se termine par null dans l'état d'après.De cette manière, le nombre d'éléments valides est encore bien défini, mais un nombre spécifique de l'élément n'est pas obligatoire. Le variant _bytes_ donne la taille en octets au lieu des éléments.Utilisez ce paramètre lorsque la taille ne peut pas être exprimée comme éléments.Par exemple, la chaîne de caractère char voudra utiliser le variant _bytes_ uniquement si une fonction similaire qui utilise wchar_t le désire. |
_Out_writes_z_(s) |
Pointeur vers un tableau d'éléments s.Les éléments ne doivent pas être valides à l'état préalable.Dans le rapport, les éléments qui traversent la terminaison NULL - qui doit l'être actuellement - doivent être valides.Si la taille est connue en octets, évaluez s par la taille d'élément. |
_Inout_updates_(s) _Inout_updates_bytes_(s) |
Un pointeur vers un tableau, qui est à la fois indiquée et écrite dans la fonction.Il s'agit des éléments de taille s, et valide au préalable état et après le rapport. Le variant _bytes_ donne la taille en octets au lieu des éléments.Utilisez ce paramètre lorsque la taille ne peut pas être exprimée comme éléments.Par exemple, la chaîne de caractère char voudra utiliser le variant _bytes_ uniquement si une fonction similaire qui utilise wchar_t le désire. |
_Inout_updates_z_(s) |
Un pointeur vers un tableau qui se termine par null et qui a une taille connue.Les éléments traverse la terminaison NULL - qui doit l'être actuellement - doivent être valides au préalable et après le rapport.La valeur au niveau du rapport est présumée être différente de la valeur de l'état préalable ; cela inclut l'emplacement de la marque de fin null.Si la taille est connue en octets, évaluez s par la taille d'élément. |
_Out_writes_to_(s,c) _Out_writes_bytes_to_(s,c) _Out_writes_all_(s) _Out_writes_bytes_all_(s) |
Pointeur vers un tableau d'éléments s.Les éléments ne doivent pas être valides à l'état préalable.Dans le rapport, les éléments vont jusqu'au c- élément qui doit être valide.Si la taille est connue en octets, redimmensionnez s et c par la taille d'élément ou utilisez le variant _bytes_ , qui est définie comme suit :
En d'autres termes, chaque élément existant dans la mémoire tampon jusqu'à s dans l'état préalable est valide au niveau du rapport.Par exemple :
|
_Inout_updates_to_(s,c) _Inout_updates_bytes_to_(s,c) |
Un pointeur sur un tableau, qui est à la fois lu et écrit par la fonction.Il s'agit des éléments de taille s, qui doivent être valides au préalable, et les éléments c doivent être valides après. Le variant _bytes_ donne la taille en octets au lieu des éléments.Utilisez ce paramètre lorsque la taille ne peut pas être exprimée comme éléments.Par exemple, la chaîne de caractère char voudra utiliser le variant _bytes_ uniquement si une fonction similaire qui utilise wchar_t le désire. |
_Inout_updates_all_(s) _Inout_updates_bytes_all_(s) |
Un pointeur vers un tableau, qui est à la fois lu et écrit par la fonction de la tailel des éléments s.Défini comme équivalent à :
En d'autres termes, chaque élément qui existe dans la mémoire tampon jusqu'à s dans l'étar préalable est valide dans l'état préalable et dans l'état d'après. Le variant _bytes_ donne la taille en octets au lieu des éléments.Utilisez ce paramètre lorsque la taille ne peut pas être exprimée comme éléments.Par exemple, la chaîne de caractère char voudra utiliser le variant _bytes_ uniquement si une fonction similaire qui utilise wchar_t le désire. |
_In_reads_to_ptr_(p) |
Un pointeur vers un tableau pour laquelle l'expression p – _Curr_ (autrement dit, p moins _Curr_) est défini par la norme de langue.Les éléments avant p doivent être valides à l'état préalable. |
_In_reads_to_ptr_z_(p) |
Un pointeur vers un tableau se terminant par null pour laquelle l'expression p – _Curr_ (autrement dit, p moins _Curr_) est défini par la norme de langage standard.Les éléments avant p doivent être valides à l'état préalable. |
_Out_writes_to_ptr_(p) |
Un pointeur vers un tableau pour laquelle l'expression p – _Curr_ (autrement dit, p moins _Curr_) est défini par la norme de langue.Les éléments avant p ne doivent pas être valides dans l'état préalable et doivent être valides après dans le rapport. |
_Out_writes_to_ptr_z_(p) |
Un pointeur vers un tableau se terminant par null pour laquelle l'expression p – _Curr_ (autrement dit, p moins _Curr_) est défini par la norme de langage standard.Les éléments avant p ne doivent pas être valides dans l'état préalable et doivent être valides après dans le rapport. |
Paramètres facultatifs de pointeur
Lorsqu'une annotation de paramètre de type inclut _opt_, elle indique que le paramètre peut être null.Sinon, l'annotation exécute les mêmes que la version qui n'inclut pas _opt_.Voici une liste des variantes _opt_ des annotations de paramètre de pointeur :
_In_opt_ _Out_opt_ _Inout_opt_ _In_opt_z_ _Inout_opt_z_ _In_reads_opt_ _In_reads_bytes_opt_ _In_reads_opt_z_ |
_Out_writes_opt_ _Out_writes_opt_z_ _Inout_updates_opt_ _Inout_updates_bytes_opt_ _Inout_updates_opt_z_ _Out_writes_to_opt_ _Out_writes_bytes_to_opt_ _Out_writes_all_opt_ _Out_writes_bytes_all_opt_ |
_Inout_updates_to_opt_ _Inout_updates_bytes_to_opt_ _Inout_updates_all_opt_ _Inout_updates_bytes_all_opt_ _In_reads_to_ptr_opt_ _In_reads_to_ptr_opt_z_ _Out_writes_to_ptr_opt_ _Out_writes_to_ptr_opt_z_ |
Paramètres de pointeurs de type de sortie
Les paramètres de type de sortie requièrent la notation spéciale pour lever l'ambiguïté du null-ness sur le paramètre et l'emplacement pointé.
Annotation |
Description |
---|---|
_Outptr_ |
Le paramètre ne peut pas être null, et dans le rapport l'emplacement du pointeur ne peut pas être null et doit être valide. |
_Outptr_opt_ |
Le paramètre peut être NULL, mais dans le rapport, l'emplacement du pointeir ne peut pas ête NULL et doit être valide. |
_Outptr_result_maybenull_ |
Le paramètre ne peut pas être null, et dans le rapport l'emplacement du pointeur peut être null. |
_Outptr_opt_result_maybenull_ |
Le paramètre peut être NULL, et dans le rapport l'emplacement du pointeur peut être null. |
Dans le tableau suivant, les sous-chaînes supplémentaires sont insérées dans le nom de l'annotation pour davantage qualifier la signification de l'annotation.Les différentes sous-chaînes sont _z, _COM_, _buffer_, _bytebuffer_, et _to_.
Important
Si l'interface que vous annotez est COM, utilisez la forme COM de ces annotations.N'utilisez pas les annotations de type COM avec un autre type interface.
Annotation |
Description |
---|---|
_Outptr_result_z_ _Outptr_opt_result_z_ _Outptr_result_maybenull_z_ _Ouptr_opt_result_maybenull_z_ |
Le pointeur a retourné l'annotation d' _Null_terminated_ . |
_COM_Outptr_ _COM_Outptr_opt_ _COM_Outptr_result_maybenull_ _COM_Outptr_opt_result_maybenull_ |
Le pointeur a retourné la sémantique de COM, et distribue donc une condition _On_failure_ indiquant que le pointeur retourné est null. |
_Outptr_result_buffer_(s) _Outptr_result_bytebuffer_(s) _Outptr_opt_result_buffer_(s) _Outptr_opt_result_bytebuffer_(s) |
Les pointeurs retournés pointent vers une mémoire tampon valide d'éléments ou d'octets d'une taille s. |
_Outptr_result_buffer_to_(s, c) _Outptr_result_bytebuffer_to_(s, c) _Outptr_opt_result_buffer_to_(s,c) _Outptr_opt_result_bytebuffer_to_(s,c) |
Les pointeurs retournés pointent vers une mémoire tampon d'éléments ou d'octets d'une taille s, dont le premier c est valide. |
Certaines conventions d'interface présument que des paramètres de sortie sont annulées en cas de échec.À l'exception du code COM, les formes dans le tableau suivant sont préférées.Pour le code COM, utilisez les formulaires correspondants COM répertoriées dans la section précédente.
Annotation |
Description |
---|---|
_Result_nullonfailure_ |
Modifier d'autres annotations.Le résultat a la valeur null si la fonction échoue. |
_Result_zeroonfailure_ |
Modifier d'autres annotations.Le résultat est fixé à zéro si la fonction échoue. |
_Outptr_result_nullonfailure_ |
Les pointeurs retournés pointent vers une mémoire tampon valide si la fonction réussit, ou NULL si la fonction échoue.Cette annotation est pour un paramètre non facultative. |
_Outptr_opt_result_nullonfailure_ |
Les pointeurs retournés pointent vers une mémoire tampon valide si la fonction réussit, ou NULL si la fonction échoue.Cette annotation est pour les paramètres optionnels. |
_Outref_result_nullonfailure_ |
Les pointeurs retournés pointent vers une mémoire tampon valide si la fonction réussit, ou NULL si la fonction échoue.Cette annotation est pour un paramètre de référence. |
Paramètres de référence de sortie
Une utilisation courante du paramètre de référence concerne les paramètres de sortie.Pour la référence simple de paramètre de sortie - pour l'exemple, int&—_Out_ fournit une sémantique correcte.Toutefois, lorsque la valeur de sortie est un pointeur- pour l'exemple int *&— les annotations équivalentes de pointeur comme _Outptr_ int ** ne fournissent pas la sémantique correcte.Pour exprimer de façon concise la sémantique des paramètres de référence de sortie pour les types pointeur, utilisez ces annotations composites :
Annotation |
Description |
---|---|
_Outref_ |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null. |
_Outref_result_maybenull_ |
Le résultat doit être valide dans le rapport, mais peut être null dans le rapport. |
_Outref_result_buffer_(s) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon valide d'une taille d'éléments s. |
_Outref_result_bytebuffer_(s) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon d'une taille de s octets. |
_Outref_result_buffer_to_(s, c) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon d'éléments s , dont le premier c est valide. |
_Outref_result_bytebuffer_to_(s, c) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon d'octets s , dont le premier c est valide. |
_Outref_result_buffer_all_(s) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon valide d'une taille de s éléments valides. |
_Outref_result_bytebuffer_all_(s) |
Le résultat doit être valide dans le l'état d'après et ne peut pas être null.Pointe vers une mémoire tampon valide d'octets d'éléments valides s. |
_Outref_result_buffer_maybenull_(s) |
Le résultat doit être valide dans le rapport, mais peut être null dans le rapport.Pointe vers une mémoire tampon valide d'une taille d'éléments s. |
_Outref_result_bytebuffer_maybenull_(s) |
Le résultat doit être valide dans le rapport, mais peut être null dans le rapport.Pointe vers une mémoire tampon d'une taille de s octets. |
_Outref_result_buffer_to_maybenull_(s, c) |
Le résultat doit être valide dans le rapport, mais peut être null dans le rapport.Pointe vers une mémoire tampon d'éléments s , dont le premier c est valide. |
_Outref_result_bytebuffer_to_maybenull_(s,c) |
Le résultat doit être valide dans le rapport, mais peut être NULL dans le rapport.Pointe vers une mémoire tampon d'octets s , dont le premier c est valide. |
_Outref_result_buffer_all_maybenull_(s) |
Le résultat doit être valide dans le rapport, mais peut être NULL dans le rapport.Pointe vers une mémoire tampon valide d'une taille de s éléments valides. |
_Outref_result_bytebuffer_all_maybenull_(s) |
Le résultat doit être valide dans le rapport, mais peut être NULL dans le rapport.Pointe vers une mémoire tampon valide d'octets d'éléments valides s. |
Valeurs de retour
La valeur de retour d'une fonction ressemble à un paramètre _Out_ mais est à un niveau différent de déréférence, et vous ne devez pas considérer le concept de pointeur vers le résultat.Pour les annotations suivantes, la valeur de retour est la variable scalaire annotée d'un objet, un pointeur vers une structure, ou un pointeur vers une mémoire tampon.Ces annotations ont la même sémantique que l'annotation correspondante _Out_ .
_Ret_z_ _Ret_writes_(s) _Ret_writes_bytes_(s) _Ret_writes_z_(s) _Ret_writes_to_(s,c) _Ret_writes_maybenull_(s) _Ret_writes_to_maybenull_(s) _Ret_writes_maybenull_z_(s) |
_Ret_maybenull_ _Ret_maybenull_z_ _Ret_null_ _Ret_notnull_ _Ret_writes_bytes_to_ _Ret_writes_bytes_maybenull_ _Ret_writes_bytes_to_maybenull_ |
D'autres annotations courantes
Annotation |
Description |
---|---|
_In_range_(low, hi) _Out_range_(low, hi) _Ret_range_(low, hi) _Deref_in_range_(low, hi) _Deref_out_range_(low, hi) _Deref_inout_range_(low, hi) _Field_range_(low, hi) |
Le paramètre, le champ, ou le résultat est dans la plage (inclusifs) de low à hi.Équivalent à _Satisfies_(_Curr_ >= low && _Curr_ <= hi) qui est appliqué à l'objet annoté avec les conditions préalable et de rapport appropriés.
Important
Bien que le nom contienne "in" et "out", la sémantique _In_ et _Out_ fait que not s'appliquent à ces annotations.
|
_Pre_equal_to_(expr) _Post_equal_to_(expr) |
La valeur est annotée exactement expr.Equivalent à _Satisfies_(_Curr_ == expr) qui s'applique à l'objet annoté avec les conditions préalable et de rapport appropriés. |
_Struct_size_bytes_(size) |
S'applique au struct ou à la déclaration de classe.Indique qu'un objet valide de ce type peut être plus grand que le type déclaré, avec le nombre d'octets donné par size.Par exemple :
La taille de mémoire tampon en octets d'un paramètre pM de type MyStruct * est ensuite prise pour être :
|
Ressources connexes
Le blog de l'équipe danalyse du code
Voir aussi
Référence
Annotation du comportement d'une fonction
Structs et classes d'annotation
Annotation du comportement de verrouillage
Spécification du moment où une annotation est applicable et dans quel cas
Meilleures pratiques et exemples (SAL)
Concepts
Autres ressources
Utilisation d'annotations SAL pour réduire les défauts du code C/C++