diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-18 15:37:44 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-18 18:38:13 +1030 |
commit | 2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8 (patch) | |
tree | ce542aad0a4875a62960e77e23c4729b92d87da4 /opcodes/arm-dis.c | |
parent | 4a422785822ec9302f681c8fbc6ba2cc35231b09 (diff) | |
download | gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.zip gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.tar.gz gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.tar.bz2 |
More signed overflow fixes
The arc fix in create_map avoiding signed overflow by casting an
unsigned char to unsigned int before shifting, shows one of the
dangers of blinding doing that. The problem in this case was that the
variable storing the value, newAuxRegister->address, was a long.
Using the unsigned cast meant that the 32-bit value was zero extended
when long is 64 bits. Previously we had a sign extension. Net result
was that comparisons in arcExtMap_auxRegName didn't match. Of course,
I could have cast the 32-bit unsigned value back to signed before
storing in a long, but it's neater to just use an unsigned int for the
address.
opcodes/
* alpha-opc.c (OP): Avoid signed overflow.
* arm-dis.c (print_insn): Likewise.
* mcore-dis.c (print_insn_mcore): Likewise.
* pj-dis.c (get_int): Likewise.
* ppc-opc.c (EBD15, EBD15BI): Likewise.
* score7-dis.c (s7_print_insn): Likewise.
* tic30-dis.c (print_insn_tic30): Likewise.
* v850-opc.c (insert_SELID): Likewise.
* vax-dis.c (print_insn_vax): Likewise.
* arc-ext.c (create_map): Likewise.
(struct ExtAuxRegister): Make "address" field unsigned int.
(arcExtMap_auxRegName): Pass unsigned address.
(dump_ARC_extmap): Adjust.
* arc-ext.h (arcExtMap_auxRegName): Update prototype.
Diffstat (limited to 'opcodes/arm-dis.c')
-rw-r--r-- | opcodes/arm-dis.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index f693758..12eae61 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -11705,7 +11705,7 @@ static int print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little) { unsigned char b[4]; - long given; + unsigned long given; int status; int is_thumb = FALSE; int is_data = FALSE; @@ -11885,9 +11885,9 @@ print_insn (bfd_vma pc, struct disassemble_info *info, bfd_boolean little) status = info->read_memory_func (pc, (bfd_byte *) b, 4, info); if (little_code) - given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24); + given = (b[0]) | (b[1] << 8) | (b[2] << 16) | ((unsigned) b[3] << 24); else - given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24); + given = (b[3]) | (b[2] << 8) | (b[1] << 16) | ((unsigned) b[0] << 24); } else { |