diff options
| author | bors <bors@rust-lang.org> | 2024-03-14 07:28:07 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-14 07:28:07 +0000 |
| commit | cb580ff677ea869878a4aadfe07cf570752bd4ce (patch) | |
| tree | a3de487527d82f37e7d203a6f18eec535f78336f /src/tools | |
| parent | 6f3eb1ce3d50246b2cbc5de3107c0f34889f5cc6 (diff) | |
| parent | c3342b41b52aa4f8a4497a696ee783952fca36da (diff) | |
| download | rust-cb580ff677ea869878a4aadfe07cf570752bd4ce.tar.gz rust-cb580ff677ea869878a4aadfe07cf570752bd4ce.zip | |
Auto merge of #122243 - RalfJung:local-place-sanity-check, r=oli-obk
interpret: ensure that Place is never used for a different frame We store the address where the stack frame stores its `locals`. The idea is that even if we pop and push, or switch to a different thread with a larger number of frames, then the `locals` address will most likely change so we'll notice that problem. This is made possible by some recent changes by `@WaffleLapkin,` where we no longer use `Place` across things that change the number of stack frames. I made these debug assertions for now, just to make sure this can't cost us any perf. The first commit is unrelated but it's a one-line comment change so it didn't warrant a separate PR... r? `@oli-obk`
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/miri/src/helpers.rs | 2 | ||||
| -rw-r--r-- | src/tools/miri/src/machine.rs | 3 |
2 files changed, 2 insertions, 3 deletions
diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs index 76f4b77c8f8..c12fe0e086d 100644 --- a/src/tools/miri/src/helpers.rs +++ b/src/tools/miri/src/helpers.rs @@ -413,7 +413,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { .ok_or_else(|| err_ub_format!("callee has fewer arguments than expected"))?; // Make the local live, and insert the initial value. this.storage_live(local)?; - let callee_arg = this.local_to_place(this.frame_idx(), local)?; + let callee_arg = this.local_to_place(local)?; this.write_immediate(*arg, &callee_arg)?; } if callee_args.next().is_some() { diff --git a/src/tools/miri/src/machine.rs b/src/tools/miri/src/machine.rs index 4dbb814fc27..7e5518392d8 100644 --- a/src/tools/miri/src/machine.rs +++ b/src/tools/miri/src/machine.rs @@ -1488,14 +1488,13 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for MiriMachine<'mir, 'tcx> { fn after_local_allocated( ecx: &mut InterpCx<'mir, 'tcx, Self>, - frame: usize, local: mir::Local, mplace: &MPlaceTy<'tcx, Provenance>, ) -> InterpResult<'tcx> { let Some(Provenance::Concrete { alloc_id, .. }) = mplace.ptr().provenance else { panic!("after_local_allocated should only be called on fresh allocations"); }; - let local_decl = &ecx.active_thread_stack()[frame].body.local_decls[local]; + let local_decl = &ecx.frame().body.local_decls[local]; let span = local_decl.source_info.span; ecx.machine.allocation_spans.borrow_mut().insert(alloc_id, (span, None)); Ok(()) |
