]> Repositorios git - scryer-prolog.git/commitdiff
if UB un IndexPtr ArenaAllocated impl
authorBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 15:43:13 +0000 (17:43 +0200)
committerBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 15:43:13 +0000 (17:43 +0200)
src/arena.rs

index 58f321f0b479f1bf25c3112db960a154648b77ea..fb42ac17f033624b206be0cbebe4a81d436d3804 100644 (file)
@@ -614,15 +614,17 @@ impl ArenaAllocated for IndexPtr {
 
     #[inline]
     fn alloc(arena: &mut Arena, value: Self) -> TypedArenaPtr<Self> {
-        let mut slab = Box::new(AllocSlab {
+        let slab = Box::new(AllocSlab {
             next: arena.base.take(),
             #[cfg(target_pointer_width = "32")]
             _padding: 0,
             header: HeaderOrIdxPtr { idx_ptr: value },
         });
 
-        let allocated_ptr = unsafe { TypedArenaPtr::new(ptr::addr_of_mut!(slab.header.idx_ptr)) };
-        arena.base = Some(NonNull::new(Box::into_raw(slab)).unwrap());
+        let raw_box = Box::into_raw(slab);
+        let allocated_ptr =
+            unsafe { TypedArenaPtr::new(ptr::addr_of_mut!((*raw_box).header.idx_ptr)) };
+        arena.base = Some(NonNull::new(raw_box).unwrap());
         allocated_ptr
     }
 }