Skip to content

Commit 29c1a2b

Browse files
committed
KCFI: Require -C panic=abort
While the KCFI scheme is not incompatible with unwinding, LLVM's `invoke` instruction does not currently support KCFI bundles. While it likely will in the near future, we won't be able to assume that in Rust for a while.
1 parent 45796d1 commit 29c1a2b

File tree

8 files changed

+16
-0
lines changed

8 files changed

+16
-0
lines changed

Diff for: compiler/rustc_session/messages.ftl

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ session_sanitizer_cfi_requires_lto = `-Zsanitizer=cfi` requires `-Clto` or `-Cli
9696
9797
session_sanitizer_cfi_requires_single_codegen_unit = `-Zsanitizer=cfi` with `-Clto` requires `-Ccodegen-units=1`
9898
99+
session_sanitizer_kcfi_requires_panic_abort = `-Z sanitizer=kcfi` requires `-C panic=abort`
100+
99101
session_sanitizer_not_supported = {$us} sanitizer is not supported for this target
100102
101103
session_sanitizers_not_supported = {$us} sanitizers are not supported for this target

Diff for: compiler/rustc_session/src/errors.rs

+4
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ pub(crate) struct SanitizerCfiGeneralizePointersRequiresCfi;
145145
#[diag(session_sanitizer_cfi_normalize_integers_requires_cfi)]
146146
pub(crate) struct SanitizerCfiNormalizeIntegersRequiresCfi;
147147

148+
#[derive(Diagnostic)]
149+
#[diag(session_sanitizer_kcfi_requires_panic_abort)]
150+
pub(crate) struct SanitizerKcfiRequiresPanicAbort;
151+
148152
#[derive(Diagnostic)]
149153
#[diag(session_split_lto_unit_requires_lto)]
150154
pub(crate) struct SplitLtoUnitRequiresLto;

Diff for: compiler/rustc_session/src/session.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,11 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
12341234
sess.dcx().emit_err(errors::SanitizerCfiRequiresLto);
12351235
}
12361236

1237+
// KCFI requires panic=abort
1238+
if sess.is_sanitizer_kcfi_enabled() && sess.panic_strategy() != PanicStrategy::Abort {
1239+
sess.dcx().emit_err(errors::SanitizerKcfiRequiresPanicAbort);
1240+
}
1241+
12371242
// LLVM CFI using rustc LTO requires a single codegen unit.
12381243
if sess.is_sanitizer_cfi_enabled()
12391244
&& sess.lto() == config::Lto::Fat

Diff for: tests/ui/sanitizer/cfg.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//@[cfi]compile-flags: -Clto -Ccodegen-units=1
1212
//@[kcfi]needs-llvm-components: x86
1313
//@[kcfi]compile-flags: -Zsanitizer=kcfi --cfg kcfi --target x86_64-unknown-none
14+
//@[kcfi]compile-flags: -C panic=abort
1415
//@[leak]needs-sanitizer-leak
1516
//@[leak]compile-flags: -Zsanitizer=leak --cfg leak
1617
//@[memory]needs-sanitizer-memory

Diff for: tests/ui/sanitizer/cfi-closure-fn-ptr-cast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//@ [cfi] compile-flags: -C codegen-units=1 -C lto -C prefer-dynamic=off -C opt-level=0
1515
//@ [cfi] compile-flags: -Z sanitizer=cfi
1616
//@ [kcfi] compile-flags: -Z sanitizer=kcfi
17+
//@ [kcfi] compile-flags: -C panic=abort -C prefer-dynamic=off
1718
//@ run-pass
1819

1920
pub fn main() {

Diff for: tests/ui/sanitizer/cfi-complex-receiver.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//@ [cfi] compile-flags: -C codegen-units=1 -C lto -C prefer-dynamic=off -C opt-level=0
1212
//@ [cfi] compile-flags: -Z sanitizer=cfi
1313
//@ [kcfi] compile-flags: -Z sanitizer=kcfi
14+
//@ [kcfi] compile-flags: -C panic=abort -C prefer-dynamic=off
1415
//@ run-pass
1516

1617
use std::sync::Arc;

Diff for: tests/ui/sanitizer/cfi-self-ref.rs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
//@ [cfi] compile-flags: -C codegen-units=1 -C lto -C prefer-dynamic=off -C opt-level=0
1010
//@ [cfi] compile-flags: -Z sanitizer=cfi
1111
//@ [kcfi] compile-flags: -Z sanitizer=kcfi
12+
//@ [kcfi] compile-flags: -C panic=abort -C prefer-dynamic=off
1213
//@ run-pass
1314

1415
use std::marker::PhantomData;

Diff for: tests/ui/sanitizer/cfi-virtual-auto.rs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
//@ [cfi] compile-flags: -C codegen-units=1 -C lto -C prefer-dynamic=off -C opt-level=0
1010
//@ [cfi] compile-flags: -Z sanitizer=cfi
1111
//@ [kcfi] compile-flags: -Z sanitizer=kcfi
12+
//@ [kcfi] compile-flags: -C panic=abort -C prefer-dynamic=off
1213
//@ run-pass
1314

1415
trait Foo {

0 commit comments

Comments
 (0)