3 Stimmen

Was ist hier los: v5 = *(_Byte *)(this + 4)?

Ich sehe mir einen Code-Dump von IDA pro an. Es gibt eine Funktion, die wie dieses Layout:

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

Was mich wirklich interessiert, ist, was genau die "+ 4" macht? Ist das eine Addition oder etwas anderes?

Danke

3voto

pkh Punkte 3319

Der Code nimmt die Ganzzahl "this", addiert 4 dazu, wandelt sie in einen Zeiger auf ein Byte um und setzt dann "v5" auf den Wert des Bytes an dieser Adresse.

2voto

ruslik Punkte 14336

Es handelt sich lediglich um eine Mitgliedsfunktion einer C++-Klasse, this ist ein Zeiger auf das Objekt. Diese Signatur des Objekts ist wahrscheinlich:

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]
    ...
};

Der betreffende Code lautet:

some_class::some_fn(...){
    unsigned int v5 = c; // or c[0]
    ...
};

1voto

wallyk Punkte 55322

Es ist ein Verweis auf das fünfte Byte vom Anfang des Objekts. Je nachdem, welcher Compiler diesen Code erzeugt hat, handelt es sich höchstwahrscheinlich um das Element in der Klassenreihenfolge, das sich am fünften Byte in der Objektinstanz befindet.

0voto

EboMike Punkte 74805

EDIT: Seufz, ich habe den "IDA Pro"-Teil übersehen. Ich lasse das einfach mal zur Unterhaltung hier, falls sich jemand fragt, was "this+4" in normalem C++-Code macht.

"this+4" nimmt den aktuellen this-Zeiger und verschiebt ihn um das Vierfache seiner Größe nach vorne. Dann wird dieser Zeiger in einen Byte-Zeiger umgewandelt und gelesen.

~~Bedenken Sie dies:

struct A {
    void foo();

    int x;
    int y;
};

sizeof(A) ist auf einem 32-Bit-System höchstwahrscheinlich 8 Byte.

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

Jetzt zeigt pA auf &myArray[0].

pA++;

Jetzt zeigt pA auf &myArray[1], d.h. es wurde um 8 Bytes nach vorne verschoben.

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

Wenn Sie dies auf &myArray[0] aufrufen, zeigt es auf &myArray[4], d.h. 32 Bytes weiter unten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X