Fix crash with GNAT minimal encodings
authorTom Tromey <tromey@adacore.com>
Thu, 15 Apr 2021 14:54:06 +0000 (08:54 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 30 Apr 2021 13:33:01 +0000 (07:33 -0600)
Running the AdaCore internal test suite with -fgnat-encodings=minimal
found a gdb crash.  The bug is that GDB ends up with a typedef in
ada_index_type, resulting in a NULL dereference.

This crash can be reproduced using GCC 11 with the included test case.

Tested on x86-64 Fedora 32.  Because this is Ada-specific, and was
already reviewed by Joel, I am going to check it in.

2021-04-30  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (ada_index_type): Use ada_check_typedef.

gdb/testsuite/ChangeLog
2021-04-30  Tom Tromey  <tromey@adacore.com>

* gdb.ada/enum_idx_packed/pck.ads (My_Enum, My_Array_Type)
(Confused_Array): New types.
* gdb.ada/enum_idx_packed/foo.adb (Confused_Array): New variable.
* gdb.ada/enum_idx_packed.exp: Add new tests.

gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/enum_idx_packed.exp
gdb/testsuite/gdb.ada/enum_idx_packed/foo.adb
gdb/testsuite/gdb.ada/enum_idx_packed/pck.ads

index 8e77fa677e96f7553483bdad40edaec7b5288b93..f89346dfb2600df1c882cf1cd6e0cf1414746cd7 100644 (file)
@@ -1,3 +1,7 @@
+2021-04-30  Tom Tromey  <tromey@adacore.com>
+
+       * ada-lang.c (ada_index_type): Use ada_check_typedef.
+
 2021-04-29  Simon Marchi  <simon.marchi@efficios.com>
 
        * auto-load.h: Split namespace declaration.
index 0b50a788ac9026cc34a1f50eab27344b3a38fd8e..e15e583adca08a509fe56b0069f8163c346349ed 100644 (file)
@@ -2877,8 +2877,11 @@ ada_index_type (struct type *type, int n, const char *name)
       int i;
 
       for (i = 1; i < n; i += 1)
-       type = TYPE_TARGET_TYPE (type);
-      result_type = TYPE_TARGET_TYPE (type->index_type ());
+       {
+         type = ada_check_typedef (type);
+         type = TYPE_TARGET_TYPE (type);
+       }
+      result_type = TYPE_TARGET_TYPE (ada_check_typedef (type)->index_type ());
       /* FIXME: The stabs type r(0,0);bound;bound in an array type
         has a target type of TYPE_CODE_UNDEF.  We compensate here, but
         perhaps stabsread.c would make more sense.  */
index 8e021d2284bbd10c2d518b97537b9aab83f35dbd..be395272a2bd33f31055c893736ff3fff946684a 100644 (file)
@@ -1,3 +1,10 @@
+2021-04-30  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.ada/enum_idx_packed/pck.ads (My_Enum, My_Array_Type)
+       (Confused_Array): New types.
+       * gdb.ada/enum_idx_packed/foo.adb (Confused_Array): New variable.
+       * gdb.ada/enum_idx_packed.exp: Add new tests.
+
 2021-04-30  Tom de Vries  <tdevries@suse.de>
 
        * gdb.mi/mi-sym-info.exp: Add with_timeout_factor, and increase
index 1497f536ce4e4cc9906b8bb675c98be449ca08b8..f7d57a7bf6828a24f19849b572b69d0ae97a403c 100644 (file)
@@ -122,4 +122,7 @@ foreach_with_prefix scenario {all minimal} {
 
     gdb_test "print multi_access.all" \
        " = \\(\\(8, 13, 21, 34, 55\\), \\(1, 1, 2, 3, 5\\)\\)"
+
+    gdb_test "print confused_array(red, green)" " = 2"
+    gdb_test "print confused_array(green, red)" " = 6"
 }
index 5d329498fbe3b37fcfb0a6ae69d2379d6df7757e..2887ed40d7265756812cbbb1b44670db047318b1 100644 (file)
@@ -26,6 +26,10 @@ procedure Foo is
      := new Multi_Dimension'(True => (1, 1, 2, 3, 5),
                              False => (8, 13, 21, 34, 55));
 
+   Confused_Array : Confused_Array_Type := (Red => (0, 1, 2),
+                                            Green => (5, 6, 7),
+                                            others => (others => 72));
+
 begin
    Do_Nothing (Full'Address);  -- STOP
    Do_Nothing (Primary'Address);
index 7a0a7ded60348b496f09488e881ef00f6fa3c4cb..ff0b91a25f5cb675c1b96476db002174cae710b8 100644 (file)
@@ -48,5 +48,10 @@ package Pck is
    pragma Pack (Multi_Dimension);
    type Multi_Dimension_Access is access all Multi_Dimension;
 
+   type My_Enum is (Blue, Red, Green);
+
+   type My_Array_Type is array (My_Enum) of Integer;
+   type Confused_Array_Type is array (Color) of My_Array_Type;
+
    procedure Do_Nothing (A : System.Address);
 end Pck;