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