From 54bbbbaa6d755a97017802e67403512845f69590 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Tue, 21 Dec 2021 11:36:16 +0100 Subject: [PATCH] =?UTF-8?q?alignment=20=F0=9F=98=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 23 +++++++++++++++-------- src/test.rs | 1 - 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 44d9004..7c2f041 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -117,26 +117,33 @@ impl Vechonk { pub fn push(&mut self, element: Box) { let elem_size = mem::size_of_val(element.as_ref()); + let elem_align = mem::align_of_val(&element); let elem_ptr = Box::into_raw(element); let meta = ptr::metadata(elem_ptr); let data_size = mem::size_of::>(); + let elem_offset = self.elem_size; + + // SAFETY: `self.elem_size` can't be longer than the allocation, because `PtrData` needs space as well + let required_align_offset = + unsafe { self.ptr.as_ptr().add(elem_offset).align_offset(elem_align) }; // just panic here instead of a proper realloc - if self.needs_grow(elem_size + data_size) { + if self.needs_grow(elem_size + data_size + required_align_offset) { self.regrow(self.cap + elem_size + data_size); } - let elem_offset = self.elem_size; - - let data = PtrData { - offset: elem_offset, - meta, - }; - // Copy the element to the new location + // Calculate the dest pointer again because we might have realloced // SAFETY: `self.elem_size` can't be longer than the allocation, because `PtrData` needs space as well let dest_ptr = unsafe { self.ptr.as_ptr().add(elem_offset) }; + let dest_align_offset = dest_ptr.align_offset(elem_align); + let dest_ptr = unsafe { dest_ptr.add(dest_align_offset) }; + + let data = PtrData { + offset: elem_offset + dest_align_offset, + meta, + }; // SAFETY: `elem_ptr` comes from `Box`, and is therefore valid to read from for the size // We have made sure above that we have more than `elem_size` bytes free diff --git a/src/test.rs b/src/test.rs index 6c39796..b046611 100644 --- a/src/test.rs +++ b/src/test.rs @@ -125,7 +125,6 @@ fn grow_from_alloc() { } #[test] -#[ignore] // alignment... fn push_alignment() { use core::any::Any;