Я пытаюсь обновить существующее приложение VC6 MFC до VS2010, после пары небольших исправлений старого файла .C я смог его скомпилировать. К сожалению, когда он запускается в режиме отладки или выпуска, я получаю:
Unhandled exception at 0x00000000 in OverUnderReport.exe: 0xC0000005: Access violation reading location 0x00000000.
Проведя некоторое время с отладчиком, я обнаружил, что строка с ошибкой была
IMPLEMENT_DYNCREATE(COverUnderReportDoc, CReportDoc)
в моем классе COverUnderReportDoc. Если я войду в функцию, она успешно выполнит все строки и вернется, но когда я выйду за строку после ее возврата, я получу исключение необработанного.
Есть идеи?
Редактировать: Копнув дальше в стек вызовов, я проследил точный источник сбоя до этой строки
pObject = (*m_pfnCreateObject)();
в блоке try ниже.
CObject* CRuntimeClass::CreateObject()
{
ENSURE(this);
if (m_pfnCreateObject == NULL)
{
TRACE(traceAppMsg, 0,
_T("Error: Trying to create object which is not ")
_T("DECLARE_DYNCREATE \nor DECLARE_SERIAL: %hs.\n"),
m_lpszClassName);
return NULL;
}
CObject* pObject = NULL;
TRY
{
pObject = (*m_pfnCreateObject)();
}
END_TRY
return pObject;
}
После взлома компилятор поднимает memset.asm
и выделяет последнюю строку в блоке кода ниже
; Set dword-sized blocks
mov ecx,edx ; move original count to ecx
and edx,3 ; prepare in edx byte count (for tail loop)
shr ecx,2 ; adjust ecx to be dword count
jz tail ; jump if it was less then 4 bytes
rep stosd