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 mallocfree 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.

Siehe auch