Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Компилятор С++ и его странности

Пользователи, просматривающие топик: 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-&gt;*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

я наблюдаю то же, что и вы?
Post #: 1
RE: Компилятор С++ и его странности - 2008-12-06 21:03:58.753333   
D. Scandal

Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
Ну, и где же вы, рыцари кода?
Post #: 2
RE: Компилятор С++ и его странности - 2008-12-06 21:20:14.560000   
Mатцал Коушек

Сообщений: 10407
Оценки: 91
Присоединился: 2008-07-09 10:27:49.520000
quote:

ORIGINAL: D. Scandal

Ну, и где же вы, рыцари кода?

Я рыцарь кода и кожаного кинжала.
Я здесь.

Скажи, какую конечную задачу должен выполнять код?
Post #: 3
RE: Компилятор С++ и его странности - 2008-12-06 21:34:38.420000   
D. Scandal

Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
Опа! Да ты скорее, пират с острым кортиком. Знание конечной задачи кода не поможет решить данную проблему.

В общем, я надорвала психику пытаясь перенести рабочий код с фасма на С++. И желаю, чтобы откомпиленный код С++ был не хуже исходного.
Но тщетность меня поработила. Надеюсь, временно.
Post #: 4
RE: Компилятор С++ и его странности - 2008-12-06 21:38:46.593333   
Mатцал Коушек

Сообщений: 10407
Оценки: 91
Присоединился: 2008-07-09 10:27:49.520000
Неясно, надо файл кодить или не надо?
Исполняемый?

Код я выкладывать не буду, только конечный продукт.


Согласие - есть продукт непротивления сторон.(Боже.. а о чём это я? К чему это…)
Post #: 5
RE: Компилятор С++ и его странности - 2008-12-06 21:43:20   
D. Scandal

Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
Инспектор, ты меня улыбаешь. Кодить ничего на данный момент не надо. Необходимо выснить причину некорректной работы компилятора или моих мозгов.
Подозреваю, что ему (компилятору) что-то неизвестно. Он как-то извращенно рассматривает исходный код.
Пример извращения приведен выше.
Post #: 6
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, а через прибавление единицы.
Да много всяких страностей..
Post #: 7
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; Ву а ля.
Post #: 8
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Компилятор С++ и его странности







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.