[binutils-gdb] ubsan: m68k: left shift cannot be represented in type 'int'

Alan Modra amodra@sourceware.org
Wed Dec 11 01:13:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=334175b693a1cbab8850f5faa6937e7c6ca3db7d

commit 334175b693a1cbab8850f5faa6937e7c6ca3db7d
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Dec 11 08:23:33 2019 +1030

    ubsan: m68k: left shift cannot be represented in type 'int'
    
    	* m68k-dis.c (COERCE32): Cast value first.
    	(NEXTLONG, NEXTULONG): Avoid signed overflow.

Diff:
---
 opcodes/ChangeLog  | 5 +++++
 opcodes/m68k-dis.c | 8 +++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 8d48b5a..ffe57a4 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,10 @@
 2019-12-11  Alan Modra  <amodra@gmail.com>
 
+	* m68k-dis.c (COERCE32): Cast value first.
+	(NEXTLONG, NEXTULONG): Avoid signed overflow.
+
+2019-12-11  Alan Modra  <amodra@gmail.com>
+
 	* h8300-dis.c (extract_immediate): Avoid signed overflow.
 	(bfd_h8_disassemble): Likewise.
 
diff --git a/opcodes/m68k-dis.c b/opcodes/m68k-dis.c
index 7584541..6e913d7 100644
--- a/opcodes/m68k-dis.c
+++ b/opcodes/m68k-dis.c
@@ -96,7 +96,7 @@ enum print_insn_arg_error
   while (0)
 
 /* Get a 4 byte signed integer.  */
-#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
+#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
 
 #define NEXTLONG(p, val, ret_val)					\
   do									\
@@ -104,7 +104,8 @@ enum print_insn_arg_error
       p += 4;								\
       if (!FETCH_DATA (info, p))					\
 	return ret_val;							\
-      val = COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
+      val = COERCE32 (((((((unsigned) p[-4] << 8) + p[-3]) << 8)	\
+			+ p[-2]) << 8) + p[-1]);			\
     }									\
   while (0)
 
@@ -115,7 +116,8 @@ enum print_insn_arg_error
       p += 4;								\
       if (!FETCH_DATA (info, p))					\
 	return PRINT_INSN_ARG_MEMORY_ERROR;				\
-      val = (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
+      val = (((((((unsigned) p[-4] << 8) + p[-3]) << 8)			\
+	       + p[-2]) << 8) + p[-1]);					\
     }									\
   while (0)



More information about the Binutils-cvs mailing list