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