Annotazione di parametri di funzione e valori restituiti
Questo articolo descrive gli utilizzi tipici delle annotazioni per semplici parametri scalari di funzioni e puntatori a strutture e classi e alla maggior parte dei tipi di buffer. Questo articolo inoltre, mostra modelli di utilizzo comuni per le annotazioni.Per le annotazioni aggiuntive correlate alle funzioni, vedere Annotazione del comportamento delle funzioni
Parametri dei puntatori
Per le annotazioni nella seguente tabella, quando un parametro di un puntatore viene annotato i rapporti dell'analizzatore segnalano un errore se il puntatore è null. Questo vale per i puntatori e per qualsiasi elemento di dati a cui si fa riferimento.
Annotazione |
Descrizione |
---|---|
_In_ |
L'annotazione dei parametri di input che sono scalari, strutture, puntatori a strutture e così via. In modo esplicito possono essere utilizzati sugli scalari semplici. Il parametro deve essere valido nello stato precedente e non verrà modificato. |
_Out_ |
L'annotazione dei parametri di output che sono scalari, strutture, puntatori a strutture e così via. Non applicare questo ad un oggetto che non restituisce valori, ad esempio uno scalare che viene passato per valore. Il parametro non deve essere valido nello stato precedente, ma deve essere valido nello stato successivo. |
_Inout_ |
Annotazione di un parametro che verrà modificato dalla funzione. Deve essere valido in entrambi gli stati quello precedente e quello successivo, ma si presume di avere valori diversi prima e dopo la chiamata.Deve essere applicato a un valore modificabile. |
_In_z_ |
Un puntatore a una stringa con terminazione null, viene utilizzato come input. La stringa deve essere valida nello stato precedente. Le varianti di PSTR, che già dispongono di annotazioni corrette, sono preferibili. |
_Inout_z_ |
Un puntatore ad una matrice di caratteri con terminazione null che verrà modificato. Deve essere valido prima e dopo la chiamata, ma si presume che il valore deva essere modificato. Il terminatore null può essere spostato, ma si può accedere solo agli elementi fino all'originale terminatore a null. |
_In_reads_(s) _In_reads_bytes_(s) |
Un puntatore ad una matrice, che viene letto da una funzione. La matrice ha dimensione degli elementi s, ognuno dei quali deve essere valido. La variante _bytes_ fornisce la dimensione in byte anziché per elementi.Utilizzare questo solo quando la dimensione non può essere espressa come elementi. Ad esempio, char Le stringhe avrebbe utilizzato la variante in _bytes_ solamente se in una simile funzione venisse utilizzato wchar_t. |
_In_reads_z_(s) |
Un puntatore ad una matrice con terminazione null e con una dimensione nota.Gli elementi fino a terminatore null, oppure s se non vi è il terminatore a null, devono essere validi nello stato precedente. Se la dimensione in byte è nota, scala s dalla dimensione dell'elemento. |
_In_reads_or_z_(s) |
Un puntatore ad una matrice che ha terminazione a null oppure ha dimensione nota, o entrambi.Gli elementi fino a terminatore null, oppure s se non vi è il terminatore a null, devono essere validi nello stato precedente. Se la dimensione in byte è nota, scala s dalla dimensione dell'elemento. (Utilizzato per la famiglia strn ). |
_Out_writes_(s) _Out_writes_bytes_(s) |
Un puntatore a una matrice di elementi (rispettivamente byte) di s che verranno scritti dalla funzione. Gli elementi di una matrice non devono essere validi in uno stato precedente e il numero di elementi validi nello stato successivo non deve essere specificato. In presenza di annotazioni sul tipo di parametro, si applicano nello stato successivo.Si consideri il codice di esempio seguente.
In questo esempio, il chiamante fornisce un buffer degli elementi di size per p1. MyStringCopy rende parte degli elementi validi.Ancora più importante, l'annotazione _Null_terminated_ su PWSTR significa che p1 è terminato con null nello stato successivo. In questo modo, il numero di elementi validi è ancora ben definito ma un numero specifico dell'elemento non è obbligatorio. La variante _bytes_ fornisce la dimensione in byte anziché per elementi.Utilizzare questo solo quando la dimensione non può essere espressa come elementi. Ad esempio, char Le stringhe avrebbe utilizzato la variante in _bytes_ solamente se in una simile funzione venisse utilizzato wchar_t. |
_Out_writes_z_(s) |
Un puntatore ad una matrice elementi s. Gli elementi non devono essere validi nello stato precedente. Nello stato successivo, gli elementi con terminatore a null, devono essere presenti e devono essere validi. Se la dimensione in byte è nota, scala s dalla dimensione dell'elemento. |
_Inout_updates_(s) _Inout_updates_bytes_(s) |
Un puntatore ad una matrice, il quale scrive e legge per la funzione. Si tratta di elementi di dimensione s, validi nello stato precedente e nello stato successivo. La variante _bytes_ fornisce la dimensione in byte anziché per elementi.Utilizzare questo solo quando la dimensione non può essere espressa come elementi. Ad esempio, char Le stringhe avrebbe utilizzato la variante in _bytes_ solamente se in una simile funzione venisse utilizzato wchar_t. |
_Inout_updates_z_(s) |
Un puntatore ad una matrice con terminazione null e con una dimensione nota.Gli elementi fino il terminatore null, devono essere presenti e devono essere validi in entrambi gli stati in quello precedente e in quello successivo. Il valore nello stato successivo si presume essere differente dal valore nello stato precedente; questo include la posizione del terminatore null.Se la dimensione in byte è nota, scala s dalla dimensione dell'elemento. |
_Out_writes_to_(s,c) _Out_writes_bytes_to_(s,c) _Out_writes_all_(s) _Out_writes_bytes_all_(s) |
Un puntatore ad una matrice elementi s. Gli elementi non devono essere validi nello stato precedente. Nello stato precedente, gli elementi fino al c-esimo elemento devono essere validi. Se la dimensione in byte è nota, scala s e c dalla dimensione dell'elemento oppure utilizzare la variante _bytes_, definita come:
In altre parole, ogni elemento presente nello stato precedente nel buffer fino a s è valido nello stato successivo. Di seguito è riportato un esempio.
|
_Inout_updates_to_(s,c) _Inout_updates_bytes_to_(s,c) |
Un puntatore ad una matrice, che sia letto e scritto dalla funzione. Ha dimensione di elementi s , ognuno dei quali deve essere valido nello stato precedente e c elementi devono essere validi nello stato successivo. La variante _bytes_ fornisce la dimensione in byte anziché per elementi.Utilizzare questo solo quando la dimensione non può essere espressa come elementi. Ad esempio, char Le stringhe avrebbe utilizzato la variante in _bytes_ solamente se in una simile funzione venisse utilizzato wchar_t. |
_Inout_updates_all_(s) _Inout_updates_bytes_all_(s) |
Un puntatore ad una matrice, che sia letto e scritto dalla funzione, con dimensione di elementi s.Definito come equivalente a:
In altre parole, ogni elemento presente nello stato precedente nel buffer fino a s è valido nello stato precedente e nello stato successivo. La variante _bytes_ fornisce la dimensione in byte anziché per elementi.Utilizzare questo solo quando la dimensione non può essere espressa come elementi. Ad esempio, char Le stringhe avrebbe utilizzato la variante in _bytes_ solamente se in una simile funzione venisse utilizzato wchar_t. |
_In_reads_to_ptr_(p) |
Un puntatore ad una matrice per cui l'espressione p – _Curr_ (ovvero, p meno _Curr_) è definito dallo standard appropriato di linguaggio. Gli elementi prima di p devono essere validi nello stato precedente. |
_In_reads_to_ptr_z_(p) |
Un puntatore ad una matrice con terminazione null, per cui l'espressione p – _Curr_ (ovvero p meno _Curr_) è definito dallo standard appropriato di linguaggio. Gli elementi prima di p devono essere validi nello stato precedente. |
_Out_writes_to_ptr_(p) |
Un puntatore ad una matrice per cui l'espressione p – _Curr_ (ovvero, p meno _Curr_) è definito dallo standard appropriato di linguaggio. Gli elementi prima di p non devono essere validi nello stato precedente e devono essere validi nello stato successivo. |
_Out_writes_to_ptr_z_(p) |
Un puntatore ad una matrice con terminazione null, per cui l'espressione p – _Curr_ (ovvero p meno _Curr_) è definito dallo standard appropriato di linguaggio. Gli elementi prima di p non devono essere validi nello stato precedente e devono essere validi nello stato successivo. |
Parametri facoltativi del puntatore
Quando una notazione di un parametro di un puntatore include _opt_, indica che il parametro può essere null.In caso contrario, l'annotazione esegue la stessa versione che non include _opt_.Di seguito è riportato un elenco di varianti _opt_, delle annotazioni dei parametri di un puntatore:
_In_opt_ _Out_opt_ _Inout_opt_ _In_opt_z_ _Inout_opt_z_ _In_reads_opt_ _In_reads_bytes_opt_ _In_reads_opt_z_ |
_Out_writes_opt_ _Out_writes_opt_z_ _Inout_updates_opt_ _Inout_updates_bytes_opt_ _Inout_updates_opt_z_ _Out_writes_to_opt_ _Out_writes_bytes_to_opt_ _Out_writes_all_opt_ _Out_writes_bytes_all_opt_ |
_Inout_updates_to_opt_ _Inout_updates_bytes_to_opt_ _Inout_updates_all_opt_ _Inout_updates_bytes_all_opt_ _In_reads_to_ptr_opt_ _In_reads_to_ptr_opt_z_ _Out_writes_to_ptr_opt_ _Out_writes_to_ptr_opt_z_ |
Parametri di output di un puntatore
I parametri di output di un puntatore richiedono una speciale notazione per evitare ambiguità null-ness sul parametro a cui punta il percorso.
Annotazione |
Descrizione |
---|---|
_Outptr_ |
Il parametro non può essere null, nello stato successivo il puntatore al percorso non può essere nullo e deve essere valido. |
_Outptr_opt_ |
Il parametro può essere null, ma nello stato successivo il puntatore al percorso non può essere null e deve essere valido. |
_Outptr_result_maybenull_ |
Il parametro non può essere null e nello stato successivo il puntatore al percorso può essere a null. |
_Outptr_opt_result_maybenull_ |
Il parametro può essere null e nello stato successivo il puntatore al percorso può essere a null. |
Nella seguente tabella, le sotto stringhe aggiuntive vengono inserite nell'annotazione del nome, per favorire la qualifica del significato dell'annotazione. Diverse sotto stringhe sono _z, _COM_, _buffer_, _bytebuffer_e _to_.
Importante |
---|
Se l'interfaccia annotata è COM, utilizzare il form COM per queste annotazioni.Non utilizzare le annotazioni COM con qualsiasi altro tipo di interfaccia. |
Annotazione |
Descrizione |
---|---|
_Outptr_result_z_ _Outptr_opt_result_z_ _Outptr_result_maybenull_z_ _Ouptr_opt_result_maybenull_z_ |
Il puntatore restituito avrà l'annotazione _Null_terminated_. |
_COM_Outptr_ _COM_Outptr_opt_ _COM_Outptr_result_maybenull_ _COM_Outptr_opt_result_maybenull_ |
Il puntatore restituito ha una semantica COM, pertanto comporta una post-condizione _On_failure_, indicando che il puntatore restituito è null. |
_Outptr_result_buffer_(s) _Outptr_result_bytebuffer_(s) _Outptr_opt_result_buffer_(s) _Outptr_opt_result_bytebuffer_(s) |
Il puntatore restituito punta ad un buffer valido di dimensione s di elementi oppure di byte. |
_Outptr_result_buffer_to_(s, c) _Outptr_result_bytebuffer_to_(s, c) _Outptr_opt_result_buffer_to_(s,c) _Outptr_opt_result_bytebuffer_to_(s,c) |
Il puntatore restituirò punta ad un buffer di dimensione s di elementi oppure di byte, di cui il primo c è valido. |
Alcune convenzioni sull'interfaccia, presumono che i parametri di output vengono annullati con un errore. Fatta eccezione per il codice COM esplicito, sono preferibili i form presenti nella seguente tabella. Per il codice COM, utilizzare i form COM corrispondenti che sono elencati nella sezione precedente.
Annotazione |
Descrizione |
---|---|
_Result_nullonfailure_ |
Modificare altre annotazioni.Il risultato viene impostato a null, se la funzione ha esito negativo. |
_Result_zeroonfailure_ |
Modificare altre annotazioni.Il risultato è impostato a zero, se la funzione ha esito negativo. |
_Outptr_result_nullonfailure_ |
I valore di ritorno del puntatore puntano ad un buffer valido se la funzione ha esito positivo, oppure ritorna null se la funzione ha esito negativo.Questa voce è per un parametro non facoltativo. |
_Outptr_opt_result_nullonfailure_ |
I valore di ritorno del puntatore puntano ad un buffer valido se la funzione ha esito positivo, oppure ritorna null se la funzione ha esito negativo.Questa voce è per un parametro facoltativo. |
_Outref_result_nullonfailure_ |
I valore di ritorno del puntatore puntano ad un buffer valido se la funzione ha esito positivo, oppure ritorna null se la funzione ha esito negativo.Questa voce è per un parametro di riferimento. |
Parametri di riferimento di output
Un utilizzo comune del parametro di riferimento è per parametri di output. Per un semplice parametro di riferimento, ad esempio int&—_Out_ fornisce la semantica corretta. Tuttavia, quando il valore di output è un puntatore, ad esempio int *& l'annotazione equivalente del puntatore come _Outptr_ int ** non fornisce la semantica corretta. La semantica dei parametri di riferimento di output per i tipi di puntatore, può essere brevemente espressa utilizzando queste annotazioni composte:
Annotazione |
Descrizione |
---|---|
_Outref_ |
Il risultato deve essere valido nello stato successione e non può essere null. |
_Outref_result_maybenull_ |
Il risultato deve essere valido nello stato successivo, ma può essere null nello stato successivo. |
_Outref_result_buffer_(s) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer valido di dimensione s elementi. |
_Outref_result_bytebuffer_(s) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer valido di dimensione s byte. |
_Outref_result_buffer_to_(s, c) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer di s elementi, di cui il primo c è valido. |
_Outref_result_bytebuffer_to_(s, c) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer di s byte, di cui il primo c è valido. |
_Outref_result_buffer_all_(s) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer valido di dimensione s elementi validi. |
_Outref_result_bytebuffer_all_(s) |
Il risultato deve essere valido nello stato successione e non può essere null.Indica un buffer valido di s byte di elementi validi. |
_Outref_result_buffer_maybenull_(s) |
Il risultato deve essere valido nello stato successivo, ma può essere null nello stato successivo.Indica un buffer valido di dimensione s elementi. |
_Outref_result_bytebuffer_maybenull_(s) |
Il risultato deve essere valido nello stato successivo, ma può essere null nello stato successivo.Indica un buffer valido di dimensione s byte. |
_Outref_result_buffer_to_maybenull_(s, c) |
Il risultato deve essere valido nello stato successivo, ma può essere null nello stato successivo.Indica un buffer di s elementi, di cui il primo c è valido. |
_Outref_result_bytebuffer_to_maybenull_(s,c) |
Il risultato deve essere valido nello stato successivo, ma può anche essere null.Indica un buffer di s byte, di cui il primo c è valido. |
_Outref_result_buffer_all_maybenull_(s) |
Il risultato deve essere valido nello stato successivo, ma può anche essere null.Indica un buffer valido di dimensione s elementi validi. |
_Outref_result_bytebuffer_all_maybenull_(s) |
Il risultato deve essere valido nello stato successivo, ma può anche essere null.Indica un buffer valido di s byte di elementi validi. |
Valori restituiti
Il valore di ritorno di una funzione è simile a un parametro _Out_, ma è ad un livello di riferimento diverso, dove non è necessario considerare il concetto di puntatore al risultato. Per le seguenti annotazioni il valore di ritorno è l'oggetto annotato come uno scalare, un puntatore ad uno struct oppure un puntatore ad un buffer.Queste annotazioni hanno la stessa semantica della corrispondente annotazione _Out_.
_Ret_z_ _Ret_writes_(s) _Ret_writes_bytes_(s) _Ret_writes_z_(s) _Ret_writes_to_(s,c) _Ret_writes_maybenull_(s) _Ret_writes_to_maybenull_(s) _Ret_writes_maybenull_z_(s) |
_Ret_maybenull_ _Ret_maybenull_z_ _Ret_null_ _Ret_notnull_ _Ret_writes_bytes_to_ _Ret_writes_bytes_maybenull_ _Ret_writes_bytes_to_maybenull_ |
Altre annotazioni comuni
Annotazione |
Descrizione |
||
---|---|---|---|
_In_range_(low, hi) _Out_range_(low, hi) _Ret_range_(low, hi) _Deref_in_range_(low, hi) _Deref_out_range_(low, hi) _Deref_inout_range_(low, hi) _Field_range_(low, hi) |
Il parametro, il campo o il risultato sono nell'intervallo (incluso) da low a hi. Equivalente a _Satisfies_(_Curr_ >= low && _Curr_ <= hi) che si applica all'oggetto annotato, insieme alle appropriate condizioni di stato precedente oppure stato successivo.
|
||
_Pre_equal_to_(expr) _Post_equal_to_(expr) |
Il valore annotato è esattamente expr. Equivalente a _Satisfies_(_Curr_ == expr) che si applica all'oggetto annotato, insieme alle appropriate condizioni di stato precedente oppure stato successivo. |
||
_Struct_size_bytes_(size) |
Si applica ad uno struct o ad una dichiarazione di classe. Indica che un oggetto valido di tale tipo può essere maggiore rispetto al tipo dichiarato, con il numero di byte forniti da size. Di seguito è riportato un esempio.
La dimensione in byte del buffer di un parametro pM di tipo MyStruct * è presa da:
|
Risorse correlate
Blog del team di analisi codice
Vedere anche
Riferimenti
Annotazione del comportamento delle funzioni
Annotazioni di struct e classi
Annotazione del comportamento di blocco
Specificare dove e quando applicare un'annotazione
Concetti
Altre risorse
Utilizzo delle annotazioni SAL per ridurre gli errori del codice C/C++