Re: Could GDB get offset of a field in virtual base class through NULL pointer
hex <[email protected]>
| Newsgroups | gmane.comp.gdb.devel |
|---|---|
| Message-ID | <CAB_AMN7GhAa+C7HzAghjTaN+aBknKnONqpP=1HxR3BuPxX0j7w@mail.gmail.com> |
2013/9/30 Jan Kratochvil <[email protected]>: > On Sun, 29 Sep 2013 03:59:54 +0200, hex wrote: >> > I do not see what it should do. In the following case &(((B *)&OBJECT)->a) >> > prints once 12 and once 16 for different OBJECT so what it should print for 0? >> > >> > class X:public virtual A,public B {}; >> > class C { >> > public: >> > int c; >> > }; >> > class Y:public virtual A,public C,public B {}; >> > #include <iostream> >> > int main() { >> > X x; >> > Y y; >> > std::cout << (char *)&(((B *)&x)->a)-(char *)&x << std::endl; >> > std::cout << (char *)&(((B *)&y)->a)-(char *)&y << std::endl; >> > } >> > >> >> If we use &(((B *)0)->a), we are likely to get offset of 'a' in class >> B. If GDB could >> support this specific case, we do not need a real object to get the offset. > > This would apply if you had s/virtual A/A/. But with the inheritance of > A being virtual the memory location of A inside the whole object instance is > "random", it does not depend on B but it depends on X or Y. Specifically it > depends on virtual tables used for the specific instance, the virtual tables > specify the location of A. This is what I am trying to show you in the > example above. > > The same expression (char *)&(((B *)&OBJECT)->a) produces different result > depending on which OBJECT you pass there. Therefore which result should > produce passing 0 instead of &OBJECT there? It cannot be a single number. > > > Jan Kratochvil Thank you for the explanation. I hope &(((B *)0)->a) to be regarded as a special case that gets the same value as (B object; (char *)&((&object)->a) - (char *)&object). If G++ emits A's offset in B to the program's DAWRF file, GDB could support this case by saving the offset. But I checked, only found this offset in the binary code of B's constructor function.