Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile annotare i membri struct e di classe utilizzando le annotazioni che operano come invarianti, si presume che siano true per qualsiasi chiamata di funzione o entrata/uscita di funzione che include la struttura contenitore come parametro o valore restituito.
Annotazioni di struct e classi
_Field_range_(low, high)Il campo si trova nell'intervallo (incluso) da
lowahigh. Equivalente ad applicare_Satisfies_(_Curr_ >= low && _Curr_ <= high)all'oggetto annotato utilizzando le pre/postcondizioni appropriate._Field_size_(size),_Field_size_opt_(size),_Field_size_bytes_(size)_Field_size_bytes_opt_(size)Campo con una dimensione scrivibile in elementi (o byte) come specificato da
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)Campo con una dimensione scrivibile in elementi (o byte) come specificato da
sizeecountdegli elementi (byte) che sono leggibili._Field_size_full_(size),_Field_size_full_opt_(size),_Field_size_bytes_full_(size)_Field_size_bytes_full_opt_(size)Campo che contiene sia dimensione leggibile che modificabile in elementi (o byte) come specificato da
size._Field_z_Campo con terminazione Null.
_Struct_size_bytes_(size)Si applica alla dichiarazione di struct o classe. Indica che un oggetto valido di tale tipo può essere maggiore rispetto al tipo dichiarato, con il numero di byte specificati da
size. Ad esempio:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };Le dimensioni del buffer in byte di un parametro
pMdi tipoMyStruct *vengono quindi prese in modo che siano:min(pM->nSize, sizeof(MyStruct))
Esempio
#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
};
Note per questo esempio:
-
_Field_z_è pari a_Null_terminated_._Field_z_per il campo name specifica che il campo name è una stringa con terminazione Null. -
_Field_range_perbufferSizespecifica che il valore dibufferSizedeve essere compreso tra 1 eMaxBufferSize(inclusi entrambi). - I risultati finali delle
_Struct_size_bytes_annotazioni e_Field_size_sono equivalenti. Per le strutture o le classi con un layout simile,_Field_size_è più facile da leggere e gestire, perché include meno riferimenti e calcoli rispetto all'annotazione equivalente_Struct_size_bytes_._Field_size_non richiede la conversione alle dimensioni dei byte. Se la dimensione dei byte è l'unica opzione, ad esempio, per un campo puntatore void,_Field_size_bytes_può essere utilizzata. Se esistono entrambi_Struct_size_bytes_,_Field_size_entrambi saranno disponibili per gli strumenti. Spetta allo strumento cosa fare se le due annotazioni non sono d'accordo.
Vedi anche
- Uso delle annotazioni SAL per ridurre gli errori del codice C/C++
- Informazioni su SAL
- Annotazione di parametri di funzione e valori restituiti
- Annotazione del comportamento delle funzioni
- Annotazione del comportamento di blocco
- Specificare dove e quando applicare un'annotazione
- Funzioni intrinseche
- Suggerimenti ed esempi