Anotar structs y clases
Puede anotar miembros de estructura y clase mediante anotaciones que actúan como invariables; se supone que son true en cualquier llamada a función o entrada o salida de función que implique la estructura de cierre como un parámetro o un valor de resultado.
Anotaciones de estructura y clase
_Field_range_(low, high)El campo está en el intervalo (inclusivo) de
lowahigh. Equivalente a_Satisfies_(_Curr_ >= low && _Curr_ <= high)aplicado al objeto anotado mediante las condiciones previas o posteriores adecuadas._Field_size_(size),_Field_size_opt_(size),_Field_size_bytes_(size),_Field_size_bytes_opt_(size)Campo que tiene un tamaño grabable en elementos (o bytes) especificado por
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)Campo que tiene un tamaño grabable en elementos (o bytes) especificado por , y el de los elementos
sizecount(bytes) que son legibles._Field_size_full_(size),_Field_size_full_opt_(size),_Field_size_bytes_full_(size),_Field_size_bytes_full_opt_(size)Campo que tiene un tamaño legible y grabable en elementos (o bytes) según lo especificado por
size._Field_z_Campo que tiene una cadena terminada en NULL.
_Struct_size_bytes_(size)Se aplica a la declaración de estructura o clase. Indica que un objeto válido de ese tipo puede ser mayor que el tipo declarado, con el número de bytes especificado por
size. Por ejemplo:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };El tamaño del búfer en bytes de un parámetro
pMde tipo se tomaMyStruct *como:min(pM->nSize, sizeof(MyStruct))
Ejemplo
#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
};
Notas de este ejemplo:
_Field_z_equivale a_Null_terminated_._Field_z_para el campo name especifica que el campo name es una cadena terminada en NULL._Field_range_parabufferSizeespecifica que el valor de debe estar dentro debufferSize1 yMaxBufferSize(ambos inclusive).- Los resultados finales de
_Struct_size_bytes_las anotaciones y son_Field_size_equivalentes. Para las estructuras o clases que tienen un diseño similar, es más fácil de leer y mantener, ya que tiene menos referencias y cálculos que_Field_size_la anotación_Struct_size_bytes_equivalente._Field_size_no requiere la conversión al tamaño de bytes. Si el tamaño de bytes es la única opción, por ejemplo, para un campo de puntero void,_Field_size_bytes_se puede usar. Si existen_Struct_size_bytes_y_Field_size_, ambas estarán disponibles para las herramientas. Es la herramienta la que debe hacer si las dos anotaciones no están de acuerdo.
Vea también
- Utilizar anotaciones SAL para reducir defectos de código de C/C++
- Introducción a SAL
- Anotar parámetros de función y valores devueltos
- Anotar el comportamiento de funciones
- Anotar comportamiento de bloqueo
- Especificar cuándo y dónde se aplica una anotación
- Funciones intrínsecas
- Procedimientos recomendados y ejemplos