Avoid crash in resolve_dynamic_struct
authorTom Tromey <tromey@adacore.com>
Tue, 9 Feb 2021 19:15:39 +0000 (12:15 -0700)
committerTom Tromey <tromey@adacore.com>
Tue, 9 Feb 2021 19:15:39 +0000 (12:15 -0700)
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.

gdb/ChangeLog
gdb/gdbtypes.c

index e67668d315c505ed92156dd00f68a95ecfde5e05..6470c996a301e1cf732be6d7f73a13d73e44dba1 100644 (file)
@@ -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
index c736dff2ca82f9dd588ef1e30227308798bf6b07..1b2d4836959edff40130233cb26ff0ff90108f4c 100644 (file)
@@ -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)