fix handling of alignment for dyn-sized places
This commit is contained in:
parent
124fb1490a
commit
e7c6db7d44
3 changed files with 12 additions and 9 deletions
|
@ -328,7 +328,8 @@ where
|
|||
};
|
||||
|
||||
let mplace = MemPlace { ptr: ptr.to_pointer(self)?, meta };
|
||||
// When deref'ing a pointer, the *static* alignment given by the type is what matters.
|
||||
// `ref_to_mplace` is called on raw pointers even if they don't actually get dereferenced;
|
||||
// we hence can't call `size_and_align_of` since that asserts more validity than we want.
|
||||
let align = layout.align.abi;
|
||||
Ok(MPlaceTy { mplace, layout, align })
|
||||
}
|
||||
|
@ -379,11 +380,12 @@ where
|
|||
|
||||
/// Check if this mplace is dereferenceable and sufficiently aligned.
|
||||
pub fn check_mplace(&self, mplace: MPlaceTy<'tcx, M::Provenance>) -> InterpResult<'tcx> {
|
||||
let (size, align) = self
|
||||
let (size, _align) = self
|
||||
.size_and_align_of_mplace(&mplace)?
|
||||
.unwrap_or((mplace.layout.size, mplace.layout.align.abi));
|
||||
assert!(mplace.align <= align, "dynamic alignment less strict than static one?");
|
||||
let align = if M::enforce_alignment(self).should_check() { align } else { Align::ONE };
|
||||
// Due to packed places, only `mplace.align` matters.
|
||||
let align =
|
||||
if M::enforce_alignment(self).should_check() { mplace.align } else { Align::ONE };
|
||||
self.check_ptr_access_align(mplace.ptr, size, align, CheckInAllocMsg::DerefTest)?;
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue