ubsan errors when 32-bit bfd
authorAlan Modra <amodra@gmail.com>
Fri, 18 Jun 2021 12:57:01 +0000 (22:27 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 19 Jun 2021 01:38:55 +0000 (11:08 +0930)
A shift count exceeding the size of the value is undefined behaviour,
and so is negating a signed LONG_MIN.

* config/tc-z80.c (signed_overflow, unsigned_overflow): Avoid UB.

gas/ChangeLog
gas/config/tc-z80.c

index ff0f65cf00dadf7e92c88d9d53200a2831d16658..e217c8243a4b84776db0f1ad0c096654651a43e1 100644 (file)
@@ -1,3 +1,7 @@
+2021-06-19  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-z80.c (signed_overflow, unsigned_overflow): Avoid UB.
+
 2021-06-19  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/ppc/raw.s: Use 0 as pli constant.
index 47d1405c2b629c1446253658345a4969f56a40ad..303296b7dab0e7609d27010a96a1b23ac6bed2a8 100644 (file)
@@ -3703,14 +3703,14 @@ md_assemble (char *str)
 static int
 signed_overflow (signed long value, unsigned bitsize)
 {
-  signed long max = (signed long)(1UL << (bitsize-1));
-  return value < -max || value >= max;
+  signed long max = (signed long) ((1UL << (bitsize - 1)) - 1);
+  return value < -max - 1 || value > max;
 }
 
 static int
 unsigned_overflow (unsigned long value, unsigned bitsize)
 {
-  return (value >> bitsize) != 0;
+  return value >> (bitsize - 1) >> 1 != 0;
 }
 
 static int