45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use std::alloc::{Allocator, Global, Layout, System};
|
|
|
|
/// Issue #45955 and #62251.
|
|
#[test]
|
|
fn alloc_system_overaligned_request() {
|
|
check_overalign_requests(System)
|
|
}
|
|
|
|
#[test]
|
|
fn std_heap_overaligned_request() {
|
|
check_overalign_requests(Global)
|
|
}
|
|
|
|
fn check_overalign_requests<T: Allocator>(allocator: T) {
|
|
for &align in &[4, 8, 16, 32] {
|
|
// less than and bigger than `MIN_ALIGN`
|
|
for &size in &[align / 2, align - 1] {
|
|
// size less than alignment
|
|
let iterations = 128;
|
|
unsafe {
|
|
let pointers: Vec<_> = (0..iterations)
|
|
.map(|_| {
|
|
allocator.allocate(Layout::from_size_align(size, align).unwrap()).unwrap()
|
|
})
|
|
.collect();
|
|
for &ptr in &pointers {
|
|
assert_eq!(
|
|
(ptr.as_non_null_ptr().as_ptr() as usize) % align,
|
|
0,
|
|
"Got a pointer less aligned than requested"
|
|
)
|
|
}
|
|
|
|
// Clean up
|
|
for &ptr in &pointers {
|
|
allocator.deallocate(
|
|
ptr.as_non_null_ptr(),
|
|
Layout::from_size_align(size, align).unwrap(),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|