C28182

警告 C28182:正在取消 NULL 指针。

附加信息:包含 <pointer1> 与 <pointer2> 执行 <note>的 Null 值

代码分析工具报告此警告,在确认时指针可能为 NULL。如果有未提交的实例,在跟踪中错误可能提早发生,该代码分析工具添加第一个实例的行号到警告消息,以便您能够更改代码以定位所有实例。

<pointer2> 确认为潜在的 NULL。<pointer1> 包含值和 pointer2 相同的值,并正在取消引用。由于这些指针可能在代码非同寻常的位置上,两个都会报告,因此你可以确定代码分析工具为什么将报告此警告。

如果未提交的早期实例情况存在,则 <note> 由此文本替换:“针对这种情况会发生的更早位置中查看行 <number>”。

示例

接下去的例子演示可能导致代码分析工具生成此警告消息的代码。在下面的示例中,代码分析工具确定在 if 语句中的 pNodeFree 是 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;
}