Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Można dodawać adnotacje do struktur i składowych klas przy użyciu adnotacji, które działają jak niezmienne — są one uważane za prawdziwe w dowolnym wywołaniu funkcji lub wpisie/wyjściu funkcji, które obejmują otaczającą strukturę jako parametr lub wartość wyniku.
Struktura i Adnotacje Klas
_Field_range_(low, high)Pole znajduje się w zakresie (włącznie) od
lowdohigh. Odpowiednik zastosowany do_Satisfies_(_Curr_ >= low && _Curr_ <= high)obiektu z adnotacjami przy użyciu odpowiednich warunków wstępnych lub postów._Field_size_(size), ,_Field_size_opt_(size), ,_Field_size_bytes_(size)_Field_size_bytes_opt_(size)Pole, które ma zapisywalny rozmiar w elementach (lub bajtach), zgodnie z wartością
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)Pole o rozmiarze zapisywalnym w elementach (lub bajtach) określonym przez
sizeelement icounttych elementów (bajtach), które można odczytać._Field_size_full_(size), ,_Field_size_full_opt_(size), ,_Field_size_bytes_full_(size)_Field_size_bytes_full_opt_(size)Pole, które ma zarówno czytelny, jak i zapisywalny rozmiar w elementach (lub bajtach), zgodnie z parametrem
size._Field_z_Pole, które ma ciąg zakończony wartością null.
_Struct_size_bytes_(size)Dotyczy deklaracji struktury lub klasy. Wskazuje, że prawidłowy obiekt tego typu może być większy niż zadeklarowany typ, z liczbą bajtów określonych przez
size. Na przykład:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };Rozmiar buforu w bajtach parametru
pMtypuMyStruct *jest następnie przyjmowany jako:min(pM->nSize, sizeof(MyStruct))
Przykład
#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
};
Uwagi dotyczące tego przykładu:
-
_Field_z_jest równoważne z_Null_terminated_._Field_z_dla pola nazwy określa, że pole nazwy jest ciągiem zakończonym o wartości null. -
_Field_range_forbufferSizeokreśla, że wartośćbufferSizepowinna mieścić się w zakresie 1 iMaxBufferSize(włącznie). - Wyniki
_Struct_size_bytes_końcowe adnotacji i_Field_size_są równoważne. W przypadku struktur lub klas, które mają podobny układ,_Field_size_łatwiej jest odczytywać i konserwować, ponieważ ma mniej odwołań i obliczeń niż równoważna_Struct_size_bytes_adnotacja._Field_size_nie wymaga konwersji na rozmiar bajtów. Jeśli rozmiar bajtu jest jedyną opcją, na przykład dla pola wskaźnika pustki,_Field_size_bytes_można użyć. Jeśli oba_Struct_size_bytes__Field_size_te elementy i istnieją, będą dostępne dla narzędzi. To do narzędzia, co zrobić, jeśli dwie adnotacje się nie zgadzają.
Zobacz też
- Korzystanie z adnotacji SAL w celu zmniejszenia liczby defektów kodu C/C++
- Informacje o języku SAL
- Dodawanie adnotacji do parametrów funkcji i zwracanych wartości
- Zachowanie funkcji dodawania adnotacji
- Dodawanie adnotacji do zachowania blokującego
- Określanie miejsca i warunków stosowania adnotacji
- Funkcje wewnętrzne
- Najlepsze rozwiązania i przykłady