Avertissement C6011
Déreferencing NULL pointeur 'pointer-name'.
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
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.
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 recherche NULL
explicitement . 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.