Skip to content

Commit 7aa8ece

Browse files
authored
[Driver][CFI] Allow CFI with minimal runtime (#137103)
It was introduced with original "minimal runtime" patch without explanation: https://reviews.llvm.org/D36810#:~:text=if%20(-,NonTrappingCfi,-) Note, the same commit contains `cfi_check_fail` handler, which can not be reached with `-fsanitize-trap=cfi`. This patch makes CFI min runtime behavior consistent with UBSAN: `-fsanitize-trap=` ignores `-fsanitize-minimal-runtime`, `-fno-sanitize-trap=` with `-fsanitize-minimal-runtime` compiles and link minimal runtime.
1 parent ffbd6ba commit 7aa8ece

File tree

3 files changed

+8
-18
lines changed

3 files changed

+8
-18
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -849,12 +849,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
849849
D.Diag(clang::diag::err_drv_argument_not_allowed_with)
850850
<< "-fsanitize-minimal-runtime"
851851
<< lastArgumentForMask(D, Args, IncompatibleMask);
852-
853-
SanitizerMask NonTrappingCfi = Kinds & SanitizerKind::CFI & ~TrappingKinds;
854-
if (NonTrappingCfi && DiagnoseErrors)
855-
D.Diag(clang::diag::err_drv_argument_only_allowed_with)
856-
<< "-fsanitize-minimal-runtime"
857-
<< "-fsanitize-trap=cfi";
858852
}
859853

860854
for (const auto *Arg : Args.filtered(

clang/test/Driver/fsanitize.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -961,19 +961,18 @@
961961
// CHECK-CFI-ABORT-MINIMAL: "-fsanitize-trap=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
962962
// CHECK-CFI-ABORT-MINIMAL: "-fsanitize-minimal-runtime"
963963

964-
// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fsanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-RECOVER-MINIMAL --
965-
// CHECK-CFI-NOTRAP-RECOVER-MINIMAL: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
964+
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fsanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-RECOVER-MINIMAL --
966965
// CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
967966
// CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize-recover=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
968967
// CHECK-CFI-NOTRAP-RECOVER-MINIMAL: "-fsanitize-minimal-runtime"
969968

970-
// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fno-sanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-ABORT-MINIMAL
971-
// CHECK-CFI-NOTRAP-ABORT-MINIMAL: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
969+
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime -fno-sanitize-trap=cfi -fno-sanitize-recover=cfi -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-ABORT-MINIMAL
972970
// CHECK-CFI-NOTRAP-ABORT-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
973971
// CHECK-CFI-NOTRAP-ABORT-MINIMAL: "-fsanitize-minimal-runtime"
974972

975-
// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-MINIMAL
976-
// CHECK-CFI-NOTRAP-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
973+
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOTRAP-MINIMAL
974+
// CHECK-CFI-NOTRAP-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
975+
// CHECK-CFI-NOTRAP-MINIMAL: "-fsanitize-trap=cfi-derived-cast,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"
977976

978977
// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -fno-sanitize-trap=cfi-icall -fno-sanitize=cfi-icall -flto -fvisibility=hidden -fsanitize-minimal-runtime -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-NOICALL-MINIMAL
979978
// CHECK-CFI-NOICALL-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall"

clang/test/Driver/sanitizer-ld.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -920,15 +920,14 @@
920920
// CHECK-CFI-MINRT-LINUX: "{{.*}}ld{{(.exe)?}}"
921921

922922
// CFI with diagnostics links the UBSan runtime.
923-
// RUN: not %clang -fsanitize=cfi -fno-sanitize-trap=cfi -fsanitize-recover=cfi \
923+
// RUN: %clang -fsanitize=cfi -fno-sanitize-trap=cfi -fsanitize-recover=cfi \
924924
// RUN: -flto -fvisibility=hidden \
925925
// RUN: -fsanitize-minimal-runtime \
926926
// RUN: --target=x86_64-unknown-linux -fuse-ld=ld \
927927
// RUN: -resource-dir=%S/Inputs/resource_dir \
928928
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
929929
// RUN: -### %s 2>&1 \
930930
// RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-DIAG-LINUX
931-
// CHECK-CFI-MINRT-DIAG-LINUX: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
932931
// CHECK-CFI-MINRT-DIAG-LINUX: "{{.*}}ld{{(.exe)?}}"
933932
// CHECK-CFI-MINRT-DIAG-LINUX: "--whole-archive" "{{[^"]*}}libclang_rt.ubsan_minimal.a" "--no-whole-archive"
934933

@@ -946,7 +945,7 @@
946945
// CHECK-CFI-MINRT-CROSS-DSO-LINUX: -export-dynamic
947946

948947
// Cross-DSO CFI with diagnostics links just the CFI runtime.
949-
// RUN: not %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \
948+
// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \
950949
// RUN: -flto -fvisibility=hidden \
951950
// RUN: -fsanitize-minimal-runtime \
952951
// RUN: -fno-sanitize-trap=cfi -fsanitize-recover=cfi \
@@ -955,7 +954,6 @@
955954
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
956955
// RUN: -### %s 2>&1 \
957956
// RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX
958-
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
959957
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: "{{.*}}ld{{(.exe)?}}"
960958
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: "--whole-archive" "{{[^"]*}}libclang_rt.cfi_diag.a" "--no-whole-archive"
961959
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-LINUX: -export-dynamic
@@ -972,7 +970,7 @@
972970
// CHECK-CFI-MINRT-CROSS-DSO-ANDROID: "{{.*}}ld{{(.exe)?}}"
973971

974972
// Cross-DSO CFI with diagnostics on Android links just the UBSAN runtime.
975-
// RUN: not %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \
973+
// RUN: %clang -fsanitize=cfi -fsanitize-cfi-cross-dso \
976974
// RUN: -flto -fvisibility=hidden \
977975
// RUN: -fsanitize-minimal-runtime \
978976
// RUN: -fno-sanitize-trap=cfi -fsanitize-recover=cfi \
@@ -981,7 +979,6 @@
981979
// RUN: --sysroot=%S/Inputs/basic_android_tree \
982980
// RUN: -### %s 2>&1 \
983981
// RUN: | %{filecheck} --check-prefix=CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID
984-
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: '-fsanitize-minimal-runtime' only allowed with '-fsanitize-trap=cfi'
985982
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "{{.*}}ld{{(.exe)?}}"
986983
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "{{[^"]*}}libclang_rt.ubsan_minimal.so"
987984
// CHECK-CFI-MINRT-CROSS-DSO-DIAG-ANDROID: "--export-dynamic-symbol=__cfi_check"

0 commit comments

Comments
 (0)