Компилятор С++ и его странности
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Компилятор С++ и его странности - 2008-12-06 13:28:17.843333
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Vстудия 2008. Релиз Исходник:
class UNetworkHandler;
typedef User* (UNetworkHandler::*T_GetUser)(int a1);
...
__declspec(dllexport) UNetworkHandler *g_NetworkHandler;
__declspec(dllexport) T_GetUser GetUser;
...
__debugbreak();
User *U = (g_NetworkHandler->*GetUser)(g_UserID);
__debugbreak();
Итог:
.text:1000127B int 3 ; Trap to Debugger
.text:1000127C mov ecx, dword_10013B84
.text:10001282 test ecx, ecx
.text:10001284 jnz short loc_10001295
.text:10001286 mov eax, UNetworkHandler * g_NetworkHandler
.text:1000128B mov ecx, dword_10013B7C
.text:10001291 add ecx, eax
.text:10001293 jmp short loc_100012B0
.text:10001295 ; ---------------------------------------------------------------------------
.text:10001295
.text:10001295 loc_10001295: ; CODE XREF: sub_10001270+14j
.text:10001295 mov eax, dword_10013B80
.text:1000129A mov edx, UNetworkHandler * g_NetworkHandler
.text:100012A0 mov esi, [eax+edx]
.text:100012A3 mov ecx, [esi+ecx]
.text:100012A6 add ecx, eax
.text:100012A8 add ecx, dword_10013B7C
.text:100012AE add ecx, edx
.text:100012B0
.text:100012B0 loc_100012B0: ; CODE XREF: sub_10001270+23j
.text:100012B0 mov edx, ulong g_UserID
.text:100012B6 push edx
.text:100012B7 call User * (UNetworkHandler::*GetUser)(int)
.text:100012BD int 3 ; Trap to Debugger
Моему обфускационному возмущению нет предела. Почему вместо int3 push ulong g_UserID mov ecx, UNetworkHandler * g_NetworkHandler call User * (UNetworkHandler::*GetUser)(int) int3 я наблюдаю то же, что и вы?
|
|
|
RE: Компилятор С++ и его странности - 2008-12-06 21:03:58.753333
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Ну, и где же вы, рыцари кода?
|
|
|
RE: Компилятор С++ и его странности - 2008-12-06 21:20:14.560000
|
|
|
Mатцал Коушек
Сообщений: 10407
Оценки: 91
Присоединился: 2008-07-09 10:27:49.520000
|
quote:
ORIGINAL: D. Scandal Ну, и где же вы, рыцари кода? Я рыцарь кода и кожаного кинжала. Я здесь. Скажи, какую конечную задачу должен выполнять код?
|
|
|
RE: Компилятор С++ и его странности - 2008-12-06 21:34:38.420000
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Опа! Да ты скорее, пират с острым кортиком. Знание конечной задачи кода не поможет решить данную проблему. В общем, я надорвала психику пытаясь перенести рабочий код с фасма на С++. И желаю, чтобы откомпиленный код С++ был не хуже исходного. Но тщетность меня поработила. Надеюсь, временно.
|
|
|
RE: Компилятор С++ и его странности - 2008-12-06 21:38:46.593333
|
|
|
Mатцал Коушек
Сообщений: 10407
Оценки: 91
Присоединился: 2008-07-09 10:27:49.520000
|
Неясно, надо файл кодить или не надо? Исполняемый? Код я выкладывать не буду, только конечный продукт. … Согласие - есть продукт непротивления сторон.(Боже.. а о чём это я? К чему это…)
|
|
|
RE: Компилятор С++ и его странности - 2008-12-06 21:43:20
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Инспектор, ты меня улыбаешь. Кодить ничего на данный момент не надо. Необходимо выснить причину некорректной работы компилятора или моих мозгов. Подозреваю, что ему (компилятору) что-то неизвестно. Он как-то извращенно рассматривает исходный код. Пример извращения приведен выше.
|
|
|
RE: Компилятор С++ и его странности - 2008-12-07 02:51:44.683333
|
|
|
Archivarius
Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
|
На самом деле вот такой вот компиллятор. Да и Борландовский С++ не лучше.. Кстати, ты ж вроде Intel C++ Compiller в студию интегрировать пыталась, у него код не смотрела? В Visual C++ мне так и не удалось inline функцию сделать. Даже если явно укажешь что inline и вызовешь всего один раз, она всё равно будет не inline. Ещё почему-то инкремент (++переменная) делается не с помощью команды inc, а через прибавление единицы. Да много всяких страностей..
|
|
|
RE: Компилятор С++ и его странности - 2008-12-07 11:39:14.346666
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Archivarius, да, где я только этот код не смотрела. Все чичи уже протаранила (с) Штемп Всю ночь медитировала, в поисках истины. Для истории: В ходе расследования, удалось выяснить, что это особенности работы pointer-to-member в C++. В данном случае sizeof(T_GetUser) = 16, а не 4, как обычно. В этой ситуации копмилятор понятия не имеет, что есть класс UNetworkHandler и что за перец указатель GetUser, посему чудит без баяна. Нужно копать там, где в g_NetworkHandler находятся элементы класса UNetworkHandler и колдовать с указателем this класса Derived, чтобы он стал указателем this класса UNetworkHandler. Таким образом, код:
push [g_UserID]
mov ecx, [g_NetworkHandler]
call [GetUser]
неверен: несовпадение this для функции [GetUser] с [g_NetworkHandler]. Но при сильном желании:
class __single_inheritance UNetworkHandler;
Ву а ля.
|
|
|
|
|