ubsan errors when 32-bit bfd

Message ID YM1Hn3cNWfv8uguh@squeak.grove.modra.org
State New
Headers show
Series
  • ubsan errors when 32-bit bfd
Related show

Commit Message

Libor Bukata via Binutils June 19, 2021, 1:25 a.m.
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.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/gas/config/tc-z80.c b/gas/config/tc-z80.c
index 47d1405c2b6..303296b7dab 100644
--- a/gas/config/tc-z80.c
+++ b/gas/config/tc-z80.c
@@ -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