mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 19:07:53 +08:00
[compiler-rt] Fix signed shift overflows in absvdi2.c, absvsi2.c, negvdi2.c and negvsi2.c
When compiling compiler-rt with -fsanitize=undefined and running testcases you end up with the following warnings: UBSan: absvdi2.c:21:23: left shift of 1 by 63 places cannot be represented in type 'di_int' (aka 'long long') UBSan: absvsi2.c:21:23: left shift of 1 by 31 places cannot be represented in type 'si_int' (aka 'long') UBSan: negvdi2.c:20:32: left shift of 1 by 63 places cannot be represented in type 'di_int' (aka 'long long') UBSan: negvsi2.c:20:32: left shift of 1 by 31 places cannot be represented in type 'si_int' (aka 'long') This can be avoided by doing the shift in a matching unsigned variant of the type. This was found in an out of tree target. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D146932
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
|
||||
COMPILER_RT_ABI di_int __absvdi2(di_int a) {
|
||||
const int N = (int)(sizeof(di_int) * CHAR_BIT);
|
||||
if (a == ((di_int)1 << (N - 1)))
|
||||
if (a == ((di_int)((du_int)1 << (N - 1))))
|
||||
compilerrt_abort();
|
||||
const di_int t = a >> (N - 1);
|
||||
return (a ^ t) - t;
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
COMPILER_RT_ABI si_int __absvsi2(si_int a) {
|
||||
const int N = (int)(sizeof(si_int) * CHAR_BIT);
|
||||
if (a == ((si_int)1 << (N - 1)))
|
||||
if (a == ((si_int)((su_int)1 << (N - 1))))
|
||||
compilerrt_abort();
|
||||
const si_int t = a >> (N - 1);
|
||||
return (a ^ t) - t;
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
// Effects: aborts if -a overflows
|
||||
|
||||
COMPILER_RT_ABI di_int __negvdi2(di_int a) {
|
||||
const di_int MIN = (di_int)1 << ((int)(sizeof(di_int) * CHAR_BIT) - 1);
|
||||
const di_int MIN =
|
||||
(di_int)((du_int)1 << ((int)(sizeof(di_int) * CHAR_BIT) - 1));
|
||||
if (a == MIN)
|
||||
compilerrt_abort();
|
||||
return -a;
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
// Effects: aborts if -a overflows
|
||||
|
||||
COMPILER_RT_ABI si_int __negvsi2(si_int a) {
|
||||
const si_int MIN = (si_int)1 << ((int)(sizeof(si_int) * CHAR_BIT) - 1);
|
||||
const si_int MIN =
|
||||
(si_int)((su_int)1 << ((int)(sizeof(si_int) * CHAR_BIT) - 1));
|
||||
if (a == MIN)
|
||||
compilerrt_abort();
|
||||
return -a;
|
||||
|
||||
Reference in New Issue
Block a user