[compiler-rt] fb46377 - [builtins] Fix undefined behavior in negdi2.c and negti2.c

Karl-Johan Karlsson via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 27 21:47:04 PDT 2023


Author: Karl-Johan Karlsson
Date: 2023-08-28T06:39:47+02:00
New Revision: fb463778a7a4b85a5af287c40b957ffd7fcda53e

URL: https://github.com/llvm/llvm-project/commit/fb463778a7a4b85a5af287c40b957ffd7fcda53e
DIFF: https://github.com/llvm/llvm-project/commit/fb463778a7a4b85a5af287c40b957ffd7fcda53e.diff

LOG: [builtins] Fix undefined behavior in negdi2.c and negti2.c

When compiling the builtins with the undefined behavior sanitizer and running testcases you end up with the following warning:

UBSan: negdi2.c:20:10: negation of -9223372036854775808 cannot be represented in type 'di_int' (aka 'long long'); cast to an unsigned type to negate this value to itself

This can be avoided by doing negation in a matching unsigned variant of the type.

The same kind of pattern is found in negti2.c

This was found in an out of tree target.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D158818

Added: 
    

Modified: 
    compiler-rt/lib/builtins/negdi2.c
    compiler-rt/lib/builtins/negti2.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/builtins/negdi2.c b/compiler-rt/lib/builtins/negdi2.c
index 5a525d4b0e5541..714ac8ca66d305 100644
--- a/compiler-rt/lib/builtins/negdi2.c
+++ b/compiler-rt/lib/builtins/negdi2.c
@@ -17,5 +17,5 @@
 COMPILER_RT_ABI di_int __negdi2(di_int a) {
   // Note: this routine is here for API compatibility; any sane compiler
   // should expand it inline.
-  return -a;
+  return -(du_int)a;
 }

diff  --git a/compiler-rt/lib/builtins/negti2.c b/compiler-rt/lib/builtins/negti2.c
index d52ba4e13a467a..ab6e09ded819f6 100644
--- a/compiler-rt/lib/builtins/negti2.c
+++ b/compiler-rt/lib/builtins/negti2.c
@@ -19,7 +19,7 @@
 COMPILER_RT_ABI ti_int __negti2(ti_int a) {
   // Note: this routine is here for API compatibility; any sane compiler
   // should expand it inline.
-  return -a;
+  return -(tu_int)a;
 }
 
 #endif // CRT_HAS_128BIT


        


More information about the llvm-commits mailing list