about summary refs log tree commit diff
path: root/tests/ui/sanitize/memory.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/sanitize/memory.rs')
-rw-r--r--tests/ui/sanitize/memory.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/ui/sanitize/memory.rs b/tests/ui/sanitize/memory.rs
new file mode 100644
index 00000000000..1a9ac3a4f3c
--- /dev/null
+++ b/tests/ui/sanitize/memory.rs
@@ -0,0 +1,46 @@
+// 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-fail
+// error-pattern: MemorySanitizer: use-of-uninitialized-value
+// error-pattern: Uninitialized value was created by an allocation
+// error-pattern: in the stack frame
+//
+// 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;
+use std::mem::MaybeUninit;
+
+#[inline(never)]
+#[no_mangle]
+fn random() -> [isize; 32] {
+    let r = MaybeUninit::uninit();
+    // Avoid optimizing everything out.
+    unsafe { std::intrinsics::volatile_load(r.as_ptr()) }
+}
+
+#[inline(never)]
+#[no_mangle]
+fn xor(a: &[isize]) -> isize {
+    let mut s = 0;
+    for i in 0..a.len() {
+        s = s ^ a[i];
+    }
+    s
+}
+
+#[start]
+fn main(_: isize, _: *const *const u8) -> isize {
+    let r = black_box(random as fn() -> [isize; 32])();
+    xor(&r)
+}