C28182
avviso C28182: Dereferenziazione del puntatore NULL.
Informazioni aggiuntive: <pointer1> contiene lo stesso valore NULL come <pointer2> ha fatto <note>
Lo strumento di analisi del codice riferisce questo avviso quando viene confermato che il puntatore può essere NULL.Se vi sono istanze non confermate in cui l'errore può verificarsi prima dell'analisi, lo strumento di analisi codice aggiunge il numero di riga della prima istanza del messaggio di avviso in modo da poter modificare il codice per comunicare a tutte le istanze.
<pointer2> viene confermato per essere potenzialmente NULL.<pointer1> contiene lo stesso valore pointer2 e viene dereferenziato.Poiché questi puntatori possono essere in posizioni molto diverse nel codice, entrambi sono riportati in modo da poter determinare perché lo strumento di analisi del codice segnali questo avviso.
Se un'istanza precedentemente non confermata della condizione esiste, <note> viene sostituito da questo testo: "Vedere la riga <number> per una posizione precedente in cui questo può verificarsi."
Esempio
L'esempio seguente viene mostra il codice che potrebbe causare la generazione di questo 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 che viene preso il percorso di codice nel corpo if .Tuttavia, poiché nBlockSize è potenzialmente zero, il corpo dell'istruzione for non viene eseguita e pNodeFree rimane invariato.pNodeFree viene quindi assegnato a pNodee pNode viene utilizzato mentre può verificarsi una dereferenziazione di un riferimento 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 il seguente avviso:
:\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 controllare pNode per zero prima di dereferenziarla in modo da evitare una dereferenziazione di un riferimento NULL.Nel codice seguente è illustrata 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;
}