mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 19:50:13 +08:00
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 <tom@tromey.com> * dwarf2read.c (read_subrange_type): Make "negative_mask" unsigned.
This commit is contained in:
@ -1,3 +1,8 @@
|
||||
2018-10-03 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* dwarf2read.c (read_subrange_type): Make "negative_mask"
|
||||
unsigned.
|
||||
|
||||
2018-10-03 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* findvar.c (extract_integer): Do work in an unsigned type.
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user