Advertencia C6011

Desreferenciar el puntero NULL 'pointer-name'.

Comentarios

Esta advertencia indica que el código desreferencia un puntero potencialmente nulo. Si el valor de puntero no es válido, el resultado es indefinido. Para resolver el problema, valide el puntero antes de su uso.

Nombre del análisis de código: DEREF_NULL_PTR

Ejemplo

El código siguiente genera esta advertencia porque una llamada a malloc podría devolver null si no hay disponible memoria suficiente:

#include <malloc.h>

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

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

Para corregir esta advertencia, examine el puntero para ver si tiene un valor nulo como se muestra en el código siguiente:

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

    free( p );
  }
}

Las funciones pueden tener parámetros anotados mediante la propiedad Null de una condición Pre. Asigne memoria dentro de estas funciones antes de desreferenciar el parámetro. El código siguiente genera la advertencia C6011 porque se intenta desreferenciar un puntero NULL (pc) dentro de la función sin asignar la memoria antes:

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

El uso sin cuidado de malloc y free conduce a pérdidas de memoria y excepciones. Para minimizar estos tipos de pérdidas y problemas de excepciones, evite asignar memoria sin procesar por su cuenta. En su lugar, use los mecanismos proporcionados por la Biblioteca estándar (STL) C++. Estas incluyen shared_ptr , unique_ptr y vector . Para más información, consulte los artículos sobre punteros inteligentes y biblioteca estándar de C++.

Heurística

Una heurística que se usa para reducir el número de advertencias en el código heredado supone que un puntero no esNULL a menos que haya evidencia de que es NULL. En los ejemplos que hemos visto hasta ahora, los punteros devueltos por malloc o new podrían deberse NULL a que se podría producir un error en la asignación. Otra característica que el motor de análisis usa como evidencia de nulabilidad es si el programa comprueba explícitamente para NULL. Esto se ilustra en los ejemplos siguientes:

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
}

En el segundo caso, el usuario puede corregir la advertencia moviendo la *n = 1 línea dentro del bloque if.

Consulte también