mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-26 14:43:24 +00:00
when writing uninit to an allocation, also clear relocations like other writes do
This commit is contained in:
parent
ad4e98ed7d
commit
85ee04c44a
@ -892,8 +892,11 @@ impl<'tcx, 'a, Tag: Provenance, Extra> AllocRefMut<'a, 'tcx, Tag, Extra> {
|
||||
}
|
||||
|
||||
/// Mark the entire referenced range as uninitalized
|
||||
pub fn write_uninit(&mut self) {
|
||||
self.alloc.mark_init(self.range, false);
|
||||
pub fn write_uninit(&mut self) -> InterpResult<'tcx> {
|
||||
Ok(self
|
||||
.alloc
|
||||
.write_uninit(&self.tcx, self.range)
|
||||
.map_err(|e| e.to_interp_error(self.alloc_id))?)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1053,8 +1056,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
// This also avoids writing to the target bytes so that the backing allocation is never
|
||||
// touched if the bytes stay uninitialized for the whole interpreter execution. On contemporary
|
||||
// operating system this can avoid physically allocating the page.
|
||||
dest_alloc.mark_init(dest_range, false); // `Size` multiplication
|
||||
dest_alloc.mark_relocation_range(relocations);
|
||||
dest_alloc
|
||||
.write_uninit(&tcx, dest_range)
|
||||
.map_err(|e| e.to_interp_error(dest_alloc_id))?; // `Size` multiplication
|
||||
// We can forget about the relocations, this is all not initialized anyway.
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
@ -823,7 +823,7 @@ where
|
||||
// Zero-sized access
|
||||
return Ok(());
|
||||
};
|
||||
alloc.write_uninit();
|
||||
alloc.write_uninit()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -429,8 +429,7 @@ impl<Tag: Provenance, Extra> Allocation<Tag, Extra> {
|
||||
let val = match val {
|
||||
ScalarMaybeUninit::Scalar(scalar) => scalar,
|
||||
ScalarMaybeUninit::Uninit => {
|
||||
self.mark_init(range, false);
|
||||
return Ok(());
|
||||
return self.write_uninit(cx, range);
|
||||
}
|
||||
};
|
||||
|
||||
@ -455,6 +454,13 @@ impl<Tag: Provenance, Extra> Allocation<Tag, Extra> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Write "uninit" to the given memory range.
|
||||
pub fn write_uninit(&mut self, cx: &impl HasDataLayout, range: AllocRange) -> AllocResult {
|
||||
self.mark_init(range, false);
|
||||
self.clear_relocations(cx, range)?;
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
/// Relocations.
|
||||
@ -1056,7 +1062,7 @@ impl<Tag: Copy, Extra> Allocation<Tag, Extra> {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn mark_init(&mut self, range: AllocRange, is_init: bool) {
|
||||
fn mark_init(&mut self, range: AllocRange, is_init: bool) {
|
||||
if range.size.bytes() == 0 {
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user