[ob] unbreak MI
Vladimir Prus
ghost@cs.msu.su
Tue Nov 27 07:00:00 GMT 2007
On Tuesday 27 November 2007 09:27:37 Nick Roberts wrote:
> > > Generally, with a NULL pointer, or and address that can't be dereferenced,
> > > MI prints out the value field as value="".
> > >
> > > What is the problem in this case? Why isn't the right fix to add a
> > > check_typedef somewhere?
> >
> > check_typedef? The original problem was that check_typedef was getting
> > called on NULL pointer, so adding more check_typedef calls won't help.
> > Probably:
> >
> > if (!gdb_type)
> > ui_out_field_string (uiout, "value", "");
> > else if (mi_print_value_p (gdb_type, print_values))
> > ui_out_field_string (uiout, "value", varobj_get_value (var));
> >
> > is the right logic?
>
> It's probably the right logic, but it seems to cure the symptom rather than the
> cause. What I mean't, I guess, was where/how does check_typedef is get passed
> a NULL pointer? And can't that call be conditioned (i.e. "add a *check* to
> check_typedef") , e.g., something like:
>
> if (!gdb_type)
> check_typedef (gdb_type)
Just look at mi_print_value_p, and you'll see a call to check_typedef. Actually,
the code previously looked like:
if (type != NULL)
type = check_typedef (type);
It was changed in revision 1.38, with the following comment:
2007-08-28 Michael Snyder <msnyder@access-company.com>
* mi/mi-cmd-var.c (mi_print_value_p): No longer necessary to
check for null before calling check_typedef.
However, apparently check_typedef still crashes when passed NULL,
and it can be passed NULL.
The original code, in fact, was in error too, because of this:
return (TYPE_CODE (type) != TYPE_CODE_ARRAY
&& TYPE_CODE (type) != TYPE_CODE_STRUCT
&& TYPE_CODE (type) != TYPE_CODE_UNION);
This will crash if 'type' is NULL. Testsuite fails to detect this because presently
type is NULL only for C++ pseudo-fields ('public'/'private') and the code
above is only executed for --simple-values.
Does this clarify things?
- Volodya
More information about the Gdb-patches
mailing list