summaryrefslogtreecommitdiffstats
path: root/library/alloc/tests/heap.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/alloc/tests/heap.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/library/alloc/tests/heap.rs b/library/alloc/tests/heap.rs
new file mode 100644
index 000000000..246b341ee
--- /dev/null
+++ b/library/alloc/tests/heap.rs
@@ -0,0 +1,44 @@
+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(),
+ )
+ }
+ }
+ }
+ }
+}