Skip to content

Commit 2b7daaf

Browse files
[sanitizer][CFI] Add support to build CFI with sanitize-coverage (#131296)
Added ability to build together with -fsanitize=cfi and -fsanitize-coverage=trace-cmp at the same time.
1 parent c309abd commit 2b7daaf

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ static const SanitizerMask SupportsCoverage =
5454
SanitizerKind::FuzzerNoLink | SanitizerKind::FloatDivideByZero |
5555
SanitizerKind::SafeStack | SanitizerKind::ShadowCallStack |
5656
SanitizerKind::Thread | SanitizerKind::ObjCCast | SanitizerKind::KCFI |
57-
SanitizerKind::NumericalStability | SanitizerKind::Vptr;
57+
SanitizerKind::NumericalStability | SanitizerKind::Vptr |
58+
SanitizerKind::CFI;
5859
static const SanitizerMask RecoverableByDefault =
5960
SanitizerKind::Undefined | SanitizerKind::Integer |
6061
SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |

clang/test/CodeGen/sanitize-coverage.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// RUN: %clang %s -target x86_64-unknown-linux-gnu -emit-llvm -S -fsanitize=thread -fsanitize-coverage=trace-pc,trace-cmp -o - | FileCheck %s --check-prefixes=CHECK,TSAN
66
// RUN: %clang %s -target x86_64-unknown-linux-gnu -emit-llvm -S -fsanitize=undefined -fsanitize-coverage=trace-pc,trace-cmp -o - | FileCheck %s --check-prefixes=CHECK,UBSAN
77
// RUN: %clang %s -target x86_64-unknown-linux-gnu -emit-llvm -S -fsanitize=kcfi -fsanitize-coverage=trace-pc,trace-cmp -o - | FileCheck %s --check-prefixes=CHECK,KCFI
8+
// RUN: %clang %s -target x86_64-unknown-linux-gnu -emit-llvm -S -fsanitize=cfi -fsanitize-coverage=trace-pc,trace-cmp -flto -fvisibility=default -fno-sanitize-trap=cfi -fno-sanitize-ignorelist -resource-dir=/dev/null -o - | FileCheck %s --check-prefixes=CHECK,CFI
89

910
int x[10];
1011
extern void (*f)(void);
@@ -21,6 +22,7 @@ void foo(int n) {
2122
if (n)
2223
x[n] = 42;
2324
// KCFI-DAG: call void %[[#]]() [ "kcfi"(i32 {{.*}}) ]
25+
// CFI-DAG: call void @__ubsan_handle_cfi_check_fail_abort
2426
f();
2527
}
2628

@@ -47,6 +49,7 @@ __attribute__((no_sanitize("coverage"))) void test_no_sanitize_coverage(int n) {
4749
if (n)
4850
x[n] = 42;
4951
// KCFI-DAG: call void %[[#]]() [ "kcfi"(i32 {{.*}}) ]
52+
// CFI-DAG: call void @__ubsan_handle_cfi_check_fail_abort
5053
f();
5154
}
5255

@@ -94,6 +97,14 @@ void test_no_sanitize_kcfi(void) {
9497
f();
9598
}
9699

100+
// CHECK-LABEL: define dso_local void @test_no_sanitize_cfi(
101+
__attribute__((no_sanitize("cfi", "coverage")))
102+
void test_no_sanitize_cfi(void) {
103+
// CHECK-NOT: call void @__sanitizer_cov_trace
104+
// CFI-NOT: call void @__ubsan_handle_cfi_check_fail_abort
105+
f();
106+
}
107+
97108
// CHECK-LABEL: define dso_local void @test_no_sanitize_always_inline(
98109
__attribute__((no_sanitize("coverage")))
99110
void test_no_sanitize_always_inline(int n) {

clang/test/Driver/fsanitize-coverage.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=dataflow -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
1818
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
1919
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=kcfi -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
20+
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -fsanitize-coverage=func,trace-pc -flto -fvisibility=default -fno-sanitize-ignorelist -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
2021
// RUN: %clang --target=%itanium_abi_triple -fsanitize=float-divide-by-zero -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
2122
// RUN: %clang --target=x86_64-linux-gnu -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC
2223
// CHECK-SANITIZE-COVERAGE-FUNC: fsanitize-coverage-type=1

0 commit comments

Comments
 (0)