警告 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 ...
}
不小心使用 malloc
和 free
,导致内存泄漏和异常。 若要完全减少这些泄漏和异常问题,请避免自行分配原始内存。 请改用 C++ 标准库 (STL) 提供的机制。 其中包括 shared_ptr
、unique_ptr
和 vector
。 有关详细信息,请参阅智能指针和 C++ 标准库。
启发
用于减少旧代码中警告数的启发式方法会假设指针是非 NULL
的,除非有证据表明它为 NULL
。 在到目前为止我们所看到的示例中,由 malloc
或 new
返回的指针可能是 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
行来解决警告。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈