Sdílet prostřednictvím


C28182

upozornění C28182: odkazování ukazatele s hodnotou NULL.

Další informace o: <pointer1> obsahuje stejnou hodnotu NULL jako <pointer2> nebyla <note>

Nástroj pro analýzu kódu zprávy upozornění při potvrzuje, že ukazatel může mít hodnotu NULL.Existují nepotvrzené instance, kde může být chyba v trasování, přidá nástroj pro analýzu kódu číslo řádku v první instanci k upozornění tak, že změníte kód adresy všech instancí.

<pointer2> je potvrzeno na potenciálně hodnotu NULL.<pointer1> obsahuje stejnou hodnotu jako pointer2 a je právě dereferenced.Tyto ukazatele mohou být na různých místech v kódu, a obě jsou hlášeny aby zjistit, proč je nástroj pro analýzu kód vykazování toto upozornění.

Pokud nepotvrzené předchozí instance podmínka existuje, pak <note> se nahrazuje tímto textem: "čára <number> pro dřívější umístění, kde k tomu může dojít."

Příklad

Následující příklad zobrazuje kód, který by mohl způsobit nástroj pro analýzu kódu generovat upozornění.V tomto příkladu určuje kód analytický nástroj, pNodeFree hodnotu NULL v if prohlášení a cesty kódu do textu if je přijata.Však protože nBlockSize je potenciálně nula těla for příkaz není proveden a pNodeFree je vlevo nezměněna.pNodeFreepřiřazen k pNode, a pNode průběhu by mohlo dojít k dereference hodnotu 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;
}

Nástroj pro analýzu kódu zprávy následující upozornění:

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

Jedním způsobem, jak opravit předchozí příklad je kontrola pNode pro před přesměrování jej tak, aby je NULL dereference odvrácení nulu.Následující kód ukazuje tato korekce.

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