Предупреждение C28182

Разыменование пустого (NULL) указателя.

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

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

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

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

Примеры

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