teak-llvm/clang/test/CodeGen/sanitize-recover.c
Vedant Kumar 4b62b5cddd [ubsan] Mark overflow checks with !nosanitize
Sanitizer instrumentation generally needs to be marked with !nosanitize,
but we're not doing this properly for ubsan's overflow checks.

r213291 has more information about why this is needed.

llvm-svn: 302598
2017-05-09 23:34:49 +00:00

29 lines
1.2 KiB
C

// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsanitize=unsigned-integer-overflow -fsanitize-recover=unsigned-integer-overflow %s -emit-llvm -o - | FileCheck %s --check-prefix=RECOVER
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsanitize=unsigned-integer-overflow %s -emit-llvm -o - | FileCheck %s --check-prefix=ABORT
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsanitize=null,object-size,alignment -fsanitize-recover=object-size %s -emit-llvm -o - | FileCheck %s --check-prefix=PARTIAL
// RECOVER: @test
// ABORT: @test
void test() {
extern volatile unsigned x, y, z;
// RECOVER: uadd.with.overflow.i32{{.*}}, !nosanitize
// RECOVER: ubsan_handle_add_overflow({{.*}}, !nosanitize
// RECOVER-NOT: unreachable
// ABORT: uadd.with.overflow.i32{{.*}}, !nosanitize
// ABORT: ubsan_handle_add_overflow_abort({{.*}}, !nosanitize
// ABORT: unreachable{{.*}}, !nosanitize
x = y + z;
}
void foo() {
union { int i; } u;
u.i=1;
// PARTIAL: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 false)
// PARTIAL-NEXT: %[[CHECK0:.*]] = icmp uge i64 %[[SIZE]], 4
// PARTIAL: br i1 %[[CHECK0]], {{.*}} !nosanitize
// PARTIAL: call void @__ubsan_handle_type_mismatch_v1(
}