Condividi tramite


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++