mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 04:00:07 +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>
|
2018-10-03 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* findvar.c (extract_integer): Do work in an unsigned type.
|
* 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 low_default_is_valid;
|
||||||
int high_bound_is_count = 0;
|
int high_bound_is_count = 0;
|
||||||
const char *name;
|
const char *name;
|
||||||
LONGEST negative_mask;
|
ULONGEST negative_mask;
|
||||||
|
|
||||||
orig_base_type = die_type (die, cu);
|
orig_base_type = die_type (die, cu);
|
||||||
/* If ORIG_BASE_TYPE is a typedef, it will not be TYPE_UNSIGNED,
|
/* 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 bounds as signed, and thus sign-extend their values, when
|
||||||
the base type is signed. */
|
the base type is signed. */
|
||||||
negative_mask =
|
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
|
if (low.kind == PROP_CONST
|
||||||
&& !TYPE_UNSIGNED (base_type) && (low.data.const_val & negative_mask))
|
&& !TYPE_UNSIGNED (base_type) && (low.data.const_val & negative_mask))
|
||||||
low.data.const_val |= negative_mask;
|
low.data.const_val |= negative_mask;
|
||||||
|
Reference in New Issue
Block a user