-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Put checks that detect UB under their own flag below debug_assertions
- Loading branch information
Showing
23 changed files
with
140 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# `ub-checks` | ||
|
||
-------------------- | ||
|
||
The `-Zub-checks` compiler flag enables additional runtime checks that detect some causes of Undefined Behavior at runtime. | ||
By default, `-Zub-checks` flag inherits the value of `-Cdebug-assertions`. | ||
|
||
All checks are generated on a best-effort basis; even if we have a check implemented for some cause of Undefined Behavior, it may be possible for the check to not fire. | ||
If a dependency is compiled with `-Zub-checks=no` but the final binary or library is compiled with `-Zub-checks=yes`, UB checks reached by the dependency are likely to be optimized out. | ||
|
||
When `-Zub-checks` detects UB, a non-unwinding panic is produced. | ||
That means that we will not unwind the stack and will not call any `Drop` impls, but we will execute the configured panic hook. | ||
We expect that unsafe code has been written which relies on code not unwinding which may have UB checks inserted. | ||
Ergo, an unwinding panic could easily turn works-as-intended UB into a much bigger problem. | ||
Calling the panic hook theoretically has the same implications, but we expect that the standard library panic hook will be stateless enough to be always called, and that if a user has configured a panic hook that the hook may be very helpful to debugging the detected UB. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
// With -Zub-checks=yes (enabled by default by -Cdebug-assertions=yes) we will produce a runtime | ||
// check that the index to slice::get_unchecked is in-bounds of the slice. That is tested for by | ||
// tests/ui/precondition-checks/out-of-bounds-get-unchecked.rs | ||
// | ||
// This test ensures that such a runtime check is *not* emitted when debug-assertions are enabled, | ||
// but ub-checks are explicitly disabled. | ||
|
||
//@ revisions: DEBUG NOCHECKS | ||
//@ [DEBUG] compile-flags: | ||
//@ [NOCHECKS] compile-flags: -Zub-checks=no | ||
//@ compile-flags: -O -Cdebug-assertions=yes | ||
|
||
#![crate_type = "lib"] | ||
|
||
use std::ops::Range; | ||
|
||
// CHECK-LABEL: @slice_get_unchecked( | ||
#[no_mangle] | ||
pub unsafe fn slice_get_unchecked(x: &[i32], i: usize) -> &i32 { | ||
// CHECK: icmp ult | ||
// NOCHECKS: tail call void @llvm.assume | ||
// DEBUG: br i1 | ||
// DEBUG: call core::panicking::panic_nounwind | ||
// DEBUG: unreachable | ||
// CHECK: getelementptr inbounds | ||
// CHECK: ret ptr | ||
x.get_unchecked(i) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#![crate_type = "lib"] | ||
|
||
pub fn ub_checks_are_enabled() -> bool { | ||
cfg!(ub_checks) //~ ERROR `cfg(ub_checks)` is experimental | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
error[E0658]: `cfg(ub_checks)` is experimental and subject to change | ||
--> $DIR/feature-gate-cfg_ub_checks.rs:4:10 | ||
| | ||
LL | cfg!(ub_checks) | ||
| ^^^^^^^^^ | ||
| | ||
= note: see issue #123499 <https://github.com/rust-lang/rust/issues/123499> for more information | ||
= help: add `#![feature(cfg_ub_checks)]` to the crate attributes to enable | ||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date | ||
|
||
error: aborting due to 1 previous error | ||
|
||
For more information about this error, try `rustc --explain E0658`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
//@ run-pass | ||
//@ revisions YES NO | ||
//@ [YES] compile-flags: -Cdebug-assertions=yes | ||
//@ [NO] compile-flags: -Cdebug-assertions=no | ||
|
||
#![feature(cfg_ub_checks)] | ||
|
||
fn main() { | ||
assert_eq!(cfg!(ub_checks), cfg!(debug_assertions)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
//@ run-pass | ||
//@ compile-flags: -Cdebug-assertions=yes -Zub-checks=no | ||
|
||
#![feature(cfg_ub_checks)] | ||
|
||
fn main() { | ||
assert!(!cfg!(ub_checks)); | ||
assert!(compiles_differently()); | ||
} | ||
|
||
#[cfg(ub_checks)] | ||
fn compiles_differently() -> bool { | ||
false | ||
} | ||
|
||
#[cfg(not(ub_checks))] | ||
fn compiles_differently() -> bool { | ||
true | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
//@ run-pass | ||
//@ compile-flags: -Cdebug-assertions=no -Zub-checks=yes | ||
|
||
#![feature(cfg_ub_checks)] | ||
|
||
fn main() { | ||
assert!(cfg!(ub_checks)); | ||
assert!(compiles_differently()); | ||
} | ||
|
||
#[cfg(ub_checks)] | ||
fn compiles_differently() -> bool { | ||
true | ||
} | ||
|
||
#[cfg(not(ub_checks))] | ||
fn compiles_differently() -> bool { | ||
false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters