Skip to content

Commit 770c234

Browse files
committed
Auto merge of rust-lang#3797 - zachs18:no-borrow-no-panic, r=RalfJung
Don't panic on `miri_print_borrow_state()` under `-Zmiri-disable-stacked-borrows`. Fixes rust-lang#3459 Instead, just print "attempted to print borrow state, but no borrow state is being tracked" directly to ~~stdout~~ stderr and return successfully. Alternately, the diagnostic machinery could be used to print a structured error/warning. (Does not address the comment about nothing being printed for `miri_print_borrow_state` with `alloc_id = 0`)
2 parents ad8aa16 + aee5e91 commit 770c234

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

src/tools/miri/src/borrow_tracker/mod.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,11 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
346346

347347
fn print_borrow_state(&mut self, alloc_id: AllocId, show_unnamed: bool) -> InterpResult<'tcx> {
348348
let this = self.eval_context_mut();
349-
let method = this.machine.borrow_tracker.as_ref().unwrap().borrow().borrow_tracker_method;
349+
let Some(borrow_tracker) = &this.machine.borrow_tracker else {
350+
eprintln!("attempted to print borrow state, but no borrow state is being tracked");
351+
return Ok(());
352+
};
353+
let method = borrow_tracker.borrow().borrow_tracker_method;
350354
match method {
351355
BorrowTrackerMethod::StackedBorrows => this.print_stacks(alloc_id),
352356
BorrowTrackerMethod::TreeBorrows => this.print_tree(alloc_id, show_unnamed),

src/tools/miri/src/shims/foreign_items.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,12 @@ trait EvalContextExtPriv<'tcx>: crate::MiriInterpCxExt<'tcx> {
289289
let [id, show_unnamed] = this.check_shim(abi, Abi::Rust, link_name, args)?;
290290
let id = this.read_scalar(id)?.to_u64()?;
291291
let show_unnamed = this.read_scalar(show_unnamed)?.to_bool()?;
292-
if let Some(id) = std::num::NonZero::new(id) {
293-
this.print_borrow_state(AllocId(id), show_unnamed)?;
292+
if let Some(id) = std::num::NonZero::new(id).map(AllocId)
293+
&& this.get_alloc_info(id).2 == AllocKind::LiveData
294+
{
295+
this.print_borrow_state(id, show_unnamed)?;
296+
} else {
297+
eprintln!("{id} is not the ID of a live data allocation");
294298
}
295299
}
296300
"miri_pointer_name" => {

0 commit comments

Comments
 (0)