Skip to content

Commit

Permalink
Fix MIRI with updated MaybeUninit move semantics
Browse files Browse the repository at this point in the history
  • Loading branch information
djkoloski committed Sep 11, 2024
1 parent b9706b4 commit e8fb001
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
14 changes: 12 additions & 2 deletions rkyv/src/collections/btree_map/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,12 @@ impl<K, V, const E: usize> ArchivedBTreeMap<K, V, E> {
}

let pos = serializer.align_for::<LeafNode<K, V, E>>()?;
let mut node = MaybeUninit::<LeafNode<K, V, E>>::zeroed();
let mut node = MaybeUninit::<LeafNode<K, V, E>>::uninit();
// SAFETY: `node` is properly aligned and valid for writes of
// `size_of::<LeafNode<K, V, E>>()` bytes.
unsafe {
node.as_mut_ptr().write_bytes(0, 1);
}

let node_place =
unsafe { Place::new_unchecked(pos, node.as_mut_ptr()) };
Expand Down Expand Up @@ -561,7 +566,12 @@ impl<K, V, const E: usize> ArchivedBTreeMap<K, V, E> {
}

let pos = serializer.align_for::<InnerNode<K, V, E>>()?;
let mut node = MaybeUninit::<InnerNode<K, V, E>>::zeroed();
let mut node = MaybeUninit::<InnerNode<K, V, E>>::uninit();
// SAFETY: `node` is properly aligned and valid for writes of
// `size_of::<InnerNode<K, V, E>>()` bytes.
unsafe {
node.as_mut_ptr().write_bytes(0, 1);
}

let node_place =
unsafe { Place::new_unchecked(pos, node.as_mut_ptr()) };
Expand Down
14 changes: 12 additions & 2 deletions rkyv/src/ser/writer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,12 @@ pub trait WriterExt<E>: Writer<E> {
let pos = self.pos();
debug_assert_eq!(pos & (mem::align_of::<T::Archived>() - 1), 0);

let mut resolved = mem::MaybeUninit::<T::Archived>::zeroed();
let mut resolved = mem::MaybeUninit::<T::Archived>::uninit();
// SAFETY: `resolved` is properly aligned and valid for writes of
// `size_of::<T::Archived>()` bytes.
unsafe {
resolved.as_mut_ptr().write_bytes(0, 1);
}
// SAFETY: `resolved.as_mut_ptr()` points to a local zeroed
// `MaybeUninit`, and so is properly aligned, dereferenceable, and all
// of its bytes are initialized.
Expand Down Expand Up @@ -150,7 +155,12 @@ pub trait WriterExt<E>: Writer<E> {
0
);

let mut resolved = mem::MaybeUninit::<RelPtr<T::Archived>>::zeroed();
let mut resolved = mem::MaybeUninit::<RelPtr<T::Archived>>::uninit();
// SAFETY: `resolved` is properly aligned and valid for writes of
// `size_of::<RelPtr<T::Archived>>()` bytes.
unsafe {
resolved.as_mut_ptr().write_bytes(0, 1);
}
// SAFETY: `resolved.as_mut_ptr()` points to a local zeroed
// `MaybeUninit`, and so is properly aligned, dereferenceable, and all
// of its bytes are initialized.
Expand Down

0 comments on commit e8fb001

Please sign in to comment.