[compiler-rt] 16ede09 - Fix UBSAN in __ubsan::Value::getSIntValue
Martin Liska via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 23 02:10:48 PST 2021
Author: Martin Liska
Date: 2021-02-23T11:10:21+01:00
New Revision: 16ede0956cb1f4b692dfa619ccfa6ab1de28e19b
URL: https://github.com/llvm/llvm-project/commit/16ede0956cb1f4b692dfa619ccfa6ab1de28e19b
DIFF: https://github.com/llvm/llvm-project/commit/16ede0956cb1f4b692dfa619ccfa6ab1de28e19b.diff
LOG: Fix UBSAN in __ubsan::Value::getSIntValue
/home/marxin/Programming/gcc2/libsanitizer/ubsan/ubsan_value.cpp:77:25: runtime error: left shift of 0x0000000000000000fffffffffffffffb by 96 places cannot be represented in type '__int128'
#0 0x7ffff754edfe in __ubsan::Value::getSIntValue() const /home/marxin/Programming/gcc2/libsanitizer/ubsan/ubsan_value.cpp:77
#1 0x7ffff7548719 in __ubsan::Value::isNegative() const /home/marxin/Programming/gcc2/libsanitizer/ubsan/ubsan_value.h:190
#2 0x7ffff7542a34 in handleShiftOutOfBoundsImpl /home/marxin/Programming/gcc2/libsanitizer/ubsan/ubsan_handlers.cpp:338
#3 0x7ffff75431b7 in __ubsan_handle_shift_out_of_bounds /home/marxin/Programming/gcc2/libsanitizer/ubsan/ubsan_handlers.cpp:370
#4 0x40067f in main (/home/marxin/Programming/testcases/a.out+0x40067f)
#5 0x7ffff72c8b24 in __libc_start_main (/lib64/libc.so.6+0x27b24)
#6 0x4005bd in _start (/home/marxin/Programming/testcases/a.out+0x4005bd)
Differential Revision: https://reviews.llvm.org/D97263
Added:
Modified:
compiler-rt/lib/ubsan/ubsan_value.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/ubsan/ubsan_value.cpp b/compiler-rt/lib/ubsan/ubsan_value.cpp
index 79c3ba991d39..40042bf3a903 100644
--- a/compiler-rt/lib/ubsan/ubsan_value.cpp
+++ b/compiler-rt/lib/ubsan/ubsan_value.cpp
@@ -74,7 +74,7 @@ SIntMax Value::getSIntValue() const {
// to SIntMax.
const unsigned ExtraBits =
sizeof(SIntMax) * 8 - getType().getIntegerBitWidth();
- return SIntMax(Val) << ExtraBits >> ExtraBits;
+ return SIntMax(UIntMax(Val) << ExtraBits) >> ExtraBits;
}
if (getType().getIntegerBitWidth() == 64)
return *reinterpret_cast<s64*>(Val);
More information about the llvm-commits
mailing list