warning C6011: NULL 포인터 '이름'을(를) 역참조하고 있습니다.




 VS2008 의 "코드 분석" 을 하면 볼 수 있는 경고 메시지 이다.


※ 메시지가 발생한 코드

INT       nIndex     = 0;
INT       nItemCount = m_EvtFindList.GetCount();
POSITION  pos        = m_EvtFindList.GetHeadPosition();
CEvtFind *pEvtFind  = NULL;

for (nIndex = 0; nIndex < nItemCount; nIndex++)
{
    pEvtFind = reinterpret_cast<CEvtFind *>(m_EvtFindList.GetNext(pos));

    if (0 == _rsLogName.CompareNoCase(pEvtFind->GetLogName()))
        break;

    if (nIndex == nItemCount - 1)
        return _T("");
}

return pEvtFind->GetRangeName();



코드를 보면 pEvtFind 변수가 NULL로 초기화 되어 있다.
for 반복문에서 pEvtFind 값이 설정이 되고 return 문에서 pEvtFind 를 사용하고 있다.
코드를 작성할 때는 당연히 pEvtFind 값이 for 문을 나오면 NULL 포인터가 아님을 확신하고 작성하였다.
하지만 컴파일러는 for() 문에서 바로 빠져 나오면 return 문에서 NULL 값을 가진 pEvtFind 사용할 수 있음을 경고 하는
것이다.
 경고를 없애기 위해 다음과 같이 코딩 해 주었다.

INT       nIndex     = 0;
INT       nItemCount = m_EvtFindList.GetCount();
POSITION  pos        = m_EvtFindList.GetHeadPosition();
CEvtFind *pEvtFind  = NULL;

for (nIndex = 0; nIndex < nItemCount; nIndex++)
{
    pEvtFind = reinterpret_cast<CEvtFind *>(m_EvtFindList.GetNext(pos));

    if (0 == _rsLogName.CompareNoCase(pEvtFind->GetLogName()))
        break;

    if (nIndex == nItemCount - 1)
        return _T("");
}

if (NULL == pEvtFind)
    return _T("");

return pEvtFind->GetRangeName();



cf) http://msdn.microsoft.com/ko-kr/library/2ayc37ac.aspx
Posted by six605
,