Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Você pode anotar membros de estrutura e classe usando anotações que agem como invariantes — presume-se que sejam verdadeiras em qualquer chamada de função ou entrada/saída de função que inclua a estrutura que as encerra como um parâmetro ou resultado.
As Anotações de Estruturas (Struct) e Classes (Class)
_Field_range_(low, high)O campo está no intervalo (inclusive) de
lowatéhigh. Equivalente a_Satisfies_(_Curr_ >= low && _Curr_ <= high)aplicado ao objeto anotado usando as condições pré ou pós apropriadas._Field_size_(size),_Field_size_opt_(size),_Field_size_bytes_(size),_Field_size_bytes_opt_(size)Um campo que tem um tamanho gravável em elementos (ou bytes), conforme 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)Um campo com um tamanho em elementos (ou bytes) que pode ser gravado conforme especificado por
size, e aqueles elementos (bytes) cujo tamanho está legível porcount._Field_size_full_(size),_Field_size_full_opt_(size),_Field_size_bytes_full_(size),_Field_size_bytes_full_opt_(size)Um campo que tem tamanho legível e gravável em elementos (ou bytes), conforme especificado por
size._Field_z_Um campo que tem uma cadeia de caracteres terminada em nulo.
_Struct_size_bytes_(size)Aplica-se à declaração de struct ou class. Indica que um objeto válido desse tipo pode ser maior do que o tipo declarado, com o número de bytes sendo especificado por
size. Por exemplo:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };O tamanho do buffer em bytes de um parâmetro
pMdo tipoMyStruct *é então considerado como:min(pM->nSize, sizeof(MyStruct))
Exemplo
#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 para este exemplo:
-
_Field_z_é equivalente a_Null_terminated_._Field_z_para o campo name especifica que o campo name é uma cadeia de caracteres terminada em nulo. -
_Field_range_parabufferSizeespecifica que o valor debufferSizedeve estar entre 1 eMaxBufferSize, incluindo ambos. - Os resultados finais das
_Struct_size_bytes_anotações e_Field_size_são equivalentes. Para estruturas ou classes que têm um layout semelhante,_Field_size_é mais fácil de ler e manter, porque tem menos referências e cálculos do que a anotação equivalente_Struct_size_bytes_._Field_size_não requer conversão para o tamanho em bytes. Se o tamanho do byte for a única opção, por exemplo, para um campo de ponteiro vazio,_Field_size_bytes_pode ser usado. Se existirem_Struct_size_bytes_e_Field_size_, ambos estarão disponíveis para ferramentas. Cabe à ferramenta o que fazer se as duas anotações discordarem.