Avertissement C6011

Déreferencing NULL pointeur 'pointer-name'.

Notes

Cet avertissement indique que votre code fait référence à un pointeur potentiellement null. Si la valeur du pointeur n'est pas valide, le résultat n'est pas défini. Pour résoudre le problème, validez le pointeur avant l’utilisation.

Nom de l’analyse du code : DEREF_NULL_PTR

Exemple

Le code suivant génère cet avertissement, car un appel à renvoyer malloc peut retourner null si la mémoire insuffisante est disponible :

#include <malloc.h>

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

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

Pour corriger cet avertissement, examinez le pointeur pour obtenir une valeur Null, comme indiqué dans le code suivant :

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

    free( p );
  }
}

Les fonctions peuvent avoir des paramètres annotés à l’aide de la Null propriété dans une Pre condition. Allouez de la mémoire à l’intérieur de ces fonctions avant de déréférencer le paramètre. Le code suivant génère l’avertissement C6011, car une tentative de déréférencement d’un pointeur Null (pc) à l’intérieur de la fonction sans allouer d’abord de mémoire :

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

L’utilisation insouciance des malloc fuites de free mémoire et des exceptions entraîne une fuite de mémoire et des exceptions. Pour réduire complètement ces types de fuites et de problèmes d’exception, évitez d’allouer vous-même de la mémoire brute. Utilisez plutôt les mécanismes fournis par la bibliothèque standard C++ (STL). Il s’agit notamment de shared_ptr , unique_ptr et vector . Pour plus d’informations, consultez Smart Pointers and C++ Standard Library.

Heuristique

Une heuristique utilisée pour réduire le nombre d’avertissements dans le code hérité suppose qu’un pointeur n’est pas-NULL sauf s’il existe des preuves qu’il s’agit NULL. Dans les exemples que nous avons vus jusqu’à présent, les pointeurs retournés par malloc ou new peuvent être NULL dus à l’échec de l’allocation. Une autre caractéristique que le moteur d’analyse utilise comme preuve de nullabilité est si le programme case activée explicitement pour NULL. Ceci est illustré dans les exemples suivants :

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
}

Dans le deuxième cas, l’utilisateur peut corriger l’avertissement en déplaçant la *n = 1 ligne à l’intérieur du bloc si.

Voir aussi