Аннотация структур и классов
Вы можете добавить примечание к структурам и членам классов, используя примечания, которые действуют как инварианты — предполагается, что они будут выполнены в любом вызове функции или функции входа и выхода, которая содержит включающую структуру в качестве значения параметров или результатов.
Структуры и заметки к классам
_Field_range_(low, high)
Поле находится в диапазоне (включительно) от
low
.high
Эквивалент для_Satisfies_(_Curr_ >= low && _Curr_ <= high)
применяется к аннотированному объекту с помощью соответствующих предусловий или постусловий._Field_size_(size)
, ,_Field_size_opt_(size)
_Field_size_bytes_(size)
_Field_size_bytes_opt_(size)
Поле с записываемым размером в элементах (или байтах), как определено в
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)
Поле с записываемым размером в элементах (или байтах), как определено в
size
иcount
этих элементов (байт), которые доступны для чтения._Field_size_full_(size)
, ,_Field_size_full_opt_(size)
_Field_size_bytes_full_(size)
_Field_size_bytes_full_opt_(size)
Поле с размером в элементах (или байт), доступных для записи и чтения, как определено в
size
._Field_z_
Поле с строкой, завершающейся значением NULL.
_Struct_size_bytes_(size)
Применяется к объявлению структуры или класса. Указывает, что допустимый объект этого типа может быть больше объявленного типа с количеством байт, указанным в
size
. Например:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };
Затем требуется размер буфера в байтах параметра
pM
типаMyStruct *
:min(pM->nSize, sizeof(MyStruct))
Пример
#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
};
Примечания для этого примера:
_Field_z_
эквивалентна_Null_terminated_
._Field_z_
Для поля имени указывается, что поле имени является строкой, завершающейся значением NULL._Field_range_
bufferSize
значениеbufferSize
должно находиться в пределах 1 иMaxBufferSize
(как включительно).- Конечные результаты
_Struct_size_bytes_
и_Field_size_
заметки эквивалентны. Для структур или классов, имеющих аналогичный макет,_Field_size_
проще читать и поддерживать их, так как он имеет меньше ссылок и вычислений, чем эквивалентная_Struct_size_bytes_
заметка._Field_size_
не требуется преобразование в размер байтов. Если размер байтов является единственным вариантом, например для поля указателя void,_Field_size_bytes_
можно использовать. Если оба_Struct_size_bytes_
и_Field_size_
существуют, оба будут доступны для инструментов. Это до инструмента, что делать, если две заметки не согласны.
См. также
- Использование аннотаций SAL для уменьшения количества дефектов в коде C/C++
- Основные сведения о языке SAL
- Создание примечаний к параметрам и возвращаемым значениям функций
- Аннотация поведения функций
- Аннотация поведения блокировки
- Указание времени и места применения примечания
- Встроенные функции
- Рекомендации и примеры