Partilhar via


C28182

C28182 de aviso: Desreferenciando o ponteiro NULL.

Informações adicionais: <pointer1> contém o mesmo valor NULO que <pointer2> fez <note>

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

<pointer2> é confirmada para ser potencialmente NULL.<pointer1> contém o mesmo valor que pointer2 e está sendo cancelado.Como esses ponteiros podem estar em locais bem diferentes no código, ambos são relatados de modo que você possa determinar como a ferramenta de análise de código está relatando esse aviso.

Se uma instância anterior não-confirmado de condição existir, então <note> é substituído por esse texto: Consulte “a linha <number> para um local anterior em que isso pode ocorrer.”

Exemplo

O exemplo a seguir mostra código que podem fazer com que a ferramenta de análise de código gerencia essa mensagem de aviso.Neste exemplo, a ferramenta de análise de código que determina pNodeFree é NULL na instrução de if , e o caminho de código no corpo de if é obtido.No entanto, como nBlockSize é potencialmente zero, o corpo da instrução de for não é executado e pNodeFree é fica inalterado.pNodeFree é então atribuído a pNode, e pNode é usado quando um NULL desreferenciar pode 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 informa 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 desreferenciar-lo de modo que um NULL desreferencie é evitada.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;
}