[binutils-gdb] ubsan: integer overflow in tc-i386.c:offset_in_range

Alan Modra amodra@sourceware.org
Wed May 21 23:16:21 GMT 2025


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

commit 7d411b8d9b84904d8f9db1d3b17fedeef1757575
Author: Alan Modra <amodra@gmail.com>
Date:   Wed May 21 17:57:04 2025 +0930

    ubsan: integer overflow in tc-i386.c:offset_in_range
    
    or $9223372036854775808,%eax
    runtime error: negation of -9223372036854775808 cannot be represented
    in type 'offsetT' (aka 'long'); cast to an unsigned type to negate
    this value to itself
    
            * config/tc-i386.c (offset_in_range): Avoid signed overflow.

Diff:
---
 gas/config/tc-i386.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 162e28e0325..25bbc5360a8 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -2990,7 +2990,7 @@ offset_in_range (offsetT val, int size)
     default: abort ();
     }
 
-  if ((val & ~mask) != 0 && (-val & ~mask) != 0)
+  if ((val & ~mask) != 0 && (-(addressT) val & ~mask) != 0)
     as_warn (_("0x%" PRIx64 " shortened to 0x%" PRIx64),
 	     (uint64_t) val, (uint64_t) (val & mask));


More information about the Binutils-cvs mailing list