From dae48ea4bb28857153bf1705694022e7e0b411ce Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 27 Dec 2023 20:31:28 +0100 Subject: fast_math: detect non-finite results --- src/tools/miri/src/shims/intrinsics/mod.rs | 6 +++++- src/tools/miri/tests/fail/fast_math_both.rs | 7 ------- src/tools/miri/tests/fail/fast_math_both.stderr | 15 --------------- src/tools/miri/tests/fail/fast_math_first.rs | 7 ------- src/tools/miri/tests/fail/fast_math_first.stderr | 15 --------------- src/tools/miri/tests/fail/fast_math_second.rs | 7 ------- src/tools/miri/tests/fail/fast_math_second.stderr | 15 --------------- src/tools/miri/tests/fail/intrinsics/fast_math_both.rs | 7 +++++++ .../miri/tests/fail/intrinsics/fast_math_both.stderr | 15 +++++++++++++++ src/tools/miri/tests/fail/intrinsics/fast_math_first.rs | 7 +++++++ .../miri/tests/fail/intrinsics/fast_math_first.stderr | 15 +++++++++++++++ src/tools/miri/tests/fail/intrinsics/fast_math_result.rs | 7 +++++++ .../miri/tests/fail/intrinsics/fast_math_result.stderr | 15 +++++++++++++++ src/tools/miri/tests/fail/intrinsics/fast_math_second.rs | 7 +++++++ .../miri/tests/fail/intrinsics/fast_math_second.stderr | 15 +++++++++++++++ 15 files changed, 93 insertions(+), 67 deletions(-) delete mode 100644 src/tools/miri/tests/fail/fast_math_both.rs delete mode 100644 src/tools/miri/tests/fail/fast_math_both.stderr delete mode 100644 src/tools/miri/tests/fail/fast_math_first.rs delete mode 100644 src/tools/miri/tests/fail/fast_math_first.stderr delete mode 100644 src/tools/miri/tests/fail/fast_math_second.rs delete mode 100644 src/tools/miri/tests/fail/fast_math_second.stderr create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_both.rs create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_first.rs create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_result.rs create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_second.rs create mode 100644 src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr 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/fast_math_both.rs deleted file mode 100644 index dd2787bf40f..00000000000 --- a/src/tools/miri/tests/fail/fast_math_both.rs +++ /dev/null @@ -1,7 +0,0 @@ -#![feature(core_intrinsics)] - -fn main() { - unsafe { - let _x: f32 = core::intrinsics::fsub_fast(f32::NAN, f32::NAN); //~ ERROR: `fsub_fast` intrinsic called with non-finite value as both parameters - } -} diff --git a/src/tools/miri/tests/fail/fast_math_both.stderr b/src/tools/miri/tests/fail/fast_math_both.stderr deleted file mode 100644 index feba0c5991c..00000000000 --- a/src/tools/miri/tests/fail/fast_math_both.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: Undefined Behavior: `fsub_fast` intrinsic called with non-finite value as both parameters - --> $DIR/fast_math_both.rs:LL:CC - | -LL | ...: f32 = core::intrinsics::fsub_fast(f32::NAN, f32::NAN); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fsub_fast` intrinsic called with non-finite value as both parameters - | - = 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_both.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_first.rs b/src/tools/miri/tests/fail/fast_math_first.rs deleted file mode 100644 index e495498ab28..00000000000 --- a/src/tools/miri/tests/fail/fast_math_first.rs +++ /dev/null @@ -1,7 +0,0 @@ -#![feature(core_intrinsics)] - -fn main() { - unsafe { - let _x: f32 = core::intrinsics::frem_fast(f32::NAN, 3.2); //~ ERROR: `frem_fast` intrinsic called with non-finite value as first parameter - } -} diff --git a/src/tools/miri/tests/fail/fast_math_first.stderr b/src/tools/miri/tests/fail/fast_math_first.stderr deleted file mode 100644 index b26b5a37215..00000000000 --- a/src/tools/miri/tests/fail/fast_math_first.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: Undefined Behavior: `frem_fast` intrinsic called with non-finite value as first parameter - --> $DIR/fast_math_first.rs:LL:CC - | -LL | ... let _x: f32 = core::intrinsics::frem_fast(f32::NAN, 3.2); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `frem_fast` intrinsic called with non-finite value as first parameter - | - = 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_first.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/fast_math_second.rs deleted file mode 100644 index 408c461077f..00000000000 --- a/src/tools/miri/tests/fail/fast_math_second.rs +++ /dev/null @@ -1,7 +0,0 @@ -#![feature(core_intrinsics)] - -fn main() { - unsafe { - let _x: f32 = core::intrinsics::fmul_fast(3.4f32, f32::INFINITY); //~ ERROR: `fmul_fast` intrinsic called with non-finite value as second parameter - } -} diff --git a/src/tools/miri/tests/fail/fast_math_second.stderr b/src/tools/miri/tests/fail/fast_math_second.stderr deleted file mode 100644 index cb46aa97a8d..00000000000 --- a/src/tools/miri/tests/fail/fast_math_second.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: Undefined Behavior: `fmul_fast` intrinsic called with non-finite value as second parameter - --> $DIR/fast_math_second.rs:LL:CC - | -LL | ...f32 = core::intrinsics::fmul_fast(3.4f32, f32::INFINITY); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fmul_fast` intrinsic called with non-finite value as second parameter - | - = 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_second.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/intrinsics/fast_math_both.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_both.rs new file mode 100644 index 00000000000..dd2787bf40f --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_both.rs @@ -0,0 +1,7 @@ +#![feature(core_intrinsics)] + +fn main() { + unsafe { + let _x: f32 = core::intrinsics::fsub_fast(f32::NAN, f32::NAN); //~ ERROR: `fsub_fast` intrinsic called with non-finite value as both parameters + } +} diff --git a/src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr new file mode 100644 index 00000000000..feba0c5991c --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_both.stderr @@ -0,0 +1,15 @@ +error: Undefined Behavior: `fsub_fast` intrinsic called with non-finite value as both parameters + --> $DIR/fast_math_both.rs:LL:CC + | +LL | ...: f32 = core::intrinsics::fsub_fast(f32::NAN, f32::NAN); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fsub_fast` intrinsic called with non-finite value as both parameters + | + = 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_both.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/intrinsics/fast_math_first.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_first.rs new file mode 100644 index 00000000000..e495498ab28 --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_first.rs @@ -0,0 +1,7 @@ +#![feature(core_intrinsics)] + +fn main() { + unsafe { + let _x: f32 = core::intrinsics::frem_fast(f32::NAN, 3.2); //~ ERROR: `frem_fast` intrinsic called with non-finite value as first parameter + } +} diff --git a/src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr new file mode 100644 index 00000000000..b26b5a37215 --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_first.stderr @@ -0,0 +1,15 @@ +error: Undefined Behavior: `frem_fast` intrinsic called with non-finite value as first parameter + --> $DIR/fast_math_first.rs:LL:CC + | +LL | ... let _x: f32 = core::intrinsics::frem_fast(f32::NAN, 3.2); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `frem_fast` intrinsic called with non-finite value as first parameter + | + = 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_first.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/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/intrinsics/fast_math_second.rs b/src/tools/miri/tests/fail/intrinsics/fast_math_second.rs new file mode 100644 index 00000000000..408c461077f --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_second.rs @@ -0,0 +1,7 @@ +#![feature(core_intrinsics)] + +fn main() { + unsafe { + let _x: f32 = core::intrinsics::fmul_fast(3.4f32, f32::INFINITY); //~ ERROR: `fmul_fast` intrinsic called with non-finite value as second parameter + } +} diff --git a/src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr b/src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr new file mode 100644 index 00000000000..cb46aa97a8d --- /dev/null +++ b/src/tools/miri/tests/fail/intrinsics/fast_math_second.stderr @@ -0,0 +1,15 @@ +error: Undefined Behavior: `fmul_fast` intrinsic called with non-finite value as second parameter + --> $DIR/fast_math_second.rs:LL:CC + | +LL | ...f32 = core::intrinsics::fmul_fast(3.4f32, f32::INFINITY); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `fmul_fast` intrinsic called with non-finite value as second parameter + | + = 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_second.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 + -- cgit 1.4.1-3-g733a5