diff --git a/Cargo.toml b/Cargo.toml index 48c9d8105f15a806e56e6269e8edcb7897495308..ef7258bd3da2cd7287ee77f8cccf5227827db558 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ incremental = false [profile.release] debug = true panic = "abort" +incremental = false lto = true [features] diff --git a/examples/eq.rs b/examples/eq.rs index fccca3bcbae62906eb89fecd930592f68d788ea9..b4e36a8689287e78da514e07b7d08858f99907a6 100644 --- a/examples/eq.rs +++ b/examples/eq.rs @@ -4,10 +4,33 @@ extern crate klee; use klee::{kassert, kassume, ksymbol}; +#[derive(Debug, Copy, Clone)] +pub struct Data { + a: bool, + b: bool, +} + +#[derive(Debug, Copy, Clone, PartialEq)] +pub enum State { + S8000, + S8001, + S8004, + S8014, + S8005, + C001, + C002, + C003, +} + +use State::*; + +const DISCREPENCY: u32 = 3; +const T: bool = true; +const F: bool = false; + #[no_mangle] fn main() { - let mut DATA: [Data; (DISCREPENCY + 2) as usize] = - unsafe { core::mem::uninitialized() }; + let mut DATA: [Data; (DISCREPENCY + 2) as usize] = unsafe { core::mem::uninitialized() }; ksymbol!(&mut DATA, "DATA"); let mut STATE_HISTORY: [State; (DISCREPENCY + 2) as usize] = @@ -41,7 +64,8 @@ fn main() { // S8001 -> !a & !b // we can only stay or enter the Init state if both inputs are false if STATE == S8001 { - kassert!(TIMEOUT_CNTR == DISCREPENCY && !DATA[i].a | !DATA[i].b); + kassert!(TIMEOUT_CNTR == DISCREPENCY); + kassert!(!DATA[i].a | !DATA[i].b); } // !a & !b & !timeout-> S8001 @@ -51,7 +75,7 @@ fn main() { kassert!(STATE == S8001); } - // DISCREPANCY relatod invariants + // DISCREPANCY related invariants match STATE { // Error -> timeout // error states implies TIMEOUT_CNTR to have expired @@ -59,9 +83,7 @@ fn main() { // Waiting states -> !timeout // wait states implies that TIMEOUT_CNTR not yet expired // and that the time remaining is not longer than the discrepency - S8004 | S8005 | S8014 => { - kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY) - } + S8004 | S8005 | S8014 => kassert!(0 < TIMEOUT_CNTR && TIMEOUT_CNTR <= DISCREPENCY), _ => {} } @@ -85,56 +107,21 @@ fn main() { } } -#[derive(Debug, Copy, Clone)] -pub struct Data { - a: bool, - b: bool, -} - -#[derive(Debug, Copy, Clone, PartialEq)] -pub enum State { - S8000, - S8001, - S8004, - S8014, - S8005, - C001, - C002, - C003, -} - -use State::*; - -const DISCREPENCY: u32 = 3; -const T: bool = true; -const F: bool = false; - -fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, DATA: &mut Data) { - // we start directly in the init state S80001 - // static mut STATE: State = State::S8001; - // static mut TIMEOUT_CNTR: u32 = 0; - - let data = DATA; +fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, data: &Data) { *STATE = match STATE { S8000 => match (data.a, data.b) { - (F, F) => S8001, - (F, T) | (T, F) => { + (F, F) => { *TIMEOUT_CNTR = DISCREPENCY; - S8005 + S8001 } + (F, T) | (T, F) => S8005, (T, T) => S8000, }, S8001 => match (data.a, data.b) { (F, F) => S8001, - (F, T) => { - *TIMEOUT_CNTR = DISCREPENCY; - S8014 - } - (T, F) => { - *TIMEOUT_CNTR = DISCREPENCY; - S8004 - } + (F, T) => S8014, + (T, F) => S8004, (T, T) => S8000, }, S8004 => { @@ -142,7 +129,10 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, DATA: &mut Data) { match *TIMEOUT_CNTR { 0 => C001, _ => match (data.a, data.b) { - (F, _) => S8001, + (F, _) => { + *TIMEOUT_CNTR = DISCREPENCY; + S8001 + } (_, T) => S8000, _ => S8004, }, @@ -153,7 +143,10 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, DATA: &mut Data) { match *TIMEOUT_CNTR { 0 => C002, _ => match (data.a, data.b) { - (_, F) => S8001, + (_, F) => { + *TIMEOUT_CNTR = DISCREPENCY; + S8001 + } (T, _) => S8000, _ => S8014, }, @@ -164,17 +157,26 @@ fn periodic(STATE: &mut State, TIMEOUT_CNTR: &mut u32, DATA: &mut Data) { match *TIMEOUT_CNTR { 0 => C003, _ => match (data.a, data.b) { - (F, F) => S8001, + (F, F) => { + *TIMEOUT_CNTR = DISCREPENCY; + S8001 + } _ => S8005, }, } } C001 | C002 => match (data.a, data.b) { - (F, F) => S8001, + (F, F) => { + *TIMEOUT_CNTR = DISCREPENCY; + S8001 + } _ => *STATE, }, C003 => match (data.a, data.b) { - (F, F) => S8001, + (F, F) => { + *TIMEOUT_CNTR = DISCREPENCY; + S8001 + } _ => C003, }, };