警告 C28182

取消引用 NULL 指针。

附加信息:<pointer1> 与 <pointer2> 包含相同的 NULL 值。 <备注>

当代码分析工具确认指针可能为 NULL 时,将报告此警告。 如果有未确认的实例(其中可能在跟踪前期发生此错误),则代码分析工具将在警告消息中添加第一个实例的行号,以便你能够更改代码以处理所有实例。

<pointer2> 经确认可能为 NULL。 <pointer1> 包含与 pointer2 相同的值,并且正在被取消引用。 由于这些指针在代码中可能处于不同位置,因此将同时报告两个指针,以便你可以确定代码分析工具报告此警告的原因。

如果存在此情况的未确认的早期实例,则 <note> 将替换为以下文本:“查看第 <number> 行以找出可能会发生此情况的前一位置。”

示例

下面的示例演示可能导致代码分析工具生成此警告消息的代码。 在此示例中,代码分析工具确定 pNodeFree 语句中的 if 是 NULL,然后采用前往 if 主体的代码路径。 但由于 nBlockSize 可能为零,因此不会执行 for 语句的正文,并且不会对 pNodeFree 进行修改。 随后,将 pNodeFree 分配到 pNode,并且在发生 NULL 取消引用时使用 pNode

typedef struct xlist {
    struct xlist *pNext;
    struct xlist *pPrev;
} list;

list *pNodeFree;
list *masterList;
int nBlockSize;

void fun()
{
    if (pNodeFree == 0)
    {
        list *pNode = masterList;

        for (int i = nBlockSize-1; i >= 0; i--, pNode--)
        {
            pNode->pNext = pNodeFree;
            pNodeFree = pNode;
        }
    }

    list* pNode = pNodeFree;
    pNode->pPrev = 0;
}

代码分析工具将报告以下警告:

:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24

一种更正早期示例的方法是检查 pNode 是否为零,然后再取消引用,以避免 NULL 取消引用。 下面的代码演示此更正方法。

typedef struct xlist {
    struct xlist *pNext;
    struct xlist *pPrev;
} list;

list *pNodeFree;
list *masterList;
int nBlockSize;

void fun()
{
    if (pNodeFree == 0)
    {
        list *pNode = masterList;

        for (int i = nBlockSize-1; i >= 0; i--, pNode--)
        {
            pNode->pNext = pNodeFree;
            pNodeFree = pNode;
        }
    }

    list* pNode = pNodeFree;
    if(pNode != 0)
      pNode->pPrev = 0;
}