//@ 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) }