2013-12-12 5 views
1

мне нужно понять и воспроизвести (на другом языке) логики следующей функции (код C) , и я не очень понимаю, что он делаетЧто будет выводить простую функцию C и почему?

double __thiscall sub_1(int this) { 

    return * (double *) (this + 12); 

} 

Это компилируется нормально, но разбился во время работы Исполняемый файл

Я не сильный с C на всех, и не может узнать, какие фактические манипуляции этот набор операндов делает * (двойной *) это не разыменования, потому что нет никаких указателей, объявленных ,

Во всяком случае, может кто-нибудь сказать мне, - что будет выход функции

для SUB_1 (2) и почему?

+1

Вы уверены, что это точная функция? Это не имеет смысла. –

+2

Этот вопрос будет лучше на [ReverseEngineering.SE] (http://reverseengineering.stackexchange.com/). У вас есть грубая декомпиляция исходного кода, и это неверно. – DCoder

+1

@DCoder Хороший; Я этого не видел. Таким образом, 'this' может быть адресом структуры, содержащей 12 байтов чего-то и двойного. –

ответ

3

Для того чтобы этот код работал, int this должен быть переменной, удерживающей целочисленное значение адреса. Из этого адреса должен быть действительный двойной выделенный, с 12-байтным смещением. Код возвращает содержимое этого двойника.

Так что, если функция вызывается как sub_1(0x00000010), тогда должна быть двойная переменная, выделенная на address 0x0000001C. Если нет, программа вызывает неопределенное поведение и, скорее всего, сбой & burn.

Обратите внимание, что не имеет смысла использовать int для передачи адреса. Лучшим выбором было бы double*, или, как минимум, uint32_t, который не является целочисленным типом со знаком. Этот код не удался бы, если бы адрес был слишком велик, чтобы он помещался внутри int.

+0

es, этот код является частью декомпилированного кода, и нет смысла я тоже. То, что я на самом деле пытаюсь понять, - это то, что делает последовательность операндов, не вступая в бесполезные дискуссии о __thiscall и т. Д .: '* (double *) (i) // где i - is int' step by step '* (i)' делает '??' для int i и имеет тип '??' значение '??' '(double *)' - делает '??' и результат имеет тип ?? и значение ??? '* (double *) (i)' конечный результат имеет тип '??' и значение '??' Не могли бы вы помочь мне поместить недостающую информацию вместо '??' пожалуйста. – user3095293

+0

@ user3095293: '* (double *) (i)' интерпретирует значение 'i' как' double * ', а затем пытается разыменовать его.Это, как правило, плохая идея, потому что нет гарантии, что 'i' того же размера, что и указатель, или что имеет смысл рассматривать его как единое целое. Как мы пытались вам сказать, в вашем фрагменте кода 'this' не является' int', а 'void *' (фактически, указателем на какую-то структуру, которая имеет 'double', начиная с 12-го байта). – DCoder