C28182
предупреждение C28182. Отмена ссылки с указателем NULL.
Дополнительные сведения: <pointer1> содержит такое же значение NULL, как <pointer2> и <note>
Средство анализа кода сообщает это предупреждение, когда оно подтверждает, что указатель может принимать значение NULL.Если есть неподтверждённые экземпляры, где ошибка может произойти ранее в трассировке, то средство анализа кода добавляет номер строки первого экземпляра к предупреждающему сообщению, чтобы можно было изменять код для исправления всех экземпляров.
Подтверждается, что <pointer2> возможно равен NULL.<pointer1> содержит то же значение, что и pointer2, и происходит его разыменование.Так как эти указатели могут быть в совершенно различных местах в коде, то они оба передаются, чтобы можно было определить, почему средство анализа кода сообщает это предупреждение.
Если ранее неподтверждённый экземпляр условия существует, то <note> заменено данным текстом: "См. строку <number> для предыдущего расположения, где это могло произойти."
Пример
В следующем примере показан код, в котором средство анализа кода может создать данное предупреждение.В этом примере средство анализа кода указывает то, что pNodeFree принимает значение NULL в операторе 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 и нуля до разыменовывания таким образом, что предотвратит разыменовывание значения 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;
}