Structs et classes d'annotation
Vous pouvez annoter les membres de struct et de classe à l’aide d’annotations qui agissent comme des invariants. Elles sont supposées être vraies à tout appel de fonction ou entrée/sortie de fonction qui implique la structure englobante en tant que paramètre ou valeur de résultat.
Annotations de struct et de classe
_Field_range_(low, high)
Le champ se trouve dans la plage (inclusive) de
low
àhigh
. Équivalent à appliqué à l’objet annoté à_Satisfies_(_Curr_ >= low && _Curr_ <= high)
l’aide des conditions préalables ou post appropriées._Field_size_(size)
,_Field_size_opt_(size)
,_Field_size_bytes_(size)
,_Field_size_bytes_opt_(size)
Champ qui a une taille accessible en écriture dans les éléments (ou octets) comme spécifié par
size
._Field_size_part_(size, count)
,_Field_size_part_opt_(size, count)
,_Field_size_bytes_part_(size, count)
,_Field_size_bytes_part_opt_(size, count)
Champ qui a une taille accessible en écriture dans les éléments (ou octets) comme spécifié par
size
, et lescount
éléments (octets) lisibles._Field_size_full_(size)
,_Field_size_full_opt_(size)
,_Field_size_bytes_full_(size)
,_Field_size_bytes_full_opt_(size)
Champ qui a à la fois une taille lisible et accessible en écriture dans des éléments (ou octets) comme spécifié par
size
._Field_z_
Champ qui a une chaîne terminée par null.
_Struct_size_bytes_(size)
S’applique à la déclaration de struct ou de classe. Indique qu’un objet valide de ce type peut être supérieur au type déclaré, avec le nombre d’octets spécifié par
size
. Par exemple :typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };
La taille de la mémoire tampon en octets d’un paramètre
pM
de typeMyStruct *
est ensuite prise comme suit :min(pM->nSize, sizeof(MyStruct))
Exemple
#include <sal.h>
// This _Struct_size_bytes_ is equivalent to what below _Field_size_ means.
_Struct_size_bytes_(__builtin_offsetof(MyBuffer, buffer) + bufferSize * sizeof(int))
struct MyBuffer
{
static int MaxBufferSize;
_Field_z_
const char* name;
int firstField;
// ... other fields
_Field_range_(1, MaxBufferSize)
int bufferSize;
_Field_size_(bufferSize) // Preferred way - easier to read and maintain.
int buffer[]; // Using C99 Flexible array member
};
Remarques pour cet exemple :
_Field_z_
est équivalent à_Null_terminated_
._Field_z_
pour le champ de nom spécifie que le champ de nom est une chaîne terminée par null._Field_range_
pourbufferSize
spécifier que la valeur debufferSize
doit être comprise dans 1 etMaxBufferSize
(à la fois inclusive).- Les résultats finaux des annotations et
_Field_size_
des_Struct_size_bytes_
annotations sont équivalents. Pour les structures ou classes qui ont une disposition similaire,_Field_size_
il est plus facile de lire et de gérer, car il a moins de références et de calculs que l’annotation équivalente_Struct_size_bytes_
._Field_size_
ne nécessite pas de conversion en taille d’octet. Si la taille d’octet est la seule option, par exemple, pour un champ de pointeur void,_Field_size_bytes_
peut être utilisée. S’il existe à la fois,_Field_size_
les deux_Struct_size_bytes_
seront disponibles pour les outils. Il incombe à l’outil de faire si les deux annotations ne sont pas d’accord.
Voir aussi
- Utilisation d’annotations SAL pour réduire les défauts du code C/C++
- Présentation de SAL
- Annotation des paramètres de fonction et des valeurs de retour
- Annotation du comportement d’une fonction
- Annotation du comportement de verrouillage
- Spécification du moment et de l’endroit où une annotation s’applique
- Fonctions intrinsèques
- Bonnes pratiques et exemples
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour