gdb/gdbtypes.h: Fix comparison of uninitialized values
authorLancelot SIX <lsix@lancelotsix.com>
Thu, 24 Dec 2020 16:01:21 +0000 (11:01 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Thu, 24 Dec 2020 16:02:55 +0000 (11:02 -0500)
When called with an array type of unknown dimensions,
is_scalar_type_recursive ended up comparing uninitialized values.

This was picked up by the following compiler warning:

  CXX    gdbtypes.o
/binutils-gdb/gdb/gdbtypes.c: In function int is_scalar_type_recursive(type*):
/binutils-gdb/gdb/gdbtypes.c:3670:38: warning: high_bound may be used uninitialized in this function [-Wmaybe-uninitialized]
 3670 |       return high_bound == low_bound && is_scalar_type_recursive (elt_type);
      | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/binutils-gdb/gdb/gdbtypes.c:3670:38: warning: low_bound may be used uninitialized in this function [-Wmaybe-uninitialized]

This patch makes sure that when dealing with an array of unknown size
(or an array of more than 1 element), is_scalar_type_recursive returns
false.

gdb/ChangeLog:

* gdbtypes.c (is_scalar_type_recursive): Prevent comparison
between uninitialized values.

Change-Id: Ifc005ced166aa7a065fef3e652977bae67625bf4

gdb/ChangeLog
gdb/gdbtypes.c

index 26d7f5837ccadb50afc37c7ab5c8b32f7e485450..ac4caf0532512b394b65826b8baadf83e4b7f7a7 100644 (file)
@@ -1,3 +1,8 @@
+2020-12-24  Lancelot SIX  <lsix@lancelotsix.com>
+
+       * gdbtypes.c (is_scalar_type_recursive): Prevent comparison
+       between uninitialized values.
+
 2020-12-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * expprint.c (print_subexp_standard): Replace uses of
index 569e7a3e65902c917cdb8f7125e7aaf57ab6eb38..a6589c4914f7f17cf2e592c80ae3c146edf2fb91 100644 (file)
@@ -3665,9 +3665,11 @@ is_scalar_type_recursive (struct type *t)
       LONGEST low_bound, high_bound;
       struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (t));
 
-      get_discrete_bounds (t->index_type (), &low_bound, &high_bound);
-
-      return high_bound == low_bound && is_scalar_type_recursive (elt_type);
+      if (get_discrete_bounds (t->index_type (), &low_bound, &high_bound))
+       return (high_bound == low_bound
+               && is_scalar_type_recursive (elt_type));
+      else
+       return 0;
     }
   /* Are we dealing with a struct with one element?  */
   else if (t->code () == TYPE_CODE_STRUCT && t->num_fields () == 1)