Часто замечал в трейсах что что-то указывает на адресс 0x10, вопрос такой, что это такое, почему 0x10 и как, в теории, с этим бороться?
это на 32 битах (void*)NULL + 4.
но это я замечал в основном на серверных машинках, т.е. 64бита. При этом, достаточно часто.
тогда (void*)NULL + 2>___>
а что это собственно значит? как добиться такого указателя к примеру написав заведомо ошибочный код?
struct T { int a; int b; int c; };T* test = NULL;test→c;
например. Ну или так:class T { int _wrapped;public: void* call() { return this; };};// ...T* test = NULL;test.call();
бля, я хуй, там vtable нужно. Ну энивей, you get the idea.
но данная штука определенно была указателем на объект и несла адрес 0x10. Ни первый, ни второй код этого не добился. КАК?
struct composited { int content;};class A { int64 a; int64 b; composited c;};A* test = NULL;test→c.content; // segfault at 0x10
это на 32 битах (void*)NULL + 4.
но это я замечал в основном на серверных машинках, т.е. 64бита. При этом, достаточно часто.
тогда (void*)NULL + 2
>___>
а что это собственно значит? как добиться такого указателя к примеру написав заведомо ошибочный код?
struct T { int a; int b; int c; };
T* test = NULL;
test→c;
например. Ну или так:
class T {
int _wrapped;
public:
void* call() { return this; };
};
// ...
T* test = NULL;
test.call();
бля, я хуй, там vtable нужно. Ну энивей, you get the idea.
но данная штука определенно была указателем на объект и несла адрес 0x10. Ни первый, ни второй код этого не добился. КАК?
struct composited {
int content;
};
class A {
int64 a;
int64 b;
composited c;
};
A* test = NULL;
test→c.content; // segfault at 0x10