Что здесь происходит: v5 = * (_ Байт *) (это + 4)? - PullRequest
3 голосов
/ 04 декабря 2010

Я смотрю дамп кода от IDA pro. Есть функция, которая как этот макет:

garbled_name(int this...
    unsigned int v5 ;
    v5 = *(_Byte *)(this + 4);
    ...

Что меня действительно интересует, так это то, что делает «+ 4»? Это дополнение или что-то еще?

Спасибо

Ответы [ 4 ]

3 голосов
/ 04 декабря 2010

Код принимает целое число «this», добавляет к нему 4, преобразует его в указатель на байт, а затем устанавливает «v5» в значение байта по этому адресу.

2 голосов
/ 04 декабря 2010

Это просто функция-член класса C ++, this - указатель на объект. Вероятно, эта подпись объекта:

class some_class {
    int i;    // int, void*, short, anything with sizeof() <= 4, and it's not char. 
              // It also can be absent if it's a virtual class (AFAIK it's compiler dependend)
    unsigned char c; // or c[N]
    ...
};

Код, о котором идет речь:

some_class::some_fn(...){
    unsigned int v5 = c; // or c[0]
    ...
};
1 голос
/ 04 декабря 2010

Это ссылка на пятый байт от начала объекта. В зависимости от того, какой компилятор сгенерировал этот код, наиболее вероятно, что это элемент в порядке классов, который находится на пятом байте в экземпляре объекта.

0 голосов
/ 04 декабря 2010

РЕДАКТИРОВАТЬ: вздох, я пропустил часть "IDA Pro".Я просто оставлю это здесь для развлекательной ценности, на случай, если кому-то интересно, что "this + 4" делает в обычном коде C ++.

"this + 4" берет ваш текущий указатель this, движется впередв четыре раза больше его размера.Затем он преобразует это в указатель байта и читает его.

Учтите это:

struct A {
    void foo();

    int x;
    int y;
};

sizeof (A) в 32-битной системе, скорее всего, 8 байтов.

A myArray[8];
A *pA = myArray;

Теперь pA указывает на & myArray [0].

pA++;

Теперь pA указывает на & myArray [1], то есть он переместился на 8 байт вперед.

void A::foo() {
    A *pA = this + 4;
}

Если вы вызовете это для & myArray [0], оно будет указывать на & myArray [4], то есть на 32 байта дальше.

...