From 9b118168e566572b39ea187ee7fff3c5693c4a3d Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Fri, 10 Nov 2017 04:02:34 +0100 Subject: [PATCH] cc updates --- klee-examples/examples/cc_add.rs | 32 +++++++++++ klee-examples/examples/cc_contract.rs | 64 ++++++++++++++++++++++ klee-examples/examples/cc_contract_err.rs | 64 ++++++++++++++++++++++ klee-examples/examples/cc_equivalence.rs | 25 +++++++++ klee-examples/examples/cc_loop.rs | 16 ++++-- klee-examples/examples/cc_native_add.rs | 3 +- klee-examples/examples/cc_saturating.rs | 5 +- klee-examples/examples/cc_unchecked_div.rs | 24 ++++++++ klee-examples/examples/cc_wrapping.rs | 7 +-- klee/src/lib.rs | 8 +-- rls1509755957780.log | 6 ++ 11 files changed, 237 insertions(+), 17 deletions(-) create mode 100644 klee-examples/examples/cc_add.rs create mode 100644 klee-examples/examples/cc_contract.rs create mode 100644 klee-examples/examples/cc_contract_err.rs create mode 100644 klee-examples/examples/cc_equivalence.rs create mode 100644 klee-examples/examples/cc_unchecked_div.rs create mode 100644 rls1509755957780.log diff --git a/klee-examples/examples/cc_add.rs b/klee-examples/examples/cc_add.rs new file mode 100644 index 0000000..d0e3e84 --- /dev/null +++ b/klee-examples/examples/cc_add.rs @@ -0,0 +1,32 @@ +#![no_std] +#![feature(core_intrinsics)] + +#[macro_use] +extern crate klee; + +use core::ptr; +use core::intrinsics::unchecked_div; + +fn main() { + let u = ksymbol!("u"); + + unsafe { + ptr::read_volatile(&f2(f1(u))); + } +} + +// add 1 wrapping +fn f1(u: u8) -> u8 { + // if u > 254 { + // u + // } else { + // u.wrapping_add(1) + // } + // // u.checked_add(1).unwrap_or(u) + u + 1 +} + +fn f2(u: u8) -> u8 { + // unsafe { unchecked_div( 100, u) } + 100 / u +} diff --git a/klee-examples/examples/cc_contract.rs b/klee-examples/examples/cc_contract.rs new file mode 100644 index 0000000..99c7be9 --- /dev/null +++ b/klee-examples/examples/cc_contract.rs @@ -0,0 +1,64 @@ +#![no_std] +#![feature(core_intrinsics)] + +#[macro_use] +extern crate klee; +use klee::kassume; + +use core::ptr; +use core::intrinsics::unchecked_div; + +fn main() { + f1_check(); + f2_check(); + f2_f1_check(); +} + +// contract f1 +fn f1_pre(u: u8) -> bool { + true +} + +fn f1_post(u: u8) -> bool { + u > 0 +} + +// check pre-post f1 +fn f1_check() { + let u = ksymbol!("u"); + kassume(f1_pre(u)); + let r = f1(u); + kassert!(f1_post(r)); +} + +fn f1(u: u8) -> u8 { + u.checked_add(1).unwrap_or(u) +} + +// contract f2 +fn f2_pre(u: u8) -> bool { + u != 0 +} + +fn f2_post(u: u8) -> bool { + true +} + +// check pre-post f2 +fn f2_check() { + let u = ksymbol!("u"); + kassume(f2_pre(u)); + let r = f2(u); + kassert!(f2_post(r)); +} + +fn f2(u: u8) -> u8 { + unsafe { unchecked_div(100, u) } +} + +// check f2_f1 composition +fn f2_f1_check() { + let u = ksymbol!("u"); + kassume(f1_post(u)); + kassert!(f2_pre(u)); +} diff --git a/klee-examples/examples/cc_contract_err.rs b/klee-examples/examples/cc_contract_err.rs new file mode 100644 index 0000000..d1d27aa --- /dev/null +++ b/klee-examples/examples/cc_contract_err.rs @@ -0,0 +1,64 @@ +#![no_std] +#![feature(core_intrinsics)] + +#[macro_use] +extern crate klee; +use klee::kassume; + +use core::ptr; +use core::intrinsics::unchecked_div; + +fn main() { + f1_check(); + f2_check(); + f2_f1_check(); +} + +// contract f1 +fn f1_pre(u: u8) -> bool { + true +} + +fn f1_post(u: u8) -> bool { + u > 0 +} + +// check pre-post f1 +fn f1_check() { + let u = ksymbol!("u"); + kassume(f1_pre(u)); + let r = f1(u); + kassert!(f1_post(r)); +} + +fn f1(u: u8) -> u8 { + u.wrapping_add(1) +} + +// contract f2 +fn f2_pre(u: u8) -> bool { + u != 0 +} + +fn f2_post(u: u8) -> bool { + true +} + +// check pre-post f2 +fn f2_check() { + let u = ksymbol!("u"); + kassume(f2_pre(u)); + let r = f2(u); + kassert!(f2_post(r)); +} + +fn f2(u: u8) -> u8 { + unsafe { unchecked_div(100, u) } +} + +// check f2_f1 composition +fn f2_f1_check() { + let u = ksymbol!("u"); + kassume(f1_post(u)); + kassert!(f2_pre(u)); +} diff --git a/klee-examples/examples/cc_equivalence.rs b/klee-examples/examples/cc_equivalence.rs new file mode 100644 index 0000000..683b045 --- /dev/null +++ b/klee-examples/examples/cc_equivalence.rs @@ -0,0 +1,25 @@ +#![no_std] + +#[macro_use] +extern crate klee; +use core::ops::Add; + +use core::ptr; + +fn main() { + let u = ksymbol!("u"); + + kassert!(f1(u) == f1b(u)); +} + +fn f1(u: u8) -> u8 { + if u < 255 { + u + 1 + } else { + u + } +} + +fn f1b(u: u8) -> u8 { + u.checked_add(1).unwrap_or(u) +} diff --git a/klee-examples/examples/cc_loop.rs b/klee-examples/examples/cc_loop.rs index b3dcaaa..87eea38 100644 --- a/klee-examples/examples/cc_loop.rs +++ b/klee-examples/examples/cc_loop.rs @@ -3,16 +3,20 @@ #[macro_use] extern crate klee; +use klee::kassume; use core::ptr; use core::intrinsics::unchecked_div; fn main() { - let u = symbol!("u"); + let u = ksymbol!("u"); + kassume(u < 10); + //kassert!(f1(u) == f1b(u)); + assert!(f1(u) == f1b(u)); - unsafe { - ptr::read_volatile(&f2(f1(u))); - } + // unsafe { + // ptr::read_volatile(&f2(f1(u))); + // } } // add 1 wrapping @@ -24,6 +28,10 @@ fn f1(u: u8) -> u8 { j } +fn f1b(u: u8) -> u8 { + u +} + fn f2(u: u8) -> u8 { unsafe { unchecked_div(100, u) } } diff --git a/klee-examples/examples/cc_native_add.rs b/klee-examples/examples/cc_native_add.rs index 6f272c7..75ccba3 100644 --- a/klee-examples/examples/cc_native_add.rs +++ b/klee-examples/examples/cc_native_add.rs @@ -6,14 +6,13 @@ extern crate klee; use core::ptr; fn main() { - let u = symbol!("u"); + let u = ksymbol!("u"); unsafe { ptr::read_volatile(&f2(f1(u))); } } -// add 1 wrapping fn f1(u: u8) -> u8 { u + 1 } diff --git a/klee-examples/examples/cc_saturating.rs b/klee-examples/examples/cc_saturating.rs index 2ee2f41..db43512 100644 --- a/klee-examples/examples/cc_saturating.rs +++ b/klee-examples/examples/cc_saturating.rs @@ -7,16 +7,15 @@ use core::ops::Add; use core::ptr; fn main() { - let u = symbol!("u"); + let u = ksymbol!("u"); unsafe { ptr::read_volatile(&f2(f1(u))); } } -// add 1 saturating + fn f1(u: u8) -> u8 { - //if u < 255 { u + 1 } else { u } u.checked_add(1).unwrap_or(u) } diff --git a/klee-examples/examples/cc_unchecked_div.rs b/klee-examples/examples/cc_unchecked_div.rs new file mode 100644 index 0000000..9193598 --- /dev/null +++ b/klee-examples/examples/cc_unchecked_div.rs @@ -0,0 +1,24 @@ +#![no_std] +#![feature(core_intrinsics)] + +#[macro_use] +extern crate klee; + +use core::ptr; +use core::intrinsics::unchecked_div; + +fn main() { + let u = ksymbol!("u"); + + unsafe { + ptr::read_volatile(&f2(f1(u))); + } +} + +fn f1(u: u8) -> u8 { + u.wrapping_add(1) +} + +fn f2(u: u8) -> u8 { + unsafe { unchecked_div(100, u) } +} diff --git a/klee-examples/examples/cc_wrapping.rs b/klee-examples/examples/cc_wrapping.rs index 2689548..b8ad048 100644 --- a/klee-examples/examples/cc_wrapping.rs +++ b/klee-examples/examples/cc_wrapping.rs @@ -5,21 +5,20 @@ extern crate klee; use core::ptr; - use core::intrinsics::unchecked_div; +use core::intrinsics::unchecked_div; fn main() { - let u = symbol!("u"); + let u = ksymbol!("u"); unsafe { ptr::read_volatile(&f2(f1(u))); } } -// add 1 wrapping fn f1(u: u8) -> u8 { u.wrapping_add(1) } fn f2(u: u8) -> u8 { - unsafe { unchecked_div( 100, u) } + 100 / u } diff --git a/klee/src/lib.rs b/klee/src/lib.rs index f2b035b..48b0dbf 100644 --- a/klee/src/lib.rs +++ b/klee/src/lib.rs @@ -24,7 +24,7 @@ pub fn abort() -> ! { unsafe { ll::abort() } } -pub fn assume(cond: bool) { +pub fn kassume(cond: bool) { unsafe { ll::klee_assume(cond); } @@ -32,7 +32,7 @@ pub fn assume(cond: bool) { #[doc(hidden)] #[inline] -pub fn symbol<T>(name: &CStr) -> T { +pub fn ksymbol<T>(name: &CStr) -> T { let mut t: T = unsafe { mem::uninitialized() }; unsafe { ll::klee_make_symbolic( @@ -45,9 +45,9 @@ pub fn symbol<T>(name: &CStr) -> T { } #[macro_export] -macro_rules! symbol { +macro_rules! ksymbol { ($name:expr) => { - $crate::symbol(unsafe { + $crate::ksymbol(unsafe { $crate::CStr::from_bytes_with_nul_unchecked(concat!($name, "\0").as_bytes()) }) } diff --git a/rls1509755957780.log b/rls1509755957780.log new file mode 100644 index 0000000..a29dede --- /dev/null +++ b/rls1509755957780.log @@ -0,0 +1,6 @@ +error: expected expression, found `+` + --> stdin:22:11 + | +22 | j++; + | ^ + -- GitLab