Предупреждение C28182
Разыменование пустого (NULL) указателя.
Дополнительные сведения: <указатель1> содержит то же значение NULL, что <и указатель2> . <Примечание>
Средство анализа кода сообщает об этом предупреждении при подтверждении того, что указатель может иметь значение NULL. Если в трассировке могут возникнуть неподтвержденные экземпляры, то средство анализа кода добавляет номер строки первого экземпляра в предупреждение, чтобы можно было изменить код на адрес всех экземпляров.
<Значение pointer2> подтверждается потенциально null. <pointer1> содержит то же значение, что и pointer2 , и разыменовываются. Так как эти указатели могут находиться в разных местах в коде, они сообщаются таким образом, чтобы определить, почему средство анализа кода сообщает об этом предупреждении.
Если существует неподтвержденный более ранний экземпляр условия, <обратите внимание> на текст: "См. номер> строки <для более раннего расположения, где это может произойти".
Примеры
В следующем примере показан код, который может привести к созданию этого предупреждения средством анализа кода. В этом примере средство анализа кода определяет значение pNodeFree
NULL в if
инструкции, а путь кода к тексту if
принимается. Тем не менее, поскольку nBlockSize
потенциально нулевой, текст инструкции for
не выполняется и pNodeFree
остается не измененным. pNodeFree
затем назначается pNode
и pNode
используется, пока может произойти разыменовка 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;
}
Средство анализа кода сообщает следующее предупреждение:
:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24
Один из способов исправить предыдущий пример заключается в том, чтобы проверка pNode
для нуля, прежде чем разоменовывать его таким образом, чтобы превратилось разыменовывание 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;
if(pNode != 0)
pNode->pPrev = 0;
}
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по