Skip to content

Commit 510b6b7

Browse files
committed
[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
1 parent 5ae3211 commit 510b6b7

File tree

3 files changed

+6
-6
lines changed

3 files changed

+6
-6
lines changed

compiler-rt/lib/builtins/divmoddi4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ COMPILER_RT_ABI di_int __divmoddi4(di_int a, di_int b, di_int *rem) {
1818
const int bits_in_dword_m1 = (int)(sizeof(di_int) * CHAR_BIT) - 1;
1919
di_int s_a = a >> bits_in_dword_m1; // s_a = a < 0 ? -1 : 0
2020
di_int s_b = b >> bits_in_dword_m1; // s_b = b < 0 ? -1 : 0
21-
a = (a ^ s_a) - s_a; // negate if s_a == -1
22-
b = (b ^ s_b) - s_b; // negate if s_b == -1
21+
a = (du_int)(a ^ s_a) - s_a; // negate if s_a == -1
22+
b = (du_int)(b ^ s_b) - s_b; // negate if s_b == -1
2323
s_b ^= s_a; // sign of quotient
2424
du_int r;
2525
di_int q = (__udivmoddi4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1

compiler-rt/lib/builtins/divmodsi4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ COMPILER_RT_ABI si_int __divmodsi4(si_int a, si_int b, si_int *rem) {
1919
const int bits_in_word_m1 = (int)(sizeof(si_int) * CHAR_BIT) - 1;
2020
si_int s_a = a >> bits_in_word_m1; // s_a = a < 0 ? -1 : 0
2121
si_int s_b = b >> bits_in_word_m1; // s_b = b < 0 ? -1 : 0
22-
a = (a ^ s_a) - s_a; // negate if s_a == -1
23-
b = (b ^ s_b) - s_b; // negate if s_b == -1
22+
a = (su_int)(a ^ s_a) - s_a; // negate if s_a == -1
23+
b = (su_int)(b ^ s_b) - s_b; // negate if s_b == -1
2424
s_b ^= s_a; // sign of quotient
2525
su_int r;
2626
si_int q = (__udivmodsi4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1

compiler-rt/lib/builtins/divmodti4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ COMPILER_RT_ABI ti_int __divmodti4(ti_int a, ti_int b, ti_int *rem) {
2020
const int bits_in_tword_m1 = (int)(sizeof(ti_int) * CHAR_BIT) - 1;
2121
ti_int s_a = a >> bits_in_tword_m1; // s_a = a < 0 ? -1 : 0
2222
ti_int s_b = b >> bits_in_tword_m1; // s_b = b < 0 ? -1 : 0
23-
a = (a ^ s_a) - s_a; // negate if s_a == -1
24-
b = (b ^ s_b) - s_b; // negate if s_b == -1
23+
a = (tu_int)(a ^ s_a) - s_a; // negate if s_a == -1
24+
b = (tu_int)(b ^ s_b) - s_b; // negate if s_b == -1
2525
s_b ^= s_a; // sign of quotient
2626
tu_int r;
2727
ti_int q = (__udivmodti4(a, b, &r) ^ s_b) - s_b; // negate if s_b == -1

0 commit comments

Comments
 (0)