C28182

Aviso C28182: apontar ponteiro NULL.

Informações adicionais: <pointer1> contém o mesmo valor nulo como <pointer2> foi <note>

A ferramenta de análise de código relata esse aviso quando ela confirma que o ponteiro pode ser nulo.Se houver instâncias não confirmadas onde o erro pode ocorrer anteriormente no rastreamento, a ferramenta de análise de código adiciona o número da linha da primeira instância para a mensagem de aviso para que você possa alterar o código para tratar todas as instâncias.

<pointer2> for confirmado que para pode ser potencialmente nulo.<pointer1> contém o mesmo valor de pointer2 e a referência está sendo cancelada.Porque esses ponteiros podem estar em locais muito diferentes do código, ambos são relatados para que você possa determinar por que a ferramenta de análise de código está relatando a esse aviso.

Se não confirmada anterior existir uma instância da condição, em seguida, <note> é substituído por este texto: "Consulte a linha <number> para um local anterior onde isso pode ocorrer."

Exemplo

O exemplo a seguir mostra o código que pode causar a ferramenta de análise de código gerar essa mensagem de aviso.Neste exemplo, a ferramenta de análise de código determina que pNodeFree é NULL na if instrução e o caminho do código no corpo da if é tirado.No entanto, porque nBlockSize é potencialmente zero, o corpo da for declaração não é executada e pNodeFree esquerda não modificada.pNodeFreeem seguida, é atribuído a pNode, e pNode é utilizado enquanto desreferenciamento NULL poderia ocorrer.

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

A ferramenta de análise de código relata o seguinte aviso:

:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24

Uma maneira de corrigir o exemplo anterior é verificar pNode para zero antes de cancelar a referência para que desreferenciamento NULL é evitado.O código a seguir mostra essa correção.

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