about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorKrasimir Georgiev <krasimir@google.com>2022-11-04 16:27:28 +0000
committerKrasimir Georgiev <krasimir@google.com>2022-11-08 11:19:14 +0000
commit0e0bcd95cda4293915ecd68921320a0928cdd0bb (patch)
tree55bc7801d79ea5e89ab474b6fafd280c5d879f85 /src/test
parent47c008e440e59d793c2883f7dd712481dc965045 (diff)
downloadrust-0e0bcd95cda4293915ecd68921320a0928cdd0bb.tar.gz
rust-0e0bcd95cda4293915ecd68921320a0928cdd0bb.zip
prevent uninitialized access in black_box for zero-sized-types
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/sanitize/memory-passing.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/test/ui/sanitize/memory-passing.rs b/src/test/ui/sanitize/memory-passing.rs
new file mode 100644
index 00000000000..6d9b70ad6b1
--- /dev/null
+++ b/src/test/ui/sanitize/memory-passing.rs
@@ -0,0 +1,32 @@
+// needs-sanitizer-support
+// needs-sanitizer-memory
+//
+// revisions: unoptimized optimized
+//
+// [optimized]compile-flags: -Z sanitizer=memory -Zsanitizer-memory-track-origins -O
+// [unoptimized]compile-flags: -Z sanitizer=memory -Zsanitizer-memory-track-origins
+//
+// run-pass
+//
+// This test case intentionally limits the usage of the std,
+// since it will be linked with an uninstrumented version of it.
+
+#![feature(core_intrinsics)]
+#![feature(start)]
+#![allow(invalid_value)]
+
+use std::hint::black_box;
+
+fn calling_black_box_on_zst_ok() {
+    // It's OK to call black_box on a value of a zero-sized type, even if its
+    // underlying the memory location is uninitialized. For non-zero-sized types,
+    // this would be an MSAN error.
+    let zst = ();
+    black_box(zst);
+}
+
+#[start]
+fn main(_: isize, _: *const *const u8) -> isize {
+    calling_black_box_on_zst_ok();
+    0
+}