mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 23:12:02 +00:00
6d75f54310
Moves the sanitizer ui tests to the sanitizer directory and removes the sanitizer prefix from tests file names similarly to how the sanitizer codegen tests are organized.
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
//@ 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)
|
|
}
|