Compartir a través de


C28182

Advertencia C28182: Desreferenciando un puntero NULL.

Información adicional: <pointer1> contiene el mismo valor NULL que <pointer2> hizo <note>

La herramienta de análisis de código informa la advertencia cuando confirma que el puntero puede ser NULL.Si hay instancias sin confirmar donde el error puede ocurrir antes en el seguimiento, la herramienta de análisis de código agrega el número de la primera instancia al mensaje de advertencia para que pueda cambiar el código para resolver todas las instancias.

<pointer2> se confirma para ser potencialmente NULL.<pointer1> contiene el mismo valor que pointer2 y se desreferencia.Dado que los punteros pueden estar en lugares muy diferentes en el código, ambos se notifican para poder determinar por qué la herramienta de análisis de código apunta a la advertencia.

Si existe una instancia anterior de la condición sin confirmar, en ese caso <note> se reemplaza por el siguiente texto: “Vea la línea <number> para una ubicación anterior donde esto pueda ocurrir.”

Ejemplo

El siguiente ejemplo muestra el código que podría hacer que la herramienta de análisis de código generara el mensaje de advertencia.En el ejemplo siguiente, la herramienta de análisis de código determina que pNodeFree es NULL en el fragmento if, y se toma la ruta de código en el cuerpo deif.Sin embargo, como nBlockSize es potencialmente cero, el cuerpo de la instrucción for no se ejecuta y pNodeFree permanece sin modificar.pNodeFree luego se asigna a pNode y se utiliza pNode mientras una desreferenciación NULL podría aparecer.

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

La herramienta de análisis de código informa de la siguiente advertencia:

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

Una forma de corregir el ejemplo anterior es comprobar pNode para cero antes de desreferenciarlo de modo que se evite una desreferenciación NULL.El siguiente ejemplo de código muestra una corrección.

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