Share via


C28182

경고 C28182: NULL 포인터 'node'를 역참조하고 있습니다.

자세한 내용은: <pointer1> 은 <pointer2> 가 <note> 을 하는 것과 같이 같은 NULL 값을 포함합니다.

코드 분석 도구 포인터는 NULL이 될 수 있는지 확인 하는 경우 이 경고를 보고 합니다.확인 되지 않은 인스턴스가 이전 추적에서 발생하는 오류와 같은 곳에 있는 경우, 코드 분석 도구는 첫 번째 인스턴스의 줄 번호를 경고 메시지에 추가하여 모든 인스턴스의 주소에 코드를 바꿀 수 있습니다.

<pointer2> 는 잠재적으로 NULL로 확인 되었습니다.<pointer1> 는 역참조되고 있고 pointer2 과 같은 값을 포함하고 있습니다.이러한 포인터는 매우 다른 부분에 있을 수 있기 때문에 코드 분석 도구는 이 경고를 보고 하는 이유를 확인할 수 있도록 보고 됩니다.

조건 확인되지 않은 이전 인스턴스가 있는 경우 다음 <note> 이 텍스트로 바뀝니다: " <number> 선은 이전 위치에 대해 발생할 수 있습니다."

예제

다음 예제에서는 이 경고 메시지를 생성하는 코드 분석 도구를 일으킬 수 있는 코드를 보여 줍니다.이 예제에서는 코드 분석 도구로 pNodeFree 이 if 에 null인 것을 결정하고 본문에 코드 경로를 if 를 가져와 수행되지 않습니다.그러나 nBlockSize 는 잠재적으로 0이기 때문에, 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

이전 예제를 수정 하는 방법을 확인하는 방법은 역참조되기 전에 0에 대한 pNode 을 참조하여 NULL 역참조가 averted되는 것입니다.다음 코드에서는 이러한 작업이 성공하는 이유를 보여 줍니다.

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