memcheck 0.0.1

Allocation sanitizer for `GlobalAlloc`, which adds nominal bookkeeping to guard against incorrect `Layout`s and double-free.
Documentation
#![feature(map_try_insert)]

use rand::{Rng, SeedableRng, rngs::SmallRng};
use std::{alloc, collections::HashMap, mem};

use memcheck::Memcheck;

#[global_allocator]
static ALLOCATOR: Memcheck<alloc::System> = Memcheck::new(alloc::System);

#[test]
fn smoke() {
	let rng = &mut SmallRng::seed_from_u64(0);
	let iters = if cfg!(miri) { 10_000 } else { 100_000_000 };
	let mut a: Vec<u8> = Vec::new();
	let mut b: Vec<u128> = Vec::new();
	let mut c: HashMap<u64, u64> = HashMap::new();
	for i in 0..iters {
		if i % (iters / 100) == 0 {
			println!("{i}");
		}
		match rng.random_range(0..3) {
			0 => {
				if rng.random_range(0..10_000) != 0 {
					a.push(rng.random());
				} else {
					_ = mem::take(&mut a);
				}
			}
			1 => {
				if rng.random_range(0..10_000) != 0 {
					b.push(rng.random());
				} else {
					_ = mem::take(&mut b);
				}
			}
			2 => {
				if rng.random_range(0..10_000) != 0 {
					_ = c.try_insert(rng.random(), rng.random()).unwrap();
				} else {
					_ = mem::take(&mut c);
				}
			}
			_ => unreachable!(),
		}
	}
}