chang@osc.COM (Lai-Chang Woo) (02/05/91)
Hello all I am having a nightmarish time with Glockenspiel C++ on DEC/Ultrix 4.0 and just wonder if anyone out there has some hints/suggestions/sympathies to offer. Here's the problem: A simple program fails with segmentation fault. I run it under dbx, examine argument values and find one of the methods "compare" is passed a wrong "this" pointer. I go up one frame and discover the apparent cause of it: the delta value used to compute "this" for this particular virtual function is wrong. I then changed the delta value, and bingo! Case verified. Now the headache: is the Glockenspiel translator to be blamed, or am I doing something to cause this wrong computation? I have a class hierachy which goes like this: class A { // definitions } class B : virtual public A { // some definitions preceeding // first definition of compare method virtual int compare(const B&) const = 0; } class Person : virtual public B { // some definitions preceeding // overriding definition of compare virtual int compare(const B&) const; } class Employee : public Person { // some method definitions // no definition for compare here } The translated C code has virtual tables like these: struct __mptr __vtbl__6B__8Employee[] = {0,0,0, -20,0,(__vptp)methA__8EmployeeCFv, -20,0,(__vptp)methB__8EmployeeCFv, 0,0,(__vptp)methC__6BCFv, -4,0,(__vptp)compare__6PersonCFRC6B, <-- offensive line, works when -4 is ... changed to -20 !! 0,0,0); struct __mptr __vtbl__6B__6Person[] = {0,0,0, -16,0,(__vptp)methA__6PersonCFv, -16,0,(__vptp)methB__6PersonCFv, 0,0,(__vptp)methC__6BCFv, -16,0,(__vptp)compare__6PersonCFRC6B, ... 0,0,0); I am rather new to C++ and don't fully understand the intricacies of the virtual tables, but it appears the translator has either omitted to add -16 to -4, or done an extra subtraction of -16 from -20. Either way, the value calculated by the translator is always the difference; I have verified this point by altering the class definitions such that a whole different set of offsets are computed. Has anybody come across this before? Email replies to "chang%osc.osc.com@ uunet.uu.net" would be appreciated. Thanks in advance.