From a8430a4ee5cc3863f2cb160822f5ae0eb4c7ed53 Mon Sep 17 00:00:00 2001 From: Ralf Jung <post@ralfj.de> Date: Sat, 23 Nov 2019 09:12:17 +0100 Subject: [PATCH 1/2] Miri: print leak report even without tracing --- src/librustc_mir/interpret/eval_context.rs | 4 +++- src/librustc_mir/interpret/memory.rs | 23 +++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 08640476f7ab7..b5bd96db1f430 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -703,7 +703,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if let LocalValue::Live(Operand::Indirect(MemPlace { ptr, .. })) = local { trace!("deallocating local"); let ptr = ptr.to_ptr()?; - self.memory.dump_alloc(ptr.alloc_id); + if log_enabled!(::log::Level::Trace) { + self.memory.dump_alloc(ptr.alloc_id); + } self.memory.deallocate_local(ptr)?; }; Ok(()) diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 842ef915ad226..dc8b035f43afd 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -635,7 +635,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Ok(()) } - /// For debugging, print an allocation and all allocations it points to, recursively. + /// Print an allocation and all allocations it points to, recursively. + /// This prints directly to stderr, ignoring RUSTC_LOG! It is up to the caller to + /// control for this. pub fn dump_alloc(&self, id: AllocId) { self.dump_allocs(vec![id]); } @@ -674,7 +676,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } } - trace!( + eprintln!( "{}({} bytes, alignment {}){}", msg, alloc.size.bytes(), @@ -695,15 +697,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { write!(msg, "└{0:─^1$}┘ ", target, relocation_width as usize).unwrap(); pos = i + self.pointer_size(); } - trace!("{}", msg); + eprintln!("{}", msg); } } - /// For debugging, print a list of allocations and all allocations they point to, recursively. + /// Print a list of allocations and all allocations they point to, recursively. + /// This prints directly to stderr, ignoring RUSTC_LOG! It is up to the caller to + /// control for this. pub fn dump_allocs(&self, mut allocs: Vec<AllocId>) { - if !log_enabled!(::log::Level::Trace) { - return; - } allocs.sort(); allocs.dedup(); let mut allocs_to_print = VecDeque::from(allocs); @@ -735,13 +736,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { ); } Some(GlobalAlloc::Function(func)) => { - trace!("{} {}", msg, func); + eprintln!("{} {}", msg, func); } Some(GlobalAlloc::Static(did)) => { - trace!("{} {:?}", msg, did); + eprintln!("{} {:?}", msg, did); } None => { - trace!("{} (deallocated)", msg); + eprintln!("{} (deallocated)", msg); } } }, @@ -751,7 +752,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } pub fn leak_report(&self) -> usize { - trace!("### LEAK REPORT ###"); + eprintln!("### LEAK REPORT ###"); let leaks: Vec<_> = self.alloc_map.filter_map_collect(|&id, &(kind, _)| { if kind.may_leak() { None } else { Some(id) } }); From 9233a54176441b9d63b3da33814794adb8bf0e5d Mon Sep 17 00:00:00 2001 From: Ralf Jung <post@ralfj.de> Date: Sat, 23 Nov 2019 09:24:47 +0100 Subject: [PATCH 2/2] only print LEAK REPORT if there is a leak --- src/librustc_mir/interpret/memory.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index dc8b035f43afd..eccdc5b03261b 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -752,12 +752,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } pub fn leak_report(&self) -> usize { - eprintln!("### LEAK REPORT ###"); let leaks: Vec<_> = self.alloc_map.filter_map_collect(|&id, &(kind, _)| { if kind.may_leak() { None } else { Some(id) } }); let n = leaks.len(); - self.dump_allocs(leaks); + if n > 0 { + eprintln!("### LEAK REPORT ###"); + self.dump_allocs(leaks); + } n }