Condividi tramite


Avviso C28182

Deferenziazione del puntatore NULL.

Informazioni aggiuntive:< pointer1> contiene lo stesso valore NULL del <puntatore2>. <Nota>

Lo strumento di analisi del codice segnala questo avviso quando conferma che il puntatore può essere NULL. Se sono presenti istanze non confermate in cui l'errore potrebbe verificarsi in precedenza nella traccia, lo strumento di analisi del codice aggiunge il numero di riga della prima istanza al messaggio di avviso in modo che sia possibile modificare il codice in modo che indirizzi tutte le istanze.

<pointer2> viene confermato che sia potenzialmente NULL. <pointer1> contiene lo stesso valore del puntatore2 e viene dereferenziato. Poiché questi puntatori possono trovarsi in posizioni diverse nel codice, entrambi vengono segnalati in modo da determinare il motivo per cui lo strumento di analisi del codice segnala questo avviso.

Se esiste un'istanza precedente non confermata della condizione, <la nota> viene sostituita da questo testo: "Vedere il numero> di riga <per una posizione precedente in cui ciò può verificarsi".

Esempi

L'esempio seguente mostra il codice che potrebbe causare la generazione del messaggio di avviso da parte dello strumento di analisi del codice. In questo esempio, lo strumento di analisi del codice determina che pNodeFree è NULL nell'istruzione if e viene acquisito il percorso del codice nel corpo di if . Tuttavia, poiché nBlockSize è potenzialmente zero, il corpo dell'istruzione for non viene eseguito e pNodeFree rimane invariato. pNodeFree viene quindi assegnato a pNodee pNode viene usato mentre può verificarsi una dereferenziazione 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;
}

Lo strumento di analisi del codice segnala l'avviso seguente:

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

Un modo per correggere l'esempio precedente consiste nel verificare pNode la presenza di zero prima di dereferenziarla in modo che venga evitata una dereferenziazione NULL. Il codice seguente illustra questa correzione.

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