C28182

警告的 C28182:取消引用 NULL 指针。

附加信息: <pointer1> 包含与 <pointer2> 执行 <说明> 的 null 值

代码分析工具报告此警告,则确认时指针可以为空。如果存在错误在跟踪可能发生之前的未确认实例,代码分析工具添加第一个实例的行号到警告消息,以便您可以更改代码解决所有实例。

<pointer2> 认证是可以为 NULL 的。 <pointer1> 包含值和 pointer2 与和取消引用。由于这些指针可能在特定代码的不同位置,两个报告,以便您可以确定代码分析工具原因报告此警告。

如果条件中未确认早期的实例存在,则 <说明> 将此文本替换:“为可能会较早的位置请参见行 <数字> ”。

示例

会导致代码分析工具生成该警告消息下面的示例演示代码。在此示例中,代码分析工具确定 pNodeFree 为空在 if 语句,因此,代码路径。 if 的主体中上。但是,在中,因为 nBlockSize 可能是零, for 语句的主体不执行,并 pNodeFree 将非限定。pNodeFree 然后分配给 pNode,因此,使用 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;
    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 零在取消引用它,才能使一个空取消引用中避免。下面的代码演示此更正。

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;
}