C28182
Warnung C28182: NULL-Zeiger wird dereferenziert.
Zusätzliche Informationen: <pointer1> enthält denselben NULL-Wert, dem <pointer2> <Hinweis> tat
Das Codeanalysetool gibt diese Warnung aus, wenn sie bestätigt, dass der Zeiger NULL sein kann.Wenn unbestätigte Instanzen gibt, in denen der Fehler möglicherweise früher in der Ablaufverfolgung könnte, fügt das Codeanalysetool die Zeilennummer der ersten Instanz der Warnmeldung hinzugefügt, damit Sie den Code ändern können, um alle Instanzen zu begegnen.
<pointer2> wird bestätigt, um möglicherweise NULL sein. <pointer1> enthält den gleichen Wert wie pointer2 und wird dereferenziert.Da diese Zeiger an sehr unterschiedlichen Stellen im Code sind, werden beide angezeigt, damit Sie feststellen können, warum das Codeanalysetool diese Warnung ausgegeben.
Wenn eine unbestätigte vorherige Instanz der Bedingung vorhanden ist, wird <Hinweis> durch diesen Text ersetzt: <Zahl> Zeile „Siehe für einen vorherigen Speicherort, an dem diese auftreten kann.“
Beispiel
Das folgende Beispiel zeigt Code, der das Codeanalysetool konnte dazu führen, diese Warnmeldung generiert wird.In diesem Beispiel ermittelt das Codeanalysetool, dass pNodeFree in der if-Anweisung NULL ist, und der Codepfad in den Text if wird.Da jedoch möglicherweise nBlockSize (null) ist, wird der Text der for-Anweisung nicht ausgeführt, und pNodeFree wird unverändert gelassen.pNodezugewiesen, und anschließend wirdpNodeFreepNode wird, während NULL kann eintreten wird dereferenziert.
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;
}
Das Codeanalysetool meldet die folgende Warnung:
:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24
Eine Möglichkeit für das vorherige Beispiel zu beheben, pNode für Nullen zu überprüfen, bevor es auf NULL ist, sodass abgewendet wird dereferenziert.Im folgenden Code wird dieser Korrektur an.
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;
}