https://github.com/moorabbit updated https://github.com/llvm/llvm-project/pull/151348
>From fe34b28a97875ed27b8888a768942d9624655950 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Wed, 30 Jul 2025 10:50:58 -0400 Subject: [PATCH 1/2] [Clang][Basic] Enable `__has_feature(cfi)` Support `__has_feature(cfi)` to check for control flow integrity sanitizers. --- clang/include/clang/Basic/Features.def | 1 + clang/include/clang/Basic/Sanitizers.def | 2 +- clang/test/Lexer/has_feature_cfi.c | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 clang/test/Lexer/has_feature_cfi.c diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 72f23614aef11..4beb9a51dcf0b 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -303,6 +303,7 @@ FEATURE(is_trivially_assignable, LangOpts.CPlusPlus) FEATURE(is_trivially_constructible, LangOpts.CPlusPlus) FEATURE(is_trivially_copyable, LangOpts.CPlusPlus) FEATURE(is_union, LangOpts.CPlusPlus) +FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI)) FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI)) FEATURE(kcfi_arity, LangOpts.Sanitize.has(SanitizerKind::KCFI)) FEATURE(modules, LangOpts.Modules) diff --git a/clang/include/clang/Basic/Sanitizers.def b/clang/include/clang/Basic/Sanitizers.def index 1d0e97cc7fb4c..aad758ceb9d40 100644 --- a/clang/include/clang/Basic/Sanitizers.def +++ b/clang/include/clang/Basic/Sanitizers.def @@ -134,7 +134,7 @@ SANITIZER("cfi-nvcall", CFINVCall) SANITIZER("cfi-vcall", CFIVCall) SANITIZER_GROUP("cfi", CFI, CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast | - CFINVCall | CFIVCall) + CFINVCall | CFIVCall | CFICastStrict) // Kernel Control Flow Integrity SANITIZER("kcfi", KCFI) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c new file mode 100644 index 0000000000000..df472944e6d9e --- /dev/null +++ b/clang/test/Lexer/has_feature_cfi.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -E -fsanitize=cfi-cast-strict -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-derived-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-icall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-mfcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-unrelated-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-nvcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E -fsanitize=cfi-vcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-CFISAN %s + +#if __has_feature(cfi) +int CFISanitizerEnabled(); +#else +int CFISanitizerDisabled(); +#endif + +// CHECK-CFISAN: CFISanitizerEnabled +// CHECK-NO-CFISAN: CFISanitizerDisabled + >From 9733879c9e8dfdbcbebe5f958af9ef0893202ac8 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Thu, 31 Jul 2025 06:48:57 -0400 Subject: [PATCH 2/2] Add more test cases --- clang/include/clang/Basic/Features.def | 2 +- clang/test/Lexer/has_feature_cfi.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 4beb9a51dcf0b..35833268755f5 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -303,7 +303,7 @@ FEATURE(is_trivially_assignable, LangOpts.CPlusPlus) FEATURE(is_trivially_constructible, LangOpts.CPlusPlus) FEATURE(is_trivially_copyable, LangOpts.CPlusPlus) FEATURE(is_union, LangOpts.CPlusPlus) -FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI)) +FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI | SanitizerKind::KCFI)) FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI)) FEATURE(kcfi_arity, LangOpts.Sanitize.has(SanitizerKind::KCFI)) FEATURE(modules, LangOpts.Modules) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c index df472944e6d9e..b7b3db4897ab1 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -5,7 +5,20 @@ // RUN: %clang_cc1 -E -fsanitize=cfi-unrelated-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s // RUN: %clang_cc1 -E -fsanitize=cfi-nvcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s // RUN: %clang_cc1 -E -fsanitize=cfi-vcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s -// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-CFISAN %s + +// RUN: %clang_cc1 -E -fsanitize=kcfi -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s + +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi -fsanitize-cfi-cross-dso -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN + +// Disable CFI sanitizers. +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFISAN + +// Disable some but not all CFI schemes. +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi -fno-sanitize-cfi-cross-dso -fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN + +// Disable all CFI schemes. This essentially disables CFI sanitizers. +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi -fno-sanitize-cfi-cross-dso -fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall,cfi-cast-strict,cfi-derived-cast,cfi-unrelated-cast -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFISAN #if __has_feature(cfi) int CFISanitizerEnabled(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits