Re: Could GDB get offset of a field in virtual base class through NULL pointer

Jan Kratochvil <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.