Предупреждение C6011

Разыменовывание указателя NULL "pointer-name".

Замечания

Это предупреждение указывает, что код разоменовывает потенциально пустой указатель. Если значение указателя недопустимо, результат становится неопределенным. Чтобы устранить проблему, проверьте указатель перед использованием.

Имя анализа кода: DEREF_NULL_PTR

Пример

Следующий код создает это предупреждение, так как вызов может возвращать malloc значение NULL, если недостаточно памяти доступно:

#include <malloc.h>

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

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

Чтобы исправить это предупреждение, проверьте указатель на значение NULL, как показано в следующем коде:

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

    free( p );
  }
}

Функции могут иметь параметры, аннотированные с помощью Null свойства в условии Pre . Выделите память внутри этих функций перед расшифровки параметра. Следующий код создает предупреждение C6011, так как предпринята попытка разыменовки пустого указателя (pc) внутри функции без первого выделения памяти:

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

Небрежное использование malloc и free приводит к утечкам памяти и исключениям. Чтобы свести к минимуму эти утечки и проблемы исключений в целом, избегайте выделения необработанной памяти самостоятельно. Вместо этого используйте механизмы, предоставляемые стандартной библиотекой C++ (STL). Это операторы shared_ptr, unique_ptr, а также vector. Дополнительные сведения см. в разделе "Смарт-указатели " и стандартной библиотеки C++.

Эвристика

Эвристика, используемая для уменьшения числа предупреждений в устаревшем коде, предполагает, что указатель неNULL является нет, если нет доказательств того, что это NULL. В примерах, которые мы видели до сих пор, указатели, возвращаемые malloc или new могут быть NULL вызваны сбоем выделения. Другая характеристика, которую модуль анализа использует в качестве доказательства nullability, заключается в том, что программа явно проверка для NULL. Это показано в следующих примерах:

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
}

Во втором случае пользователь может исправить предупреждение, переместив *n = 1 строку внутри блока if.

См. также