Skip to content

Commit 56255e0

Browse files
committed
[builtins] Fix signed shift overflows in absvti2.c and negvti2.c
When compiling the builtins with the undefined behavior sanitizer and running testcases you end up with the following warning: UBSan: negvti2.c:22:32: left shift of 1 by 127 places cannot be represented in type 'ti_int' (aka '__int128') UBSan: absvti2.c:23:23: left shift of 1 by 127 places cannot be represented in type 'ti_int' (aka '__int128') This can be avoided by doing the shift in a matching unsigned variant of the type. This is the same kind of fixes that already was done in commit 854686f This was found in an out of tree target. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D158816
1 parent 4198576 commit 56255e0

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

compiler-rt/lib/builtins/absvti2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
COMPILER_RT_ABI ti_int __absvti2(ti_int a) {
2222
const int N = (int)(sizeof(ti_int) * CHAR_BIT);
23-
if (a == ((ti_int)1 << (N - 1)))
23+
if (a == (ti_int)((tu_int)1 << (N - 1)))
2424
compilerrt_abort();
2525
const ti_int s = a >> (N - 1);
2626
return (a ^ s) - s;

compiler-rt/lib/builtins/negvti2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
// Effects: aborts if -a overflows
2020

2121
COMPILER_RT_ABI ti_int __negvti2(ti_int a) {
22-
const ti_int MIN = (ti_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT) - 1);
22+
const ti_int MIN = (tu_int)1 << ((int)(sizeof(ti_int) * CHAR_BIT) - 1);
2323
if (a == MIN)
2424
compilerrt_abort();
2525
return -a;

0 commit comments

Comments
 (0)