use std::hint::black_box;
use std::io::{stdin, stdout, Read, Write};
use crate::lifetime_expansion;
const HORRIBLE_LEN: usize = 64;
#[inline(never)]
fn get_horrible_buffer_mut() -> &'static mut [u8; HORRIBLE_LEN] {
let mut buffer = black_box([0; HORRIBLE_LEN]);
lifetime_expansion::expand_mut(&mut buffer)
}
#[inline(never)]
fn innocent_prompt() {
print!("Give text (must be at least {HORRIBLE_LEN} chars) > ");
stdout().flush().unwrap();
}
#[inline(never)]
fn innocent_read(initial_buffer_mut: &mut [u8; HORRIBLE_LEN]) {
let mut stdin = black_box(stdin());
println!("Buffer before writing:\n{initial_buffer_mut:?}");
let _buffer = black_box([0_u8; HORRIBLE_LEN / 2]);
let _thing = black_box(69_727_420_u64);
println!("Buffer after creating random data:\n{initial_buffer_mut:?}");
innocent_prompt();
stdin.read_exact(initial_buffer_mut).unwrap();
println!("Buffer after writing user input:\n{initial_buffer_mut:?}");
}
pub fn use_after_free() {
let initial_buffer_mut = get_horrible_buffer_mut();
innocent_read(initial_buffer_mut);
}