diff options
author | Joel Brobecker <brobecker@gnat.com> | 2011-07-01 18:27:34 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2011-07-01 18:27:34 +0000 |
commit | a3d19784df21f6ff35bb0a2f95ebbd5726f73c9d (patch) | |
tree | 2b4b6cfc21f7044ecbae3af8acd9c2cfcc7fe480 /gdb/ada-typeprint.c | |
parent | 1307076d2bb7313f7791c511b6ee8f781eb92870 (diff) | |
download | gdb-a3d19784df21f6ff35bb0a2f95ebbd5726f73c9d.tar.gz |
crash when printing type of tagged type
If the debugging info is incorrect or incomplete, printing the
type description of a variable that's a variant tagged type can
trigger a crash. The crash comes from us trying print a NULL
string which was supposed to be the parent type name.
We observed this behavior on bareboard targets where a-tags is
not always linked in, as is the case for native platforms, for
instance. Coupled with -feliminate-unused-debug-types, this leads
to GDB being unable to find type ada__tags__type_specific_data,
without which printing the type description above cannot be done
acurately. There is an easy workaround for this limitation,
which is to compile at least 1 unit with
-fno-eliminate-unused-debug-types, but GDB should also be made
resilient to this situation.
gdb/ChangeLog:
* ada-typeprint.c (print_record_type): If unable to decode
the name of the parent type, use the encoded name.
Diffstat (limited to 'gdb/ada-typeprint.c')
-rw-r--r-- | gdb/ada-typeprint.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 6bae634e987..bbcef558221 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -621,8 +621,17 @@ print_record_type (struct type *type0, struct ui_file *stream, int show, parent_type = ada_parent_type (type); if (ada_type_name (parent_type) != NULL) - fprintf_filtered (stream, "new %s with record", - decoded_type_name (parent_type)); + { + const char *parent_name = decoded_type_name (parent_type); + + /* If we fail to decode the parent type name, then use the parent + type name as is. Not pretty, but should never happen except + when the debugging info is incomplete or incorrect. This + prevents a crash trying to print a NULL pointer. */ + if (parent_name == NULL) + parent_name = ada_type_name (parent_type); + fprintf_filtered (stream, "new %s with record", parent_name); + } else if (parent_type == NULL && ada_is_tagged_type (type, 0)) fprintf_filtered (stream, "tagged record"); else |