From: mec.gnu@mindspring.com (Michael Elizabeth Chastain)
To: carlton@kealia.com
Cc: gdb-patches@sources.redhat.com
Subject: Re: [patch/testsuite/c++] test script for PR c++/186
Date: Mon, 24 Nov 2003 18:13:00 -0000 [thread overview]
Message-ID: <20031124181321.4AF214B409@berman.michael-chastain.com> (raw)
Hi David,
> I wouldn't necessarily call this incorrect/wrong, but it is somewhat
> unfortunate. I confess, though, that the correct fix isn't at all
> obvious to me, given that normally the dynamic type is more useful
> than the static type. Should GDB try to somehow take the supremum of
> the static type and the dynamic type? (And what if there is no
> supremum?) Should GDB try to remember when the user explicitly casts?
> (If so, exactly how do we want to remember that?) Should there be an
> option to turn of RTTI usage? (But users won't know about that.)
Well, gdb does have "set print object", which defaults to "off".
There are really two points here. One is that gdb has to decide
which type to print. There is the static type of the expression,
and the dynamic type in memory, and the value of "set print object"
to consider.
But beyond that level, gdb is printing bogus values. Specifically: I've
got these two classes, "A" and "B". "B" is derived from "A". I've got
an object that used to be a "B", but thanks to B::~B, the dynamic type
is actually "A" by now. When I say "print *pb", gdb prints values for
the fields of B. But it prints bogus data, and it prints *different*
bogus data on successive calls. It's not like gdb is choosing an
infelicitous type and forcing the target memory into that type, it's like
gdb is dereferencing wild pointers internally.
I suspect that gdb is using the static type to decide "let's print the B
type", but is using the dynamic type to find things, without any error
checking. Something like:
for (i = 0; i < static_type->nfields; i++)
{
... dynamic_type->fields[i] ...
}
The dynamic type is a parent of the static type (thanks to the
destructor) so it has fewer fields.
> Maybe the best thing to do would be as follows, if A is the dynamic
> type and B is the static type, then we check to make sure that A is
> more specialized than B.
Hmmm, that would be one way of fixing the problem, I think. Code like
the above actually works if you can assert that dynamic_type is derived
from static_type.
But I would rather that gdb have a more clear notion of which type
information it is using -- pick one type and then stick with it.
It's just asking for trouble if there is code like the above.
Michael C
next reply other threads:[~2003-11-24 18:13 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-11-24 18:13 Michael Elizabeth Chastain [this message]
2003-11-24 20:02 ` David Carlton
-- strict thread matches above, loose matches on Subject: below --
2003-11-24 16:41 Michael Elizabeth Chastain
2003-11-24 17:27 ` David Carlton
2003-11-23 23:00 Michael Elizabeth Chastain
2003-11-24 17:25 ` David Carlton
2003-11-23 22:05 Michael Elizabeth Chastain
2003-11-23 22:08 ` Daniel Jacobowitz
2003-11-23 22:22 ` Daniel Jacobowitz
2003-11-24 17:23 ` David Carlton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20031124181321.4AF214B409@berman.michael-chastain.com \
--to=mec.gnu@mindspring.com \
--cc=carlton@kealia.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox