Поделиться через


C28182

предупреждение C28182. Отмена ссылки с указателем NULL.

Дополнительные сведения: <указатель1> содержит то же значение NULL, что и <указатель2><замечание>

Средство анализа кода сообщает это предупреждение, когда оно подтверждает, что указатель может принимать значение NULL.Если есть неподтверждённые экземпляры, где ошибка может произойти ранее в трассировке, то средство анализа кода добавляет номер строки первого экземпляра к предупреждающему сообщению, чтобы можно было изменять код для исправления всех экземпляров.

<указатель2> потенциально может иметь значение NULL.<указатель1> содержит то же значение, что и указатель2, и разыменован.Так как эти указатели могут быть в совершенно различных местах в коде, то они оба передаются, чтобы можно было определить, почему средство анализа кода сообщает это предупреждение.

Если ранее неподтверждённый экземпляр условия существует, то <замечание> заменено данным текстом: "См. строку <число> для предыдущего расположения, где это могло произойти."

Пример

В следующем примере показан код, в котором средство анализа кода может содать данное предупреждение.В этом примере средство анализа кода указывает то, что 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;
}