Skip to content

Commit fe34b28

Browse files
committed
[Clang][Basic] Enable __has_feature(cfi)
Support `__has_feature(cfi)` to check for control flow integrity sanitizers.
1 parent ccc96e6 commit fe34b28

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

clang/include/clang/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ FEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
303303
FEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
304304
FEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
305305
FEATURE(is_union, LangOpts.CPlusPlus)
306+
FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI))
306307
FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
307308
FEATURE(kcfi_arity, LangOpts.Sanitize.has(SanitizerKind::KCFI))
308309
FEATURE(modules, LangOpts.Modules)

clang/include/clang/Basic/Sanitizers.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ SANITIZER("cfi-nvcall", CFINVCall)
134134
SANITIZER("cfi-vcall", CFIVCall)
135135
SANITIZER_GROUP("cfi", CFI,
136136
CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast |
137-
CFINVCall | CFIVCall)
137+
CFINVCall | CFIVCall | CFICastStrict)
138138

139139
// Kernel Control Flow Integrity
140140
SANITIZER("kcfi", KCFI)

clang/test/Lexer/has_feature_cfi.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// RUN: %clang_cc1 -E -fsanitize=cfi-cast-strict -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
2+
// RUN: %clang_cc1 -E -fsanitize=cfi-derived-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
3+
// RUN: %clang_cc1 -E -fsanitize=cfi-icall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
4+
// RUN: %clang_cc1 -E -fsanitize=cfi-mfcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
5+
// RUN: %clang_cc1 -E -fsanitize=cfi-unrelated-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
6+
// RUN: %clang_cc1 -E -fsanitize=cfi-nvcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
7+
// RUN: %clang_cc1 -E -fsanitize=cfi-vcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
8+
// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-CFISAN %s
9+
10+
#if __has_feature(cfi)
11+
int CFISanitizerEnabled();
12+
#else
13+
int CFISanitizerDisabled();
14+
#endif
15+
16+
// CHECK-CFISAN: CFISanitizerEnabled
17+
// CHECK-NO-CFISAN: CFISanitizerDisabled
18+

0 commit comments

Comments
 (0)