aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2021-02-09 12:15:39 -0700
committerTom Tromey <tromey@adacore.com>2021-02-09 12:15:39 -0700
commita4f0544b1ba516db0ab9715e4cccc78bc098ebc9 (patch)
tree07aec25a2cab2d32c06ce5b78cdba48f8972e30e /gdb
parent5f128a25f235195d1970ec07aec57004dfb90237 (diff)
downloadgdb-a4f0544b1ba516db0ab9715e4cccc78bc098ebc9.zip
gdb-a4f0544b1ba516db0ab9715e4cccc78bc098ebc9.tar.gz
gdb-a4f0544b1ba516db0ab9715e4cccc78bc098ebc9.tar.bz2
Avoid crash in resolve_dynamic_struct
resolve_dynamic_struct says: gdb_assert (type->num_fields () > 0); However, a certain Ada program has a structure with no fields but with a dynamic size, causing this assertion to fire. It is difficult to be certain, but we think this is a compiler bug. However, in the meantime this assertion does not seem to be checking any kind of internal consistency; so this patch removes it. gdb/ChangeLog 2021-02-09 Tom Tromey <tromey@adacore.com> * gdbtypes.c (resolve_dynamic_struct): Handle structure with no fields.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/gdbtypes.c8
2 files changed, 9 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e67668d..6470c99 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2021-02-09 Tom Tromey <tromey@adacore.com>
+
+ * gdbtypes.c (resolve_dynamic_struct): Handle structure with no
+ fields.
+
2021-02-08 Shahab Vahedi <shahab@synopsys.com>
PR tdep/27369
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index c736dff..1b2d483 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -2545,7 +2545,6 @@ resolve_dynamic_struct (struct type *type,
unsigned resolved_type_bit_length = 0;
gdb_assert (type->code () == TYPE_CODE_STRUCT);
- gdb_assert (type->num_fields () > 0);
resolved_type = copy_type (type);
@@ -2564,9 +2563,10 @@ resolve_dynamic_struct (struct type *type,
((struct field *)
TYPE_ALLOC (resolved_type,
resolved_type->num_fields () * sizeof (struct field)));
- memcpy (resolved_type->fields (),
- type->fields (),
- resolved_type->num_fields () * sizeof (struct field));
+ if (type->num_fields () > 0)
+ memcpy (resolved_type->fields (),
+ type->fields (),
+ resolved_type->num_fields () * sizeof (struct field));
}
for (i = 0; i < resolved_type->num_fields (); ++i)