467 lines
13 KiB
Rust
Executable File
467 lines
13 KiB
Rust
Executable File
#![allow(unused_imports)]
|
|
#![allow(dead_code)]
|
|
//#![feature(trace_macros)]
|
|
|
|
#[cfg(test)]
|
|
|
|
#[macro_use]
|
|
extern crate alloc_no_stdlib;
|
|
extern crate alloc_stdlib;
|
|
|
|
extern crate core;
|
|
use core::ops;
|
|
use alloc_no_stdlib::{Allocator, SliceWrapperMut, SliceWrapper,
|
|
StackAllocator, AllocatedStackMemory, uninitialized, bzero};
|
|
|
|
use alloc_stdlib::{HeapPrealloc, HeapAlloc};
|
|
#[cfg(feature="unsafe")]
|
|
use alloc_stdlib::{HeapAllocUninitialized};
|
|
|
|
declare_stack_allocator_struct!(CallocAllocatedFreelist4096, 4096, calloc);
|
|
declare_stack_allocator_struct!(StackAllocatedFreelist4, 4, stack);
|
|
declare_stack_allocator_struct!(StackAllocatedFreelist8, 8, stack);
|
|
declare_stack_allocator_struct!(GlobalAllocatedFreelist, 16, global);
|
|
//trace_macros!(true);
|
|
|
|
define_allocator_memory_pool!(16, u8, [0; 1024 * 1024 * 100], global, global_buffer);
|
|
define_allocator_memory_pool!(16, u8, [0; 1024 * 1024 * 100], global, global_buffer2);
|
|
extern {
|
|
fn calloc(n_elem : usize, el_size : usize) -> *mut u8;
|
|
fn malloc(len : usize) -> *mut u8;
|
|
fn free(item : *mut u8);
|
|
}
|
|
#[test]
|
|
fn uninitialized_stack_pool_test() {
|
|
{
|
|
let mut stack_global_buffer = define_allocator_memory_pool!(4, u8, [0; 65536], stack);
|
|
let mut ags = StackAllocatedFreelist4::<u8>::new_allocator(&mut stack_global_buffer, uninitialized);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 6);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
#[test]
|
|
fn uninitialized_stack_pool_free_null() {
|
|
let mut stack_global_buffer = define_allocator_memory_pool!(8, u8, [0; 256 - 8], stack);
|
|
let mut ags = StackAllocatedFreelist8::<u8>::new_allocator(&mut stack_global_buffer, uninitialized);
|
|
{
|
|
let s = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let t = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let u = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let v = ags.alloc_cell(0);
|
|
//v.slice_mut()[0] = 4;
|
|
let ss = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let tt = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let uu = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let vv = ags.alloc_cell(0);
|
|
//v.slice_mut()[0] = 4;
|
|
let mut w = ags.alloc_cell(31);
|
|
w.slice_mut()[30] = 4;
|
|
let mut x = ags.alloc_cell(31);
|
|
x.slice_mut()[30] = 4;
|
|
let mut y = ags.alloc_cell(31);
|
|
y.slice_mut()[30] = 4;
|
|
let mut z = ags.alloc_cell(31);
|
|
z.slice_mut()[30] = 4;
|
|
let mut zz = ags.alloc_cell(31);
|
|
zz.slice_mut()[30] = 4;
|
|
let mut xx = ags.alloc_cell(31);
|
|
xx.slice_mut()[30] = 4;
|
|
let mut yy = ags.alloc_cell(31);
|
|
yy.slice_mut()[30] = 4;
|
|
let mut ww = ags.alloc_cell(31);
|
|
ww.slice_mut()[30] = 4;
|
|
ags.free_cell(y);
|
|
ags.free_cell(x);
|
|
ags.free_cell(z);
|
|
ags.free_cell(zz);
|
|
ags.free_cell(xx);
|
|
ags.free_cell(yy);
|
|
ags.free_cell(ww);
|
|
ags.free_cell(v);
|
|
ags.free_cell(u);
|
|
ags.free_cell(s);
|
|
ags.free_cell(t);
|
|
ags.free_cell(w);
|
|
ags.free_cell(vv);
|
|
ags.free_cell(uu);
|
|
ags.free_cell(ss);
|
|
ags.free_cell(tt);
|
|
let mut a = ags.alloc_cell(31);
|
|
a.slice_mut()[30] = 4;
|
|
let mut b = ags.alloc_cell(31);
|
|
b.slice_mut()[30] = 4;
|
|
let mut c = ags.alloc_cell(31);
|
|
c.slice_mut()[30] = 4;
|
|
let mut d = ags.alloc_cell(31);
|
|
d.slice_mut()[30] = 4;
|
|
let mut e = ags.alloc_cell(31);
|
|
e.slice_mut()[30] = 4;
|
|
let mut f = ags.alloc_cell(31);
|
|
f.slice_mut()[30] = 4;
|
|
let mut g = ags.alloc_cell(31);
|
|
g.slice_mut()[30] = 4;
|
|
let mut h = ags.alloc_cell(31);
|
|
h.slice_mut()[30] = 4;
|
|
|
|
}
|
|
|
|
}
|
|
#[test]
|
|
#[cfg(all(feature="unsafe",not(feature="no-stdlib")))]
|
|
fn uninitialized_heap_pool_test() {
|
|
{
|
|
let mut heap_global_buffer = unsafe{HeapPrealloc::<u8>::new_uninitialized_memory_pool(6 * 1024 * 1024)};
|
|
let mut ags = HeapPrealloc::<u8>::new_allocator(4096, &mut heap_global_buffer, uninitialized);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 6);
|
|
assert_eq!(z[1], 8);
|
|
// assert_eq!(reget_three[0], 0); // not valid: uninitialized heap memory
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
#[test]
|
|
fn uninitialized_calloc_pool_test() {
|
|
|
|
{
|
|
let mut calloc_global_buffer = unsafe{define_allocator_memory_pool!(4096, u8, [0; 200 * 1024 * 1024], calloc)};
|
|
let mut ags = CallocAllocatedFreelist4096::<u8>::new_allocator(&mut calloc_global_buffer.data, uninitialized);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 6);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0); // since we have control over this buffer and the free strategy: this should be zero
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
println!("{:?}", ags.free_list_start);
|
|
}
|
|
}
|
|
#[test]
|
|
fn uninitialized_global_pool_test() {
|
|
{
|
|
let mut ags = GlobalAllocatedFreelist::<u8>::new_allocator(uninitialized);
|
|
unsafe {
|
|
bind_global_buffers_to_allocator!(ags, global_buffer, u8);
|
|
}
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 6);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn stack_pool_test() {
|
|
{
|
|
let mut stack_global_buffer = define_allocator_memory_pool!(4, u8, [0; 65536], stack);
|
|
let mut ags = StackAllocatedFreelist4::<u8>::new_allocator(&mut stack_global_buffer, bzero);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 0);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
#[test]
|
|
fn stack_pool_free_null() {
|
|
let mut stack_global_buffer = define_allocator_memory_pool!(8, u8, [0; 256 - 8], stack);
|
|
let mut ags = StackAllocatedFreelist8::<u8>::new_allocator(&mut stack_global_buffer, bzero);
|
|
{
|
|
let s = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let t = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let u = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let v = ags.alloc_cell(0);
|
|
//v.slice_mut()[0] = 4;
|
|
let ss = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let tt = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let uu = ags.alloc_cell(0);
|
|
//u.slice_mut()[0] = 4;
|
|
let vv = ags.alloc_cell(0);
|
|
//v.slice_mut()[0] = 4;
|
|
let mut w = ags.alloc_cell(31);
|
|
w.slice_mut()[30] = 4;
|
|
let mut x = ags.alloc_cell(31);
|
|
x.slice_mut()[30] = 4;
|
|
let mut y = ags.alloc_cell(31);
|
|
y.slice_mut()[30] = 4;
|
|
let mut z = ags.alloc_cell(31);
|
|
z.slice_mut()[30] = 4;
|
|
let mut zz = ags.alloc_cell(31);
|
|
zz.slice_mut()[30] = 4;
|
|
let mut xx = ags.alloc_cell(31);
|
|
xx.slice_mut()[30] = 4;
|
|
let mut yy = ags.alloc_cell(31);
|
|
yy.slice_mut()[30] = 4;
|
|
let mut ww = ags.alloc_cell(31);
|
|
ww.slice_mut()[30] = 4;
|
|
ags.free_cell(y);
|
|
ags.free_cell(x);
|
|
ags.free_cell(z);
|
|
ags.free_cell(zz);
|
|
ags.free_cell(xx);
|
|
ags.free_cell(yy);
|
|
ags.free_cell(ww);
|
|
ags.free_cell(v);
|
|
ags.free_cell(u);
|
|
ags.free_cell(s);
|
|
ags.free_cell(t);
|
|
ags.free_cell(w);
|
|
ags.free_cell(vv);
|
|
ags.free_cell(uu);
|
|
ags.free_cell(ss);
|
|
ags.free_cell(tt);
|
|
let mut a = ags.alloc_cell(31);
|
|
a.slice_mut()[30] = 4;
|
|
let mut b = ags.alloc_cell(31);
|
|
b.slice_mut()[30] = 4;
|
|
let mut c = ags.alloc_cell(31);
|
|
c.slice_mut()[30] = 4;
|
|
let mut d = ags.alloc_cell(31);
|
|
d.slice_mut()[30] = 4;
|
|
let mut e = ags.alloc_cell(31);
|
|
e.slice_mut()[30] = 4;
|
|
let mut f = ags.alloc_cell(31);
|
|
f.slice_mut()[30] = 4;
|
|
let mut g = ags.alloc_cell(31);
|
|
g.slice_mut()[30] = 4;
|
|
let mut h = ags.alloc_cell(31);
|
|
h.slice_mut()[30] = 4;
|
|
|
|
}
|
|
|
|
}
|
|
#[test]
|
|
#[cfg(not(feature="no-stdlib"))]
|
|
fn heap_pool_test() {
|
|
{
|
|
let mut heap_global_buffer = define_allocator_memory_pool!(4096, u8, [0; 6 * 1024 * 1024], heap);
|
|
let mut ags = HeapPrealloc::<u8>::new_allocator(4096, &mut heap_global_buffer, bzero);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 0);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
fn calloc_pool_test() {
|
|
|
|
{
|
|
let mut calloc_global_buffer = unsafe {define_allocator_memory_pool!(4096, u8, [0; 200 * 1024 * 1024], calloc)};
|
|
{
|
|
let mut ags = CallocAllocatedFreelist4096::<u8>::new_allocator(&mut calloc_global_buffer.data, bzero);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 0);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
{
|
|
let mut ags = CallocAllocatedFreelist4096::<u8>::new_allocator(&mut calloc_global_buffer.data, bzero);
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 0);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
drop(calloc_global_buffer);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
fn global_pool_test() {
|
|
{
|
|
let mut ags = GlobalAllocatedFreelist::<u8>::new_allocator(bzero);
|
|
unsafe {
|
|
bind_global_buffers_to_allocator!(ags, global_buffer2, u8);
|
|
}
|
|
{
|
|
let mut x = ags.alloc_cell(9999);
|
|
x.slice_mut()[0] = 4;
|
|
let mut y = ags.alloc_cell(4);
|
|
y[0] = 5;
|
|
ags.free_cell(y);
|
|
|
|
let mut three = ags.alloc_cell(3);
|
|
three[0] = 6;
|
|
ags.free_cell(three);
|
|
|
|
let mut z = ags.alloc_cell(4);
|
|
z.slice_mut()[1] = 8;
|
|
let mut reget_three = ags.alloc_cell(4);
|
|
reget_three.slice_mut()[1] = 9;
|
|
//y.mem[0] = 6; // <-- this is an error (use after free)
|
|
assert_eq!(x[0], 4);
|
|
assert_eq!(z[0], 0);
|
|
assert_eq!(z[1], 8);
|
|
assert_eq!(reget_three[0], 0);
|
|
assert_eq!(reget_three[1], 9);
|
|
let mut _z = ags.alloc_cell(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|