Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda dapat membuat anotasi struct dan anggota kelas dengan menggunakan anotasi yang bertindak seperti invariants—mereka dianggap benar pada panggilan fungsi atau entri/keluar fungsi apa pun yang melibatkan struktur penutup sebagai parameter atau nilai hasil.
Anotasi Struktur dan Kelas
_Field_range_(low, high)
Bidang berada dalam rentang (inklusif) dari
low
kehigh
. Setara dengan_Satisfies_(_Curr_ >= low && _Curr_ <= high)
diterapkan ke objek yang dianotasikan dengan menggunakan kondisi pra atau posting yang sesuai._Field_size_(size)
, ,_Field_size_opt_(size)
_Field_size_bytes_(size)
,_Field_size_bytes_opt_(size)
Bidang yang memiliki ukuran bisa-tulis dalam elemen (atau byte) seperti yang ditentukan oleh
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)
Bidang yang memiliki ukuran bisa-tulis dalam elemen (atau byte) seperti yang ditentukan oleh
size
, dancount
elemen tersebut (byte) yang dapat dibaca._Field_size_full_(size)
, ,_Field_size_full_opt_(size)
_Field_size_bytes_full_(size)
,_Field_size_bytes_full_opt_(size)
Bidang yang memiliki ukuran yang dapat dibaca dan dapat ditulis dalam elemen (atau byte) seperti yang ditentukan oleh
size
._Field_z_
Bidang yang memiliki string null-terminated.
_Struct_size_bytes_(size)
Berlaku untuk struct atau deklarasi kelas. Menunjukkan bahwa objek yang valid dari jenis tersebut mungkin lebih besar dari jenis yang dideklarasikan, dengan jumlah byte yang ditentukan oleh
size
. Contohnya:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };
Ukuran buffer dalam byte dari parameter
pM
jenisMyStruct *
kemudian diambil untuk menjadi:min(pM->nSize, sizeof(MyStruct))
Contoh
#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
};
Catatan untuk contoh ini:
-
_Field_z_
setara dengan_Null_terminated_
._Field_z_
untuk bidang nama menentukan bahwa bidang nama adalah string yang dihentikan null. -
_Field_range_
untukbufferSize
menentukan bahwa nilaibufferSize
harus dalam 1 danMaxBufferSize
(keduanya inklusif). - Hasil akhir anotasi
_Struct_size_bytes_
dan_Field_size_
setara. Untuk struktur atau kelas yang memiliki tata letak serupa,_Field_size_
lebih mudah dibaca dan dikelola, karena memiliki lebih sedikit referensi dan perhitungan daripada anotasi yang setara_Struct_size_bytes_
._Field_size_
tidak memerlukan konversi ke ukuran byte. Jika ukuran byte adalah satu-satunya opsi, misalnya, untuk bidang penunjuk yang batal,_Field_size_bytes_
dapat digunakan. Jika keduanya_Struct_size_bytes_
dan_Field_size_
ada, keduanya akan tersedia untuk alat. Terserah alat apa yang harus dilakukan jika kedua anotasi tidak setuju.