[compiler-rt] 510b6b7 - [builtins] Fix signed integer overflows in divmodsi4.c, divmoddi4.c and divmodti4.c
Karl-Johan Karlsson via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 27 21:47:07 PDT 2023
Author: Karl-Johan Karlsson
Date: 2023-08-28T06:39:48+02:00
New Revision: 510b6b79141cc00641369c9544489b112c4e4f43
URL: https://github.com/llvm/llvm-project/commit/510b6b79141cc00641369c9544489b112c4e4f43
DIFF: https://github.com/llvm/llvm-project/commit/510b6b79141cc00641369c9544489b112c4e4f43.diff
LOG: [builtins] Fix signed integer overflows in divmodsi4.c, divmoddi4.c and divmodti4.c
When compiling the builtins with the undefined behavior sanitizer and running testcases you end up with the following warning:
UBSan: divmodsi4.c:22:17: signed integer overflow: 2147483647 - -1 cannot be represented in type 'si_int' (aka 'long')
This can be avoided by doing the subtract in a matching unsigned variant of the type.
The same kind of pattern is found in divmoddi4.c and divmodti4.c
This was found in an out of tree target.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D158821
Added:
Modified:
compiler-rt/lib/builtins/divmoddi4.c
compiler-rt/lib/builtins/divmodsi4.c
compiler-rt/lib/builtins/divmodti4.c
Removed:
################################################################################
diff --git a/compiler-rt/lib/builtins/divmoddi4.c b/compiler-rt/lib/builtins/divmoddi4.c
index e7cbbb1aaa304c..64bbb6934601d4 100644
--- a/compiler-rt/lib/builtins/divmoddi4.c
+++ b/compiler-rt/lib/builtins/divmoddi4.c
@@ -18,8 +18,8 @@ COMPILER_RT_ABI di_int __divmoddi4(di_int a, di_int b, di_int *rem) {
const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1;
di_int s_a = a >> bits_in_dword_m1; // s_a = a < 0 ? -1 : 0
di_int s_b = b >> bits_in_dword_m1; // s_b = b < 0 ? -1 : 0
- a = (a ^ s_a) - s_a; // negate if s_a == -1
- b = (b ^ s_b) - s_b; // negate if s_b == -1
+ a = (du_int)(a ^ s_a) - s_a; // negate if s_a == -1
+ b = (du_int)(b ^ s_b) - s_b; // negate if s_b == -1
s_b ^= s_a; // sign of quotient
du_int r;
di_int q = (__udivmoddi4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1
diff --git a/compiler-rt/lib/builtins/divmodsi4.c b/compiler-rt/lib/builtins/divmodsi4.c
index a85e2993b4e9b3..193f81053568cd 100644
--- a/compiler-rt/lib/builtins/divmodsi4.c
+++ b/compiler-rt/lib/builtins/divmodsi4.c
@@ -19,8 +19,8 @@ COMPILER_RT_ABI si_int __divmodsi4(si_int a, si_int b, si_int *rem) {
const int bits_in_word_m1 = (int)(sizeof(si_int) * CHAR_BIT) - 1;
si_int s_a = a >> bits_in_word_m1; // s_a = a < 0 ? -1 : 0
si_int s_b = b >> bits_in_word_m1; // s_b = b < 0 ? -1 : 0
- a = (a ^ s_a) - s_a; // negate if s_a == -1
- b = (b ^ s_b) - s_b; // negate if s_b == -1
+ a = (su_int)(a ^ s_a) - s_a; // negate if s_a == -1
+ b = (su_int)(b ^ s_b) - s_b; // negate if s_b == -1
s_b ^= s_a; // sign of quotient
su_int r;
si_int q = (__udivmodsi4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1
diff --git a/compiler-rt/lib/builtins/divmodti4.c b/compiler-rt/lib/builtins/divmodti4.c
index b243ba4ef85375..185d3d47f365d8 100644
--- a/compiler-rt/lib/builtins/divmodti4.c
+++ b/compiler-rt/lib/builtins/divmodti4.c
@@ -20,8 +20,8 @@ COMPILER_RT_ABI ti_int __divmodti4(ti_int a, ti_int b, ti_int *rem) {
const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1;
ti_int s_a = a >> bits_in_tword_m1; // s_a = a < 0 ? -1 : 0
ti_int s_b = b >> bits_in_tword_m1; // s_b = b < 0 ? -1 : 0
- a = (a ^ s_a) - s_a; // negate if s_a == -1
- b = (b ^ s_b) - s_b; // negate if s_b == -1
+ a = (tu_int)(a ^ s_a) - s_a; // negate if s_a == -1
+ b = (tu_int)(b ^ s_b) - s_b; // negate if s_b == -1
s_b ^= s_a; // sign of quotient
tu_int r;
ti_int q = (__udivmodti4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1
More information about the llvm-commits
mailing list