mod generated {
#![allow(non_camel_case_types, non_upper_case_globals, dead_code)]
include!("generated.rs");
}
pub use generated::*;
pub type CaseStartCb = unsafe extern "C" fn(*mut core::ffi::c_void, *mut core::ffi::c_void);
pub type MutateCb =
unsafe extern "C" fn(*mut core::ffi::c_void, *mut core::ffi::c_void, *mut u8, *mut u64, u64);
pub type InjectCb =
unsafe extern "C" fn(*mut core::ffi::c_void, *mut core::ffi::c_void, *const u8, u64);
pub type CovHashCb = unsafe extern "C" fn(*mut core::ffi::c_void, *mut core::ffi::c_void) -> u64;
pub type CaseEndCb = unsafe extern "C" fn(*mut core::ffi::c_void, *mut core::ffi::c_void, u32);
impl FuzzVtable {
pub const ABSENT: FuzzVtable = FuzzVtable {
rand: None,
case_id: None,
set_icount_budget: None,
set_case_limit: None,
set_next_input: None,
corpus_size: None,
};
}
pub struct Input {
buf: *mut u8,
len: *mut u64,
cap: u64,
}
impl Input {
pub unsafe fn new(buf: *mut u8, len: *mut u64, cap: u64) -> Input {
Input { buf: buf, len: len, cap: cap }
}
pub fn as_slice(&self) -> &[u8] {
unsafe { core::slice::from_raw_parts(self.buf, self.len() as usize) }
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
let len = self.len() as usize;
unsafe { core::slice::from_raw_parts_mut(self.buf, len) }
}
pub fn len(&self) -> u64 {
unsafe { *self.len }.min(self.cap)
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn cap(&self) -> u64 {
self.cap
}
pub fn set_len(&mut self, len: u64) {
unsafe { *self.len = len.min(self.cap) };
}
pub fn extend_from_slice(&mut self, bytes: &[u8]) {
let at = self.len();
let n = bytes.len().min((self.cap - at) as usize);
unsafe { core::ptr::copy_nonoverlapping(bytes.as_ptr(), self.buf.add(at as usize), n) };
self.set_len(at + n as u64);
}
}
impl FuzzRef {
fn table(&self) -> Option<&FuzzVtable> {
unsafe { self.vtable.as_ref() }
}
pub fn rand(&self) -> u64 {
self.table()
.and_then(|v| v.rand)
.map_or(0, |f| unsafe { f(*self) })
}
pub fn case_id(&self) -> u64 {
self.table()
.and_then(|v| v.case_id)
.map_or(0, |f| unsafe { f(*self) })
}
pub fn set_icount_budget(&self, insns: u64) {
if let Some(f) = self.table().and_then(|v| v.set_icount_budget) {
unsafe { f(*self, insns) };
}
}
pub fn set_case_limit(&self, cases: u64) {
if let Some(f) = self.table().and_then(|v| v.set_case_limit) {
unsafe { f(*self, cases) };
}
}
pub fn set_next_input(&self, bytes: &[u8]) {
if let Some(f) = self.table().and_then(|v| v.set_next_input) {
unsafe { f(*self, bytes.as_ptr(), bytes.len() as u64) };
}
}
pub fn corpus_size(&self) -> u64 {
self.table()
.and_then(|v| v.corpus_size)
.map_or(0, |f| unsafe { f(*self) })
}
}