pub struct Machine {
pub memory_used: usize,
/* private fields */
}
Expand description
Fake machine implementation to validate an allocation history.
Fields§
§memory_used: usize
Current memory used according to allocations.
Implementations§
source§impl Machine
impl Machine
sourcepub fn push(&mut self, event: &Event) -> Result<(), Violation>
pub fn push(&mut self, event: &Event) -> Result<(), Violation>
Push an event into the machine.
Examples
Checks for a double-free:
use checkers::{Event::*, Request, Region, Machine};
let mut machine = Machine::default();
let request = Request::without_backtrace(Region::new(0.into(), 2, 1));
assert!(machine.push(&Alloc(request)).is_ok());
let request = Request::without_backtrace(Region::new(0.into(), 2, 1));
assert!(machine.push(&Free(request)).is_ok());
let request = Request::without_backtrace(Region::new(0.into(), 2, 1));
assert!(machine.push(&Free(request)).is_err());
Check for a misaligned allocation:
use checkers::{Event::*, Request, Region, Machine, Violation};
let mut machine = Machine::default();
let region = Region::new(5.into(), 2, 4);
let request = Request::without_backtrace(region);
assert!(matches!(
machine.push(&Alloc(request)).unwrap_err(),
Violation::MisalignedAlloc { .. }
));
Tries to deallocate part of other region:
use checkers::{Event::*, Request, Region, Machine, Violation};
let mut machine = Machine::default();
let existing = Region::new(100.into(), 100, 1);
let request = Request::without_backtrace(existing);
assert!(machine.push(&Alloc(request)).is_ok());
let request = Request::without_backtrace(Region::new(150.into(), 50, 1));
assert!(matches!(
machine.push(&Free(request)).unwrap_err(),
Violation::MissingFree { .. }
));
let request = Request::without_backtrace(Region::new(100.into(), 50, 1));
assert!(matches!(
machine.push(&Free(request)).unwrap_err(),
Violation::IncompleteFree { .. }
));
sourcepub fn trailing_regions(&self) -> Vec<Request>
pub fn trailing_regions(&self) -> Vec<Request>
Access all trailing regions (ones which have not been deallocated).