Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Вы можете добавить примечание к структурам и членам классов, используя примечания, которые действуют как инварианты — предполагается, что они будут выполнены в любом вызове функции или функции входа и выхода, которая содержит включающую структуру в качестве значения параметров или результатов.
Структуры и заметки к классам
_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
- Создание примечаний к параметрам и возвращаемым значениям функций
- Аннотация поведения функций
- Аннотация поведения блокировки
- Указание времени и места применения примечания
- Встроенные функции
- Рекомендации и примеры