Warnung C6011
Dereferencing NULL-Zeiger 'pointer-name'.
Hinweise
Diese Warnung gibt an, dass Ihr Code einen potenziell NULL-Zeiger ableiten kann. Wenn der Zeigerwert ungültig ist, ist das Ergebnis nicht definiert. Um das Problem zu beheben, überprüfen Sie den Zeiger vor der Verwendung.
Codeanalysename: DEREF_NULL_PTR
Beispiel
Der folgende Code generiert diese Warnung, da ein Aufruf malloc
möglicherweise NULL zurückgibt, wenn nicht genügend Arbeitsspeicher verfügbar ist:
#include <malloc.h>
void f( )
{
char *p = ( char * ) malloc( 10 );
*p = '\0';
// code ...
free( p );
}
Um diese Warnung zu korrigieren, überprüfen Sie den Zeiger auf einen NULL-Wert, wie im folgenden Code gezeigt:
#include <malloc.h>
void f( )
{
char *p = ( char * )malloc ( 10 );
if ( p )
{
*p = '\0';
// code ...
free( p );
}
}
Funktionen verfügen möglicherweise über Parameter, die mithilfe der Null
Eigenschaft in einer Pre
Bedingung kommentiert werden. Weisen Sie den Speicher innerhalb dieser Funktionen zu, bevor Sie den Parameter ableiten. Im folgenden Code wird die Warnung C6011 generiert, weil der Versuch unternommen wird, einen NULL-Zeiger (pc
) in der Funktion zu dereferenzieren, ohne dass zuerst Speicher belegt wird:
#include <sal.h>
using namespace vc_attributes;
void f([Pre(Null=Yes)] char* pc)
{
*pc='\0'; // warning C6011 - pc is null
// code ...
}
Die unerlässige Verwendung und malloc
free
führt zu Speicherlecks und Ausnahmen. Um diese Arten von Lecks und Ausnahmeproblemen vollständig zu minimieren, vermeiden Sie die Zuordnung des rohen Speichers selbst. Verwenden Sie stattdessen die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu zählen shared_ptr
, unique_ptr
und vector
. Weitere Informationen finden Sie unter Smart Pointers and C++ Standard Library.
Heuristik
Eine Heuristik, die verwendet wird, um die Anzahl der Warnungen im Legacycode zu verringern, geht davon aus, dass ein Zeiger nicht -NULL
es sei denn, es gibt Beweise dafür NULL
. In den beispielen, die wir bisher gesehen haben, werden zeiger, die von malloc
oder new
möglicherweise zurückgegeben werden NULL
, weil die Zuordnung fehlschlägt. Ein weiteres Merkmal, das das Analysemodul als Nachweis der Nullbarkeit verwendet, ist, wenn das Programm explizit überprüft NULL
. Dies wird in den folgenden Beispielen veranschaulicht:
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
}
Im zweiten Fall kann der Benutzer die Warnung beheben, indem er die *n = 1
Zeile innerhalb des Falls-Blocks bewegt.