ubsan: csky: left shift cannot be represented in type 'int'
authorAlan Modra <amodra@gmail.com>
Tue, 10 Dec 2019 13:07:03 +0000 (23:37 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 11 Dec 2019 01:08:45 +0000 (11:38 +1030)
In the following buf is an unsigned char array, so elements are
promoted to int before arithmetic operations.

  if (dis_info.info->endian == BFD_ENDIAN_BIG)
    while (n--)
      val |= buf[n] << (n*8);
  else
    for (i = 0; i < n; i++)
      val |= buf[i] << (i*8);

* csky-dis.c (csky_chars_to_number): Rewrite.  Avoid signed
overflow when collecting bytes of a number.

opcodes/ChangeLog
opcodes/csky-dis.c

index 6b76f158c952f54e32afc212f47f6ca997ed2fb8..5cd7361512bc96ea719521cf764196beb41b0543 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-11  Alan Modra  <amodra@gmail.com>
+
+       * csky-dis.c (csky_chars_to_number): Rewrite.  Avoid signed
+       overflow when collecting bytes of a number.
+
 2019-12-11  Alan Modra  <amodra@gmail.com>
 
        * cris-dis.c (print_with_operands): Avoid signed integer
index ffdb59649586a6c6ff391bc1be82e7c18d0e778a..af830f3651999a36bd978ee4f3b52b7625133439 100644 (file)
@@ -140,11 +140,11 @@ csky_chars_to_number (unsigned char * buf, int n)
   unsigned int val = 0;
 
   if (dis_info.info->endian == BFD_ENDIAN_BIG)
-    while (n--)
-      val |= buf[n] << (n*8);
-  else
     for (i = 0; i < n; i++)
-      val |= buf[i] << (i*8);
+      val = val << 8 | (buf[i] & 0xff);
+  else
+    for (i = n - 1; i >= 0; i--)
+      val = val << 8 | (buf[i] & 0xff);
   return val;
 }