C28182
Ostrzeżenie C28182: cofający odwołanie wskaźnik o wartości NULL.
Dodatkowe informacje o: <pointer1> zawiera tę samą wartość NULL jako <pointer2> czy <note>
Narzędzie do analizy kodu raportów to ostrzeżenie, gdy potwierdza, że wskaźnik może być NULL.W przypadku wystąpienia niepotwierdzone gdzie wcześniej w śledzenia, może wystąpić błąd, narzędzie do analizy kodu dodaje numer wiersza w pierwszej instancji do komunikat ostrzegawczy, dzięki czemu można zmienić kod, którego adres wszystkich wystąpień.
<pointer2> jest potwierdzone, że są potencjalnie NULL.<pointer1> zawiera taką samą wartość jak pointer2 i jest jest usunąć odwołania.Ponieważ wskaźniki te mogą być bardzo różnych miejscach w kodzie, oba są raportowane tak, aby ustalić, dlaczego narzędzie do analizy kodu jest zgłoszenie to ostrzeżenie.
Jeśli niepotwierdzone wcześniejszych wystąpienie stanu istnieje, następnie <note> zastępuje ten tekst: "Zobacz linii <number> dla wcześniejszych lokalizacji, gdzie może się to zdarzyć."
Przykład
Poniższy przykład zawiera kod, który może spowodować, że narzędzie do analizy kodu wygenerować ten komunikat ostrzegawczy.W tym przykładzie narzędzie do analizy kodu ustali, że pNodeFree ma wartość NULL w if instrukcji oraz ścieżkę do kodu do treści if jest pobierana.Jednakże ponieważ nBlockSize jest potencjalnie zero, organ for instrukcja nie jest wykonywana i pNodeFree jest po lewej stronie niemodyfikowane.pNodeFreenastępnie jest przypisywany do pNode, i pNode jest używany podczas, gdy może nastąpić dereference wartości 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;
}
Narzędzie do analizy kodu zgłasza następujące ostrzeżenie:
:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24
Jednym ze sposobów poprawienia wcześniejszego przykładu jest sprawdzenie pNode do zera przed cofając ją tak, aby NULL dereference jest zagrażającego.Poniższy kod ilustruje tej korekty.
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;
}