| #![feature(allocator_api, slice_ptr_get)] | |
| use std::alloc::{Allocator as _, Global, GlobalAlloc, Layout, System}; | |
| #[global_allocator] | |
| static ALLOCATOR: Allocator = Allocator; | |
| struct Allocator; | |
| const SIZE: usize = 16 * 7; | |
| unsafe impl GlobalAlloc for Allocator { | |
| unsafe fn alloc(&self, layout: Layout) -> *mut u8 { | |
| // use specific size to avoid getting triggered by rt | |
| if layout.size() == SIZE { | |
| println!("Allocated!") | |
| } | |
| System.alloc(layout) | |
| } | |
| unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { | |
| if layout.size() == SIZE { | |
| println!("Deallocated!") | |
| } | |
| System.dealloc(ptr, layout) | |
| } | |
| } | |
| fn main() { | |
| // Below we mix using `Global` and `System`. This is undefined behavior that Miri should | |
| // detect, but currently it does not. <https://github.com/rust-lang/miri/issues/2686> | |
| let l = Layout::from_size_align(SIZE, 1).unwrap(); | |
| let ptr = Global.allocate(l).unwrap().as_non_null_ptr(); // allocating with Global... | |
| unsafe { | |
| System.deallocate(ptr, l); | |
| } // ... and deallocating with System. | |
| let l = Layout::from_size_align(SIZE, 16).unwrap(); | |
| let ptr = System.allocate(l).unwrap().as_non_null_ptr(); // allocating with System... | |
| unsafe { | |
| Global.deallocate(ptr, l); | |
| } // ... and deallocating with Global. | |
| } |