ubsan: signed integer multiply overflow

Message ID Yc/kDbZdZ9t8gJbl@squeak.grove.modra.org
State New
Headers show
Series
  • ubsan: signed integer multiply overflow
Related show

Commit Message

H.J. Lu via Binutils Jan. 1, 2022, 5:18 a.m.
9223371018427387904 * 2 cannot be represented in type 'long', yes, but
we don't care.

	* expr.c (expr): Avoid signed overflow.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/gas/expr.c b/gas/expr.c
index 03caa91f4d1..618927a605f 100644
--- a/gas/expr.c
+++ b/gas/expr.c
@@ -1959,7 +1959,12 @@  expr (int rankarg,		/* Larger # is higher rank.  */
 	  switch (op_left)
 	    {
 	    default:			goto general;
-	    case O_multiply:		resultP->X_add_number *= v; break;
+	    case O_multiply:
+	      /* Do the multiply as unsigned to silence ubsan.  The
+		 result is of course the same when we throw away high
+		 bits of the result.  */
+	      resultP->X_add_number *= (valueT) v;
+	      break;
 	    case O_divide:		resultP->X_add_number /= v; break;
 	    case O_modulus:		resultP->X_add_number %= v; break;
 	    case O_left_shift: