Condividi tramite


Avviso C6011

Dereferenziare il puntatore NULL 'pointer-name'.

Osservazioni:

Questo avviso indica che il codice dereferenzia un puntatore potenzialmente Null. Se il valore del puntatore non è valido, il risultato sarà indefinito. Per risolvere il problema, convalidare il puntatore prima dell'uso.

Nome dell'analisi del codice: DEREF_NULL_PTR

Esempio

Il codice seguente genera questo avviso perché una chiamata a malloc potrebbe restituire null se è disponibile memoria insufficiente:

#include <malloc.h>

void f( )
{
  char *p = ( char * ) malloc( 10 );
  *p = '\0';

  // code ...
 free( p );
}

Per correggere questo avviso, esaminare il puntatore per un valore Null, come illustrato nel codice seguente:

#include <malloc.h>
void f( )
{
  char *p = ( char * )malloc ( 10 );
  if ( p )
  {
    *p = '\0';
    // code ...

    free( p );
  }
}

Le funzioni possono avere parametri annotati usando la Null proprietà in una Pre condizione. Allocare memoria all'interno di queste funzioni prima di dereferenziare il parametro. Il codice seguente genera l'avviso C6011 perché viene effettuato un tentativo di dereferenziare un puntatore Null (pc) all'interno della funzione senza prima allocare memoria:

#include <sal.h>
using namespace vc_attributes;
void f([Pre(Null=Yes)] char* pc)
{
  *pc='\0'; // warning C6011 - pc is null
  // code ...
}

L'uso senza attenzione di malloc e free comporta perdite di memoria ed eccezioni. Per ridurre al minimo questi tipi di perdite e problemi di eccezione, evitare di allocare manualmente memoria non elaborata. Usare invece i meccanismi forniti dalla libreria standard C++ (STL). Questi includono shared_ptr, unique_ptre vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.

Euristica

Un'euristica usata per ridurre il numero di avvisi nel codice legacy presuppone che un puntatore non sia,NULL a meno che non vi siano prove che si NULLtratti di . Negli esempi illustrati finora, i puntatori restituiti da malloc o new potrebbero essere NULL perché l'allocazione potrebbe non riuscire. Un'altra caratteristica usata dal motore di analisi come prova di nullità è se il programma controlla in modo esplicito la presenza NULLdi . Questo è illustrato negli esempi seguenti:

void f(int* n)
{
  *n = 1; // Does not warn, n is assumed to be non-null
}

void f(int* n)
{
  if (n) {
    (*n)++;
  }
  *n = 1; // Warns because the earlier conditional shows that n might be null
}

Nel secondo caso, l'utente può correggere l'avviso spostando la *n = 1 riga all'interno del blocco if.

Vedi anche