您可以使用作用類似非變異項目的註釋為結構和類別加上附註,在包含封入結構做為參數或結果值的任何函式呼叫或函式進入/結束點,會假定這些註釋為真。
結構與類別註釋
_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; ... };然後,以類型參數
pMMyStruct *的位元組為單位的緩衝區大小會採用為: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_存在,則兩者都可供工具使用。 這要由工具決定,如果兩個註釋不同意,該怎麼做。