From d359392f976d48b04a27e6a09b5b61846b0727f9 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 29 Jul 2018 17:29:24 -0600 Subject: [PATCH] Avoid undefined behavior in read_subrange_type -fsanitize=undefined pointed out an undefined shift of a negative value in read_subrange_type. The fix is to do the work in an unsigned type, where this is defined. gdb/ChangeLog 2018-10-03 Tom Tromey * dwarf2read.c (read_subrange_type): Make "negative_mask" unsigned. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2read.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5787d44424f..4be30330e59 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-10-03 Tom Tromey + + * dwarf2read.c (read_subrange_type): Make "negative_mask" + unsigned. + 2018-10-03 Tom Tromey * findvar.c (extract_integer): Do work in an unsigned type. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4a35e389e93..4013c199dad 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -17709,7 +17709,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) int low_default_is_valid; int high_bound_is_count = 0; const char *name; - LONGEST negative_mask; + ULONGEST negative_mask; orig_base_type = die_type (die, cu); /* If ORIG_BASE_TYPE is a typedef, it will not be TYPE_UNSIGNED, @@ -17842,7 +17842,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) the bounds as signed, and thus sign-extend their values, when the base type is signed. */ negative_mask = - -((LONGEST) 1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1)); + -((ULONGEST) 1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1)); if (low.kind == PROP_CONST && !TYPE_UNSIGNED (base_type) && (low.data.const_val & negative_mask)) low.data.const_val |= negative_mask; -- 2.30.2