From f8676776828c6c0c26da31de0de68c0f4162a8e9 Mon Sep 17 00:00:00 2001 From: Lancelot SIX Date: Thu, 24 Dec 2020 11:01:21 -0500 Subject: gdb/gdbtypes.h: Fix comparison of uninitialized values 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 | 5 +++++ gdb/gdbtypes.c | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 26d7f58..ac4caf0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-12-24 Lancelot SIX + + * gdbtypes.c (is_scalar_type_recursive): Prevent comparison + between uninitialized values. + 2020-12-23 Andrew Burgess * expprint.c (print_subexp_standard): Replace uses of diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 569e7a3..a6589c4 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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) -- cgit v1.1