#[cfg(not(feature = "fuzztarget"))] mod real_rng { use rand::{thread_rng,Rng}; pub fn fill_bytes(data: &mut [u8]) { let mut rng = thread_rng(); rng.fill_bytes(data); } pub fn rand_f32() -> f32 { let mut rng = thread_rng(); rng.next_f32() } } #[cfg(not(feature = "fuzztarget"))] pub use self::real_rng::*; #[cfg(feature = "fuzztarget")] mod fuzzy_rng { use util::byte_utils; static mut RNG_ITER: u64 = 0; pub fn fill_bytes(data: &mut [u8]) { let rng = unsafe { RNG_ITER += 1; RNG_ITER -1 }; for i in 0..data.len() / 8 { data[i*8..(i+1)*8].copy_from_slice(&byte_utils::be64_to_array(rng)); } let rem = data.len() % 8; let off = data.len() - rem; data[off..].copy_from_slice(&byte_utils::be64_to_array(rng)[0..rem]); } pub fn rand_f32() -> f32 { let rng = unsafe { RNG_ITER += 1; RNG_ITER - 1 }; f64::from_bits(rng) as f32 } pub fn reset_rng_state() { unsafe { RNG_ITER = 0; } } } #[cfg(feature = "fuzztarget")] pub use self::fuzzy_rng::*;