Skip to content

Commit e03e58c

Browse files
committed
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 Cherry-pick from 16ede0956cb1f4b692dfa619ccfa6ab1de28e19b.
1 parent 74af13c commit e03e58c

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

libsanitizer/ubsan/ubsan_value.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ SIntMax Value::getSIntValue() const {
7474
// to SIntMax.
7575
const unsigned ExtraBits =
7676
sizeof(SIntMax) * 8 - getType().getIntegerBitWidth();
77-
return SIntMax(Val) << ExtraBits >> ExtraBits;
77+
return SIntMax(UIntMax(Val) << ExtraBits) >> ExtraBits;
7878
}
7979
if (getType().getIntegerBitWidth() == 64)
8080
return *reinterpret_cast<s64*>(Val);

0 commit comments

Comments
 (0)