Advertencia C28182

Desreferenciación de un puntero null.

Información adicional: <pointer1> contiene el mismo valor NULL que <el puntero2> . <Nota>

La herramienta de análisis de código notifica esta advertencia cuando confirma que el puntero puede ser null. Si hay instancias no confirmadas en las que el error puede producirse anteriormente en el seguimiento, la herramienta de análisis de código agrega el número de línea de la primera instancia al mensaje de advertencia para que pueda cambiar el código a fin de abordar todas las instancias.

<pointer2> se confirma que posiblemente es null. <pointer1> contiene el mismo valor que pointer2 y se está desreferenciando. Dado que estos punteros pueden estar en diferentes lugares del código, ambos se notifican para que pueda determinar por qué la herramienta de análisis de código notifica esta advertencia.

Si existe una instancia anterior no confirmada de la condición, <note> se reemplaza por este texto: "Vea la línea <number> de una ubicación anterior en la que esto pueda producirse".

Ejemplos

En el ejemplo siguiente se muestra el código que podría provocar que la herramienta de análisis de código genere este mensaje de advertencia. En este ejemplo, la herramienta de análisis de código determina que pNodeFree es null en la instrucción if y se toma la ruta de acceso del código en el cuerpo de if. Sin embargo, dado que nBlockSize es potencialmente cero, el cuerpo de la for instrucción no se ejecuta y pNodeFree se deja sin modificar. Después, pNodeFree se asigna a pNode y pNode se usa mientras podría producirse una desreferencia 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;
}

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

:\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 manera de corregir el ejemplo anterior es comprobar pNode en busca de un cero antes de desreferenciarla, de modo que se evite una desreferencia null. En el código siguiente se muestra esta 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;
}