警告 C6011

取消引用 NULL 指针“pointer-name”

注解

此警告指示代码取消引用潜在的 null 指针。 如果该指针的值无效,则结果是未定义的。 若要解决此问题,请在使用前验证指针。

代码分析名称: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 );
  }
}

函数可能使用 Pre 条件中的 Null 属性来注释参数。 取消引用参数之前,在这些函数中分配内存。 以下代码生成警告 C6011,因为尝试取消引用函数内的 null 指针 (pc),而无需首先分配内存:

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

不小心使用 mallocfree,导致内存泄漏和异常。 若要完全减少这些泄漏和异常问题,请避免自行分配原始内存。 请改用 C++ 标准库 (STL) 提供的机制。 其中包括 shared_ptrunique_ptrvector。 有关详细信息,请参阅智能指针C++ 标准库

启发

用于减少旧代码中警告数的启发式方法会假设指针是非 NULL 的,除非有证据表明它为 NULL。 在到目前为止我们所看到的示例中,由 mallocnew 返回的指针可能是 NULL,因为分配可能会失败。 分析引擎用作可为 null 证据的另一个特征是,程序是否会显式检查 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
}

在第二种情况下,用户可以通过在 if 块内移动 *n = 1 行来解决警告。

另请参阅