about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2023-12-27 20:31:28 +0100
committerRalf Jung <post@ralfj.de>2023-12-27 20:31:28 +0100
commitdae48ea4bb28857153bf1705694022e7e0b411ce (patch)
treec6e5fa3ad5f0db6a7ae1c5c6fa9fb10334c5d6e2
parent4658d3816c8b103f0333aef93d2f36f0bf638338 (diff)
downloadrust-dae48ea4bb28857153bf1705694022e7e0b411ce.tar.gz
rust-dae48ea4bb28857153bf1705694022e7e0b411ce.zip
fast_math: detect non-finite results
-rw-r--r--src/tools/miri/src/shims/intrinsics/mod.rs6
-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.rs7
-rw-r--r--src/tools/miri/tests/fail/intrinsics/fast_math_result.stderr15
-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