共用方式為


C28182

警告 C28182: 取值 NULL 指標。

其他資訊: <pointer1> 包含相同 <pointer2> 進行 <note>的 null 值。

當程式碼剖析工具確認指標可能是空的時,將會報告這個警告。 如果有錯誤發生在追蹤可能發生之前的未經驗證的執行個體前,程式碼分析工具會將第一個執行個體的行號加入至這個警告訊息,讓您可以變更程式碼以處理所有執行個體。

<pointer2> 會檢查可能是空的。 <pointer1> 包含和 pointer2 相同的值並且解除參考。 由於這些指標可能在非常不同的程式碼,所以兩個都會報告,讓您可以判斷程式碼分析工具為何報告這個警告。

如果一個條件的未確認先前的執行個體存在,則 <note> 以此文字取代:「請參閱行 <number> 找出先前發生這個情形的位置」。

範例

下列範例顯示的程式碼,可能會導致程式碼剖析工具產生這個警告訊息。 在此範例中,程式碼分析工具判斷 pNodeFree 是空的if 陳述式,然後摘自程式碼路徑 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;
}