diff --git a/src/machine.rs b/src/machine.rs index f794453228b8..ab4fe4a2178d 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -6,6 +6,7 @@ use std::cell::RefCell; use std::num::NonZeroU64; use std::rc::Rc; use std::time::Instant; +use std::fmt; use log::trace; use rand::rngs::StdRng; @@ -62,6 +63,31 @@ impl Into> for MiriMemoryKind { } } +impl MayLeak for MiriMemoryKind { + #[inline(always)] + fn may_leak(self) -> bool { + use self::MiriMemoryKind::*; + match self { + Rust | C | WinHeap | Env => false, + Machine | Global => true, + } + } +} + +impl fmt::Display for MiriMemoryKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use self::MiriMemoryKind::*; + match self { + Rust => write!(f, "Rust heap"), + C => write!(f, "C heap"), + WinHeap => write!(f, "Windows heap"), + Machine => write!(f, "machine-managed memory"), + Env => write!(f, "environment variable"), + Global => write!(f, "global"), + } + } +} + /// Extra per-allocation data #[derive(Debug, Clone)] pub struct AllocExtra { @@ -491,14 +517,3 @@ impl AllocationExtra for AllocExtra { } } } - -impl MayLeak for MiriMemoryKind { - #[inline(always)] - fn may_leak(self) -> bool { - use self::MiriMemoryKind::*; - match self { - Rust | C | WinHeap | Env => false, - Machine | Global => true, - } - } -} diff --git a/tests/run-pass/leak-in-static.rs b/tests/run-pass/leak-in-static.rs new file mode 100644 index 000000000000..b12cbbf6e64f --- /dev/null +++ b/tests/run-pass/leak-in-static.rs @@ -0,0 +1,8 @@ +static mut LEAKER: Option>> = None; + +fn main() { + // Having memory "leaked" in globals is allowed. + unsafe { + LEAKER = Some(Box::new(vec![0; 42])); + } +} diff --git a/tests/run-pass/panic/catch_panic.rs b/tests/run-pass/panic/catch_panic.rs index 6408c940d98a..7689b85f7650 100644 --- a/tests/run-pass/panic/catch_panic.rs +++ b/tests/run-pass/panic/catch_panic.rs @@ -77,9 +77,6 @@ fn main() { test(None, |_old_val| { debug_assert!(false); loop {} }); test(None, |_old_val| { unsafe { (1 as *const i32).read() }; loop {} }); // trigger debug-assertion in libstd - // Cleanup: reset to default hook. - drop(std::panic::take_hook()); - eprintln!("Success!"); // Make sure we get this in stderr }