Задача по dword ptr [...] с visual studio 2010 - PullRequest
3 голосов
/ 26 июля 2011

Я пытаюсь скомпилировать программу, которая работала с компилятором Visual C ++ 6.0. Теперь, я компиляции с помощью компилятора в Visual Studio 2010. Она компилирует, но моя программа падает на присвоение переменной:

sapHigh = ctx->saphigh;

В коде ассемблера (с помощью Visual Studio Debugger), эта инструкция есть:

00410DF3  mov         eax,dword ptr [ctx]  
00410DF6  mov         ecx,dword ptr [eax+20h]  
00410DF9  mov         dword ptr [sapHigh],ecx 

Инструкция "MOV EAX, DWORD PTR [CTX]" вернуться 0x00000000 в EAX и аварийное завершение работы программы. Но отладчик может видеть реальное значение указателя CTX, который «0x0172287a». Если я изменю значение регистра eax на его реальное значение «0x0172287a», программа все еще будет работать до следующего назначения.

Кто-нибудь знает, почему эта команда не работает? Это проблема с параметрами компиляции?

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Это большой разрыв в 10-12 лет. Я рекомендую вам скомпилировать программу в VC10 с включенными ВСЕМИ предупреждениями компилятора и попытаться удалить все из них. Он включает в себя все предупреждения, связанные с устаревшими компонентами, 64-разрядные предупреждения, предупреждения о производительности и предупреждения, совместимые с C ++.

0 голосов
/ 12 августа 2011

Что если вы попробуете lea eax, dword ptr[ctx]?

Также я видел подобные проблемы, возникающие, когда указатель на массив передается функции.Когда массив определен внутри функции, все в порядке.

0 голосов
/ 26 июля 2011

Похоже, память для переменной ctx недействительна. Если ctx является, например, частью некоторой динамически размещенной структуры, которая была освобождена ранее, или если это ссылка или указатель на переменную стека вне области видимости, могут возникнуть все виды неопределенных действий.

Использование недопустимой памяти может не дать сбоя, если (случайно) никакие другие функции не перезапишут эту память, но использование другого компилятора и другой библиотеки времени выполнения может легко привести к другим результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...