Ostrzeżenie C6011

Wyłuszczenie wskaźnika NULL "pointer-name".

Uwagi

To ostrzeżenie wskazuje, że kod wyłusza potencjalnie wskaźnik o wartości null. Jeśli wartość wskaźnika jest nieprawidłowa, wynik jest niezdefiniowany. Aby rozwiązać ten problem, przed użyciem zweryfikuj wskaźnik.

Nazwa analizy kodu: DEREF_NULL_PTR

Przykład

Poniższy kod generuje to ostrzeżenie, ponieważ wywołanie malloc metody może zwrócić wartość null, jeśli jest dostępna niewystarczająca ilość pamięci:

#include <malloc.h>

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

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

Aby poprawić to ostrzeżenie, sprawdź wskaźnik dla wartości null, jak pokazano w poniższym kodzie:

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

    free( p );
  }
}

Funkcje mogą mieć parametry z adnotacjami przy użyciu Null właściwości w warunku Pre . Przydziel pamięć wewnątrz tych funkcji przed wyłuszczeniem parametru. Poniższy kod generuje ostrzeżenie C6011, ponieważ podjęto próbę wyłudzenia wskaźnika o wartości null (pc) wewnątrz funkcji bez uprzedniego przydzielenia pamięci:

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

Nieostrogowe malloc użycie i free prowadzi do przecieków pamięci i wyjątków. Aby zminimalizować te rodzaje przecieków i problemów z wyjątkami, należy unikać samodzielnego przydzielania nieprzetworzonej pamięci. Zamiast tego należy użyć mechanizmów udostępnianych przez standardową bibliotekę języka C++ (STL). Należą do nich shared_ptr: , unique_ptri vector. Aby uzyskać więcej informacji, zobacz Inteligentne wskaźniki i Standardowa biblioteka języka C++.

Algorytmy heurystyczne

Heurystyczny używany do zmniejszenia liczby ostrzeżeń w starszym kodzie zakłada, że wskaźnik nie jest -NULL chyba że istnieją dowody, że jest NULLto . W przykładach, które widzieliśmy do tej pory, wskaźniki zwrócone przez malloc lub new mogą być NULL spowodowane niepowodzeniem alokacji. Inną cechą, która jest używana przez aparat analizy jako dowód wartości null, jest to, czy program jawnie sprawdza wartość NULL. Przedstawiono to w następujących przykładach:

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
}

W drugim przypadku użytkownik może naprawić ostrzeżenie, przenosząc *n = 1 wiersz wewnątrz bloku if.

Zobacz też