Freigeben über


Warnung C28182

Dereferenzierender NULL-Zeiger.

Zusätzliche Informationen: Zeiger1> enthält den gleichen NULL-Wert wie< zeiger2>.< <Hinweis>

Das Codeanalysetool meldet diese Warnung, wenn bestätigt wird, dass der Zeiger NULL sein kann. Wenn es nicht bestätigte Instanzen gibt, in denen der Fehler früher in der Ablaufverfolgung auftreten kann, fügt das Codeanalysetool der Warnmeldung die Zeilennummer der ersten Instanz hinzu, sodass Sie den Code so ändern können, dass alle Instanzen behandelt werden.

<Zeiger2> wird als potenziell NULL bestätigt. <Zeiger1> enthält denselben Wert wie Zeiger2 und wird abgeleitet. Da sich diese Zeiger möglicherweise an verschiedenen Stellen im Code befinden, werden beide gemeldet, sodass Sie bestimmen können, warum das Codeanalysetool diese Warnung meldet.

Wenn eine nicht bestätigte frühere Instanz der Bedingung vorhanden ist, <>wird diese durch diesen Text ersetzt: "Siehe Zeilennummer <> für einen früheren Ort, an dem dies auftreten kann."

Beispiele

Das folgende Beispiel zeigt Code, der dazu führen kann, dass das Codeanalysetool diese Warnmeldung generiert. In diesem Beispiel bestimmt das Codeanalysetool, dass pNodeFree in der if Anweisung NULL ist, und der Codepfad in den Textkörper der if Datei wird übernommen. Da nBlockSize jedoch potenziell null ist, wird der Textkörper der for Anweisung nicht ausgeführt und pNodeFree bleibt unverändert. pNodeFree wird dann zugewiesen pNodeund pNode wird verwendet, während eine NULL-Ableitung auftreten kann.

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 zum Korrigieren des früheren Beispiels besteht darin, vor dem Ableiten auf Null zu überprüfen pNode , sodass eine NULL-Ableitung aufgehoben wird. Der folgende Code zeigt diese Korrektur.

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