diff options
| author | Ralf Jung <post@ralfj.de> | 2023-12-27 20:31:28 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2023-12-27 20:31:28 +0100 |
| commit | dae48ea4bb28857153bf1705694022e7e0b411ce (patch) | |
| tree | c6e5fa3ad5f0db6a7ae1c5c6fa9fb10334c5d6e2 | |
| parent | 4658d3816c8b103f0333aef93d2f36f0bf638338 (diff) | |
| download | rust-dae48ea4bb28857153bf1705694022e7e0b411ce.tar.gz rust-dae48ea4bb28857153bf1705694022e7e0b411ce.zip | |
fast_math: detect non-finite results
| -rw-r--r-- | src/tools/miri/src/shims/intrinsics/mod.rs | 6 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_both.rs (renamed from src/tools/miri/tests/fail/fast_math_both.rs) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr (renamed from src/tools/miri/tests/fail/fast_math_both.stderr) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_first.rs (renamed from src/tools/miri/tests/fail/fast_math_first.rs) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr (renamed from src/tools/miri/tests/fail/fast_math_first.stderr) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_result.rs | 7 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr | 15 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_second.rs (renamed from src/tools/miri/tests/fail/fast_math_second.rs) | 0 | ||||
| -rw-r--r-- | src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr (renamed from src/tools/miri/tests/fail/fast_math_second.stderr) | 0 |
9 files changed, 27 insertions, 1 deletions
diff --git a/src/tools/miri/src/shims/intrinsics/mod.rs b/src/tools/miri/src/shims/intrinsics/mod.rs index 66918db995d..625ae3ef39e 100644 --- a/src/tools/miri/src/shims/intrinsics/mod.rs +++ b/src/tools/miri/src/shims/intrinsics/mod.rs @@ -268,7 +268,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { ), _ => {} } - this.binop_ignore_overflow(op, &a, &b, dest)?; + let res = this.wrapping_binary_op(op, &a, &b)?; + if !float_finite(&res)? { + throw_ub_format!("`{intrinsic_name}` intrinsic produced non-finite value as result"); + } + this.write_immediate(*res, dest)?; } #[rustfmt::skip] diff --git a/src/tools/miri/tests/fail/fast_math_both.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_both.rs index dd2787bf40f..dd2787bf40f 100644 --- a/src/tools/miri/tests/fail/fast_math_both.rs +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_both.rs diff --git a/src/tools/miri/tests/fail/fast_math_both.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr index feba0c5991c..feba0c5991c 100644 --- a/src/tools/miri/tests/fail/fast_math_both.stderr +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr diff --git a/src/tools/miri/tests/fail/fast_math_first.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_first.rs index e495498ab28..e495498ab28 100644 --- a/src/tools/miri/tests/fail/fast_math_first.rs +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_first.rs diff --git a/src/tools/miri/tests/fail/fast_math_first.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr index b26b5a37215..b26b5a37215 100644 --- a/src/tools/miri/tests/fail/fast_math_first.stderr +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr diff --git a/src/tools/miri/tests/fail/intrinsics/fast_math_result.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_result.rs new file mode 100644 index 00000000000..4a143da0575 --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_result.rs @@ -0,0 +1,7 @@ +#![feature(core_intrinsics)] + +fn main() { + unsafe { + let _x: f32 = core::intrinsics::fdiv_fast(1.0, 0.0); //~ ERROR: `fdiv_fast` intrinsic produced non-finite value as result + } +} diff --git a/src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr new file mode 100644 index 00000000000..5b24d225026 --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr @@ -0,0 +1,15 @@ +error: Undefined Behavior: `fdiv_fast` intrinsic produced non-finite value as result + --> $DIR/fast_math_result.rs:LL:CC + | +LL | let _x: f32 = core::intrinsics::fdiv_fast(1.0, 0.0); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fdiv_fast` intrinsic produced non-finite value as result + | + = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior + = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information + = note: BACKTRACE: + = note: inside `main` at $DIR/fast_math_result.rs:LL:CC + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to 1 previous error + diff --git a/src/tools/miri/tests/fail/fast_math_second.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_second.rs index 408c461077f..408c461077f 100644 --- a/src/tools/miri/tests/fail/fast_math_second.rs +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_second.rs diff --git a/src/tools/miri/tests/fail/fast_math_second.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr index cb46aa97a8d..cb46aa97a8d 100644 --- a/src/tools/miri/tests/fail/fast_math_second.stderr +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr |
