Skip to content

Commit

Permalink
Enable eager checks for memory sanitizer
Browse files Browse the repository at this point in the history
  • Loading branch information
5225225 committed Aug 14, 2022
1 parent 2fbc08e commit 66dcf5d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
15 changes: 14 additions & 1 deletion compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,12 @@ extern "C" LLVMPassRef LLVMRustCreateMemorySanitizerPass(int TrackOrigins, bool
const bool CompileKernel = false;

return wrap(createMemorySanitizerLegacyPassPass(
MemorySanitizerOptions{TrackOrigins, Recover, CompileKernel}));
#if LLVM_VERSION_GE(14, 0)
MemorySanitizerOptions{TrackOrigins, Recover, CompileKernel, /*EagerChecks=*/true}
#else
MemorySanitizerOptions{TrackOrigins, Recover, CompileKernel}
#endif
));
#else
report_fatal_error("Legacy PM not supported with LLVM 15");
#endif
Expand Down Expand Up @@ -931,10 +936,18 @@ LLVMRustOptimizeWithNewPassManager(

if (SanitizerOptions) {
if (SanitizerOptions->SanitizeMemory) {
#if LLVM_VERSION_GE(14, 0)
MemorySanitizerOptions Options(
SanitizerOptions->SanitizeMemoryTrackOrigins,
SanitizerOptions->SanitizeMemoryRecover,
/*CompileKernel=*/false,
/*EagerChecks=*/true);
#else
MemorySanitizerOptions Options(
SanitizerOptions->SanitizeMemoryTrackOrigins,
SanitizerOptions->SanitizeMemoryRecover,
/*CompileKernel=*/false);
#endif
OptimizerLastEPCallbacks.push_back(
[Options](ModulePassManager &MPM, OptimizationLevel Level) {
#if LLVM_VERSION_GE(14, 0)
Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/sanitize/memory-eager.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// needs-sanitizer-support
// needs-sanitizer-memory
// min-llvm-version: 14.0.0
//
// compile-flags: -Z sanitizer=memory -Zsanitizer-memory-track-origins -O
//
// run-fail
// error-pattern: MemorySanitizer: use-of-uninitialized-value
// error-pattern: Uninitialized value was created by an allocation
// error-pattern: in the stack frame of function 'random'
//
// 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)]
#![feature(bench_black_box)]

use std::hint::black_box;
use std::mem::MaybeUninit;

#[inline(never)]
#[no_mangle]
#[allow(invalid_value)]
fn random() -> char {
let r = unsafe { MaybeUninit::uninit().assume_init() };
// Avoid optimizing everything out.
black_box(r)
}

#[start]
fn main(_: isize, _: *const *const u8) -> isize {
random();
0
}
6 changes: 3 additions & 3 deletions src/test/ui/sanitize/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ use std::mem::MaybeUninit;
#[inline(never)]
#[no_mangle]
fn random() -> [isize; 32] {
let r = unsafe { MaybeUninit::uninit().assume_init() };
let r = MaybeUninit::uninit();
// Avoid optimizing everything out.
black_box(r)
unsafe { std::intrinsics::volatile_load(r.as_ptr()) }
}

#[inline(never)]
Expand All @@ -38,6 +38,6 @@ fn xor(a: &[isize]) -> isize {

#[start]
fn main(_: isize, _: *const *const u8) -> isize {
let r = random();
let r = black_box(random as fn() -> [isize; 32])();
xor(&r)
}

0 comments on commit 66dcf5d

Please sign in to comment.