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

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


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

commit 205c426a9bb387204a21165e2275e31c32248035
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Dec 11 08:37:53 2019 +1030

    ubsan: s12z: left shift cannot be represented in type 'int'
    
    	* s12z-opc.c (z_decode_signed_value): Avoid signed overflow.

Diff:
---
 opcodes/ChangeLog  | 4 ++++
 opcodes/s12z-opc.c | 4 +---
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index ddf8cd0..a8e1d30 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,9 @@
 2019-12-11  Alan Modra  <amodra@gmail.com>
 
+	* s12z-opc.c (z_decode_signed_value): Avoid signed overflow.
+
+2019-12-11  Alan Modra  <amodra@gmail.com>
+
 	* ns32k-dis.c (bit_extract): Use unsigned arithmetic.
 	(bit_extract_simple, sign_extend): Likewise.
 
diff --git a/opcodes/s12z-opc.c b/opcodes/s12z-opc.c
index 3e0c0e0..044c72a 100644
--- a/opcodes/s12z-opc.c
+++ b/opcodes/s12z-opc.c
@@ -410,9 +410,7 @@ z_decode_signed_value (struct mem_read_abstraction_base *mra, int offset,
   int i;
   uint32_t value = 0;
   for (i = 0; i < size; ++i)
-    {
-      value |= buffer[i] << (8 * (size - i - 1));
-    }
+    value = (value << 8) | buffer[i];
 
   if (buffer[0] & 0x80)
     {



More information about the Binutils-cvs mailing list