Skip to content

Commit 0812eeb

Browse files
committed
Add support for tracking origins of uninitialized memory
1 parent 9b90703 commit 0812eeb

File tree

4 files changed

+53
-2
lines changed

4 files changed

+53
-2
lines changed

src/librustc/session/config.rs

+19
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,7 @@ macro_rules! options {
834834
Some("one of: `address`, `leak`, `memory` or `thread`");
835835
pub const parse_sanitizer_list: Option<&str> =
836836
Some("comma separated list of sanitizers");
837+
pub const parse_sanitizer_memory_track_origins: Option<&str> = None;
837838
pub const parse_linker_flavor: Option<&str> =
838839
Some(::rustc_target::spec::LinkerFlavor::one_of());
839840
pub const parse_optimization_fuel: Option<&str> =
@@ -1054,6 +1055,22 @@ macro_rules! options {
10541055
}
10551056
}
10561057

1058+
fn parse_sanitizer_memory_track_origins(slot: &mut usize, v: Option<&str>) -> bool {
1059+
match v.map(|s| s.parse()) {
1060+
None => {
1061+
*slot = 2;
1062+
true
1063+
}
1064+
Some(Ok(i)) if i <= 2 => {
1065+
*slot = i;
1066+
true
1067+
}
1068+
_ => {
1069+
false
1070+
}
1071+
}
1072+
}
1073+
10571074
fn parse_linker_flavor(slote: &mut Option<LinkerFlavor>, v: Option<&str>) -> bool {
10581075
match v.and_then(LinkerFlavor::from_str) {
10591076
Some(lf) => *slote = Some(lf),
@@ -1411,6 +1428,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
14111428
"use a sanitizer"),
14121429
sanitizer_recover: Vec<Sanitizer> = (vec![], parse_sanitizer_list, [TRACKED],
14131430
"Enable recovery for selected sanitizers"),
1431+
sanitizer_memory_track_origins: usize = (0, parse_sanitizer_memory_track_origins, [TRACKED],
1432+
"Enable origins tracking in MemorySanitizer"),
14141433
fuel: Option<(String, u64)> = (None, parse_optimization_fuel, [TRACKED],
14151434
"set the optimization fuel quota for a crate"),
14161435
print_fuel: Option<String> = (None, parse_opt_string, [TRACKED],

src/librustc_codegen_llvm/back/write.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use std::path::{Path, PathBuf};
2929
use std::str;
3030
use std::sync::Arc;
3131
use std::slice;
32-
use libc::{c_uint, c_void, c_char, size_t};
32+
use libc::{c_int, c_uint, c_void, c_char, size_t};
3333

3434
pub const RELOC_MODEL_ARGS : [(&str, llvm::RelocMode); 7] = [
3535
("pic", llvm::RelocMode::PIC),
@@ -373,7 +373,7 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext<LlvmCodegenBackend>,
373373
recover));
374374
}
375375
Sanitizer::Memory => {
376-
let track_origins = 0;
376+
let track_origins = config.sanitizer_memory_track_origins as c_int;
377377
extra_passes.push(llvm::LLVMRustCreateMemorySanitizerPass(
378378
track_origins, recover));
379379
}

src/librustc_codegen_ssa/back/write.rs

+4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub struct ModuleConfig {
6161

6262
pub sanitizer: Option<Sanitizer>,
6363
pub sanitizer_recover: Vec<Sanitizer>,
64+
pub sanitizer_memory_track_origins: usize,
6465

6566
// Flags indicating which outputs to produce.
6667
pub emit_pre_lto_bc: bool,
@@ -102,6 +103,7 @@ impl ModuleConfig {
102103

103104
sanitizer: None,
104105
sanitizer_recover: Default::default(),
106+
sanitizer_memory_track_origins: 0,
105107

106108
emit_no_opt_bc: false,
107109
emit_pre_lto_bc: false,
@@ -359,6 +361,8 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
359361
modules_config.pgo_use = sess.opts.cg.profile_use.clone();
360362
modules_config.sanitizer = sess.opts.debugging_opts.sanitizer.clone();
361363
modules_config.sanitizer_recover = sess.opts.debugging_opts.sanitizer_recover.clone();
364+
modules_config.sanitizer_memory_track_origins =
365+
sess.opts.debugging_opts.sanitizer_memory_track_origins;
362366
modules_config.opt_level = Some(sess.opts.optimize);
363367
modules_config.opt_size = Some(sess.opts.optimize);
364368

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Verifies that MemorySanitizer track-origins level can be controlled
2+
// with -Zsanitizer-memory-track-origins option.
3+
//
4+
// needs-sanitizer-support
5+
// only-linux
6+
// only-x86_64
7+
// revisions:MSAN-0 MSAN-1 MSAN-2
8+
//
9+
//[MSAN-0] compile-flags: -Zsanitizer=memory
10+
//[MSAN-1] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins=1
11+
//[MSAN-2] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins
12+
13+
#![crate_type="lib"]
14+
15+
// MSAN-0-NOT: @__msan_track_origins
16+
// MSAN-1: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 1
17+
// MSAN-2: @__msan_track_origins = weak_odr local_unnamed_addr constant i32 2
18+
//
19+
// MSAN-0-LABEL: define void @copy(
20+
// MSAN-1-LABEL: define void @copy(
21+
// MSAN-2-LABEL: define void @copy(
22+
#[no_mangle]
23+
pub fn copy(dst: &mut i32, src: &i32) {
24+
// MSAN-0-NOT: call i32 @__msan_chain_origin(
25+
// MSAN-1-NOT: call i32 @__msan_chain_origin(
26+
// MSAN-2: call i32 @__msan_chain_origin(
27+
*dst = *src;
28+
}

0 commit comments

Comments
 (0)