Предупреждение 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.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по