Avviso C6101
Restituzione della memoria non inizializzata 'parameter-name'.
Un percorso riuscito tramite la funzione non imposta il _Out_
parametro con annotazioni.
Osservazioni:
Lo scopo di questo avviso è evitare l'uso di valori non inizializzati dai chiamanti della funzione. L'analizzatore presuppone che i chiamanti non inizializzino parametri annotati con _Out_
prima della chiamata di funzione e controlli che la funzione li inizializzi. L'analizzatore non genera questo avviso se la funzione restituisce un valore che indica che si è verificato un errore o che non è riuscito. Per risolvere questo problema, assicurarsi di inizializzare il _Out_
parametro in tutti i percorsi restituiti riusciti. Il messaggio di errore contiene i numeri di riga di un percorso di esempio che non inizializza il parametro.
Se il comportamento di inizializzazione è previsto dalla progettazione, è probabile che le annotazioni SAL non corrette o mancanti causino l'avviso. In genere è possibile risolvere questi casi in uno dei due modi seguenti: passare _Out_
a un'annotazione più appropriata oppure usare l'annotazione _Success_()
per definire gli stati di esito positivo/errore della funzione. È importante che gli strumenti di analisi statica abbiano annotazioni corrette sulla funzione durante l'analisi dei siti di chiamata della funzione.
Correzione delle modifiche apportate alle annotazioni dei parametri
Se il parametro deve essere già in uno stato inizializzato e la funzione la modifica in modo condizionale, l'annotazione _Inout_
potrebbe essere più appropriata. Se nessun'altra annotazione di alto livello soddisfa il comportamento previsto, è possibile usare annotazioni di basso livello, ad _Pre_null_
esempio , _Pre_satisfies_()
e _Post_satisfies_()
che offrono maggiore flessibilità e controllo sullo stato previsto del parametro. Per altre informazioni sulle annotazioni dei parametri, vedere Annotazione di parametri di funzione e valori restituiti.
Correzione definendo percorsi restituiti riusciti
L'analizzatore genera questo avviso solo quando il codice non inizializza un _Out_
parametro nei percorsi di esito positivo della funzione. Se non _Success_
sono presenti annotazioni e nessuna annotazione del tipo restituito dalla funzione, considera tutti i percorsi restituiti correttamente. Per altre informazioni su _Success_
e annotazioni simili, vedere Annotazioni di esito positivo/negativo.
Nome dell'analisi del codice: RETURN_UNINIT_VAR
Esempio
Il codice seguente genera questo avviso. Poiché la funzione restituisce void
, l'analizzatore considera tutti i percorsi riusciti. In questo caso, la correzione corretta sarebbe probabilmente quella di modificare la logica dell'istruzione if
, ma nel codice reale in genere non è così semplice e la soluzione dipende dal comportamento previsto della funzione.
#include <sal.h>
void AlwaysInit(_Out_ int* output, int input) // : warning C6101: Returning uninitialized memory '*p'.: Lines: 2, 4, 9, 14, 2
{
if( input > 0 )
{
*output = input;
return;
}
else if( input < 0 )
{
*output = 0;
return;
}
return; // Oops, input was 0
}
Per rendere la soluzione più interessante, si presuppone che non sia valida per inizializzare output
quando input
è 0
. Un approccio consiste nel modificare il valore restituito della funzione in un tipo diverso, ad esempio bool
. Aggiungere quindi un'annotazione _Success_
per definire i percorsi restituiti riusciti.
_Success_(return == true)
bool InitNotZero(_Out_ int* output, int input)
{
if( input > 0 )
{
*output = input;
return true;
}
else if( input < 0 )
{
*output = 0;
return true;
}
return false;
}
Se questo modello è comune nella codebase, è possibile aggiungere l'annotazione al tipo restituito. I codici di errore, ad esempio HRESULT di Windows SDK, offrono il comportamento dell'annotazione _Success_
senza dover aggiungerlo a ogni funzione. Se si usa già un tipo annotato come tipo restituito e si vuole eseguire l'override del comportamento, aggiungere l'annotazione alla funzione, come illustrato nell'esempio precedente.
using SuccessWhenTrue = _Success_(return == true) bool;
SuccessWhenTrue InitNotZero(_Out_ int* output, int input)
{
// ...
}
Vedi anche
Set di regole per il codice C++
Uso delle annotazioni SAL per ridurre gli errori del codice C/C++
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per