diff --git a/klee-examples/examples/array.rs b/klee-examples/examples/array.rs
new file mode 100644
index 0000000000000000000000000000000000000000..4dbb026385d80a6155206bae4db276ded8da1282
--- /dev/null
+++ b/klee-examples/examples/array.rs
@@ -0,0 +1,23 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+use core::ptr;
+
+#[no_mangle]
+fn main() -> u32 {
+    let mut u: [u32; 32] = unsafe { core::mem::uninitialized() };
+    ksymbol!(&mut u, "u");
+
+    let mut z = 0;
+    unsafe {
+        for (i, x) in u.iter().enumerate() {
+            if ptr::read_volatile(x) == 0 {
+                z = i;
+            }
+        }
+    }
+    return z as u32;
+}
diff --git a/klee-examples/examples/cc_add.rs b/klee-examples/examples/cc_add.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b1a0b30c89bc9b84193dc0ea399fb700a5298a94
--- /dev/null
+++ b/klee-examples/examples/cc_add.rs
@@ -0,0 +1,34 @@
+#![no_std]
+#![no_main]
+#![feature(core_intrinsics)]
+
+#[macro_use]
+extern crate klee;
+
+use core::intrinsics::unchecked_div;
+use core::ptr;
+
+#[no_mangle]
+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_codegen.rs b/klee-examples/examples/cc_codegen.rs
new file mode 100644
index 0000000000000000000000000000000000000000..00ee4d9bd34657ac3c8fd313f1bfe29776edc970
--- /dev/null
+++ b/klee-examples/examples/cc_codegen.rs
@@ -0,0 +1,60 @@
+#![no_std]
+#![no_main]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::ptr;
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+#[no_mangle]
+fn main() {
+    // test that codgen works
+    let mut seed = ksymbol!("seed");
+    unsafe {
+        ptr::read_volatile(&codgen(&mut seed));
+    }
+}
diff --git a/klee-examples/examples/cc_codegen_eq.rs b/klee-examples/examples/cc_codegen_eq.rs
new file mode 100644
index 0000000000000000000000000000000000000000..3bfb13fcdf686385ec6fe2d1c7e1fa0460be3061
--- /dev/null
+++ b/klee-examples/examples/cc_codegen_eq.rs
@@ -0,0 +1,79 @@
+#![no_std]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::ptr;
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+fn codgen2(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let mut s: u32 = *seed;
+    let x: u32;
+    let y: u32;
+
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1;
+    }
+
+    x = *seed << 30 | ((*seed >> 2) & ((1 << (30 + 1)) - 1));
+    y = ((*seed as i32) >> 6) as u32;
+    *seed = x ^ y ^ (n as u32);
+    *seed ^ 0x464b713e
+}
+
+fn main() {
+    // test that codgen works
+    let mut seed = ksymbol!("seed");
+    let mut seed_copy = seed;
+    kassert!(codgen(&mut seed) == codgen2(&mut seed_copy));
+    // unsafe {
+    //     ptr::read_volatile(&codgen(&mut seed));
+    // }
+}
diff --git a/klee-examples/examples/cc_contract.rs_no b/klee-examples/examples/cc_contract.rs_no
new file mode 100644
index 0000000000000000000000000000000000000000..8e1d816be107e41d8c168c529ea85732583ff70c
--- /dev/null
+++ b/klee-examples/examples/cc_contract.rs_no
@@ -0,0 +1,64 @@
+#![no_std]
+#![feature(core_intrinsics)]
+
+#[macro_use]
+extern crate klee;
+use klee::kassume;
+
+use core::intrinsics::unchecked_div;
+use core::ptr;
+
+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 0000000000000000000000000000000000000000..35321844668a6e08d2bda214dc63b188a45cd4ed
--- /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::intrinsics::unchecked_div;
+use core::ptr;
+
+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 0000000000000000000000000000000000000000..683b0451382d5e3b49eb92e98a587fe8246bcf33
--- /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_lab4.rs_no b/klee-examples/examples/cc_lab4.rs_no
new file mode 100644
index 0000000000000000000000000000000000000000..c1d0ae022571b0d138ec41e8b500304f3075158a
--- /dev/null
+++ b/klee-examples/examples/cc_lab4.rs_no
@@ -0,0 +1,276 @@
+//! Prints "Hello, world!" on the OpenOCD console using semihosting
+//!
+//! ---
+
+#![no_std]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::cmp;
+
+static mut PLAIN: [u8; 132] = [0; 132];
+
+static ABC: [u32; 4] = [0x9fdd9158, 0x85715808, 0xac73323a, 0];
+static CODED: [u32; 132] = [
+    0x015e7a47,
+    0x2ef84ebb,
+    0x177a8db4,
+    0x1b722ff9,
+    0x5dc7cff0,
+    0x5dc9dea6,
+    0x1da0c15a,
+    0xe4c236a2,
+    0x3d16b0d0,
+    0x1f397842,
+    0xaae0d2ba,
+    0x11246674,
+    0x0845317f,
+    0xd5512dad,
+    0xb6184977,
+    0xd293a53e,
+    0x7d9c2716,
+    0xd917eae6,
+    0xd8852384,
+    0x286e46f9,
+    0xce566029,
+    0xcefe7daf,
+    0x62d726d4,
+    0x0dbaeb2d,
+    0x95f57c60,
+    0xed515141,
+    0x29b77d0f,
+    0x9f7b8d0c,
+    0x45a8395a,
+    0xfead2b72,
+    0x883d434c,
+    0xed8ddf60,
+    0xe51e65e4,
+    0x19bf6bb1,
+    0xfeb505ec,
+    0x662aa23c,
+    0xf6827cf8,
+    0xd1dc7a5c,
+    0x4fa5b066,
+    0x7ddd25a4,
+    0xa8ba8e8a,
+    0x72846227,
+    0xf8f636fb,
+    0x2b389a9c,
+    0xe4038bf6,
+    0x6e169877,
+    0xad028132,
+    0x84dbfe8c,
+    0x243762ff,
+    0x59c8f80c,
+    0xb6e0db4b,
+    0xedb8cab7,
+    0xcd4b39f6,
+    0xaf263741,
+    0x18d9965f,
+    0x1ab1f037,
+    0x5b458792,
+    0xc94d960d,
+    0xd45cedea,
+    0x2160aca3,
+    0x93c77766,
+    0x2d66e105,
+    0x9ff74d4f,
+    0x6dc22f21,
+    0x6b03d689,
+    0x5fc48de0,
+    0x1138f000,
+    0xccb58e57,
+    0xf9c8e200,
+    0x7ab26e3c,
+    0xc61dcb3e,
+    0x6aefccb0,
+    0x7a452f05,
+    0xa5cf0731,
+    0xa249383f,
+    0x628fe534,
+    0xcad81710,
+    0x7f616276,
+    0x3ce18308,
+    0xed4857ff,
+    0xd1e5b1d1,
+    0xc2e84dc2,
+    0xaa003742,
+    0xaf637488,
+    0x831afc48,
+    0x287a69a0,
+    0x6e04546e,
+    0x13dffa07,
+    0x3232fb10,
+    0xd69e2e09,
+    0x355d8dc7,
+    0xef902301,
+    0x9a89ac15,
+    0x967dc900,
+    0x08dc2b1c,
+    0x6b5be690,
+    0x894b0e02,
+    0xe26af9af,
+    0xa6fd3b23,
+    0xfcf213e5,
+    0x85217608,
+    0x7fd3be8b,
+    0xa2e757fb,
+    0x3717a341,
+    0x85ee426d,
+    0x394bb856,
+    0x12ac98c3,
+    0xec7d4ab5,
+    0x721b6989,
+    0x30e36360,
+    0xaa018403,
+    0x9ee61196,
+    0xa8697adc,
+    0x51e9d65a,
+    0x11023594,
+    0xc4c4b36b,
+    0xda80bf7a,
+    0xbd5a645e,
+    0x18cea918,
+    0xa723dda8,
+    0x0126c05e,
+    0x2962d48a,
+    0xd5f7d312,
+    0xb8947041,
+    0x7c1e2e9a,
+    0x945eeac3,
+    0x7110fb1c,
+    0xa7bc72cc,
+    0xdf47dfbb,
+    0x09a1c6c8,
+    0xc2e41061,
+    0,
+];
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+//
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+//
+fn decode_org(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    x = !codgen(seed);
+    if wordarr[0] == 0 {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        r = (-(codgen(seed) as i32)) as u32;
+        r = x.wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+
+mod rnd {
+    use core::mem;
+    static mut I: usize = 0;
+    static RND: [u32; 132] = [0; 132]; // unsafe { mem::uninitialized() };
+    pub fn get() -> u32 {
+        unsafe {
+            let r = RND[I];
+            I += 1;
+            r
+        }
+    }
+    pub fn ksymbolic() {
+        unsafe {
+            make_symbolic(
+                &mut RND as *mut [u32; 132] as *mut c_void,
+                mem::size_of::<[u32; 132]>(),
+                "name".as_ptr(),
+            )
+        }
+    }
+}
+fn decode(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    //x = !codgen(seed);
+    //x = ksymbol!("x");
+    x = rnd::get();
+
+    if wordarr == [] {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        //let cg: u32 = ksymbol!("cg");
+        //let cg: u32 = codgen(seed);
+        let cg: u32 = rnd::get();
+        r = (-(cg as i32)) as u32;
+        r = x.wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+fn main() {
+    //let mut seed = 0x0e0657c1;
+    let mut seed = ksymbol!("seed");
+    rnd::ksymbolic();
+    let abc: [u32; 4] = ksymbol!("abc");
+    decode(&abc[..], unsafe { &mut PLAIN }, &mut seed);
+}
diff --git a/klee-examples/examples/cc_lab4_contract.rs b/klee-examples/examples/cc_lab4_contract.rs
new file mode 100644
index 0000000000000000000000000000000000000000..44da140ef4b306b7301e2014d82467bb70c33e91
--- /dev/null
+++ b/klee-examples/examples/cc_lab4_contract.rs
@@ -0,0 +1,160 @@
+#![no_std]
+#![no_main]
+#![allow(dead_code)]
+
+#[macro_use]
+extern crate klee;
+use core::cmp;
+
+static mut PLAIN: [u8; 132] = [0; 132];
+
+static ABC: [u32; 4] = [0x9fdd9158, 0x85715808, 0xac73323a, 0];
+static CODED: [u32; 132] = [
+    0x015e7a47, 0x2ef84ebb, 0x177a8db4, 0x1b722ff9, 0x5dc7cff0, 0x5dc9dea6, 0x1da0c15a, 0xe4c236a2,
+    0x3d16b0d0, 0x1f397842, 0xaae0d2ba, 0x11246674, 0x0845317f, 0xd5512dad, 0xb6184977, 0xd293a53e,
+    0x7d9c2716, 0xd917eae6, 0xd8852384, 0x286e46f9, 0xce566029, 0xcefe7daf, 0x62d726d4, 0x0dbaeb2d,
+    0x95f57c60, 0xed515141, 0x29b77d0f, 0x9f7b8d0c, 0x45a8395a, 0xfead2b72, 0x883d434c, 0xed8ddf60,
+    0xe51e65e4, 0x19bf6bb1, 0xfeb505ec, 0x662aa23c, 0xf6827cf8, 0xd1dc7a5c, 0x4fa5b066, 0x7ddd25a4,
+    0xa8ba8e8a, 0x72846227, 0xf8f636fb, 0x2b389a9c, 0xe4038bf6, 0x6e169877, 0xad028132, 0x84dbfe8c,
+    0x243762ff, 0x59c8f80c, 0xb6e0db4b, 0xedb8cab7, 0xcd4b39f6, 0xaf263741, 0x18d9965f, 0x1ab1f037,
+    0x5b458792, 0xc94d960d, 0xd45cedea, 0x2160aca3, 0x93c77766, 0x2d66e105, 0x9ff74d4f, 0x6dc22f21,
+    0x6b03d689, 0x5fc48de0, 0x1138f000, 0xccb58e57, 0xf9c8e200, 0x7ab26e3c, 0xc61dcb3e, 0x6aefccb0,
+    0x7a452f05, 0xa5cf0731, 0xa249383f, 0x628fe534, 0xcad81710, 0x7f616276, 0x3ce18308, 0xed4857ff,
+    0xd1e5b1d1, 0xc2e84dc2, 0xaa003742, 0xaf637488, 0x831afc48, 0x287a69a0, 0x6e04546e, 0x13dffa07,
+    0x3232fb10, 0xd69e2e09, 0x355d8dc7, 0xef902301, 0x9a89ac15, 0x967dc900, 0x08dc2b1c, 0x6b5be690,
+    0x894b0e02, 0xe26af9af, 0xa6fd3b23, 0xfcf213e5, 0x85217608, 0x7fd3be8b, 0xa2e757fb, 0x3717a341,
+    0x85ee426d, 0x394bb856, 0x12ac98c3, 0xec7d4ab5, 0x721b6989, 0x30e36360, 0xaa018403, 0x9ee61196,
+    0xa8697adc, 0x51e9d65a, 0x11023594, 0xc4c4b36b, 0xda80bf7a, 0xbd5a645e, 0x18cea918, 0xa723dda8,
+    0x0126c05e, 0x2962d48a, 0xd5f7d312, 0xb8947041, 0x7c1e2e9a, 0x945eeac3, 0x7110fb1c, 0xa7bc72cc,
+    0xdf47dfbb, 0x09a1c6c8, 0xc2e41061, 0,
+];
+
+//# FUNCTION codgen(): UNSIGNED INTEGER;
+// #  LOCAL SIGNED INTEGER   n;
+// #  LOCAL UNSIGNED INTEGER x, y;
+// #  BEGIN
+// #    n := [count the number of 0's in word "seed"];
+// #    x := [rotate "seed" left by 30 bits];
+// #    y := [shift "seed" right-ARITHMETIC by 6 bits];
+// #    seed := x XOR y XOR n;
+// #   RETURN( seed XOR 0x464b713e );
+// #  END;
+// #
+// # hint:  if "seed" is initialized to 0x3e944b9f,
+// #        the first five calls will generate these values:
+// #        0x891432f9, 0x4aa1dccc, 0xc54270fa, 0x9885155f, 0xce83d1b8, ...
+// # your code is to be written farther down (see comment below).
+//
+
+fn codgen(seed: &mut u32) -> u32 {
+    let mut n: i32 = 32;
+    let lseed: u32 = seed.clone(); // copy value of seed
+    let mut s: u32 = lseed;
+    let x: u32;
+    let y: u32;
+
+    //n = [count the number of 0's in word "seed"];
+    while s != 0 {
+        if s & 1u32 == 1u32 {
+            n -= 1;
+        }
+        s >>= 1; // >> is logic shift
+    }
+
+    // x := [rotate "seed" left by 30 bits];
+    x = lseed << 30 | ((lseed >> 2) & ((1 << (30 + 1)) - 1));
+
+    // y := [shift "seed" right-ARITHMETIC by 6 bits];
+    y = ((lseed as i32) >> 6) as u32;
+
+    // seed := x XOR y XOR n;
+    *seed = x ^ y ^ (n as u32);
+
+    // RETURN( seed XOR 0x464b713e );
+    (*seed) ^ 0x464b713e
+}
+
+//
+fn decode_org(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    x = !codgen(seed);
+    if wordarr[0] == 0 {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        r = (-(codgen(seed) as i32)) as u32;
+        r = x
+            .wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+// mod rnd {
+//     use core::mem;
+//     static mut I: usize = 0;
+//     static RND: [u32; 132] = [0; 132]; // unsafe { mem::uninitialized() };
+//     pub fn get() -> u32 {
+//         unsafe {
+//             let r = RND[I];
+//             I += 1;
+//             r
+//         }
+//     }
+//     pub fn ksymbolic() {
+//         unsafe {
+//             make_symbolic(
+//                 &mut RND as *mut [u32; 132] as *mut c_void,
+//                 mem::size_of::<[u32; 132]>(),
+//                 "name".as_ptr(),
+//             )
+//         }
+//     }
+// }
+fn decode(wordarr: &[u32], bytearr: &mut [u8], seed: &mut u32) -> u32 {
+    let m: u32;
+    let mut r: u32;
+    let x: u32;
+    let y: u32;
+
+    // x = !codgen(seed);
+    x = ksymbol!("x");
+    // x = rnd::get();
+
+    if wordarr == [] {
+        bytearr[0] = 0;
+        r = x;
+    } else {
+        y = decode(&wordarr[1..], &mut bytearr[1..], seed);
+        m = x.wrapping_sub(y).wrapping_sub(wordarr[0]);
+        bytearr[0] = (m >> 13) as u8;
+        let cg: u32 = ksymbol!("cg");
+        // let cg: u32 = codgen(seed);
+        // let cg: u32 = rnd::get();
+        r = (-(cg as i32)) as u32;
+        r = x
+            .wrapping_add(y)
+            .wrapping_add(m)
+            .wrapping_add(r)
+            .wrapping_add(5);
+    }
+    r
+}
+
+#[no_mangle]
+fn main() {
+    //let mut seed = 0x0e0657c1;
+    let mut seed = ksymbol!("seed");
+    //rnd::ksymbolic();
+    let abc: [u32; 4] = ksymbol!("abc");
+    decode_org(&abc[..], unsafe { &mut PLAIN }, &mut seed);
+}
diff --git a/klee-examples/examples/cc_loop.rs b/klee-examples/examples/cc_loop.rs
new file mode 100644
index 0000000000000000000000000000000000000000..93d2d531658284be73c0003cafd304afb40a7e1b
--- /dev/null
+++ b/klee-examples/examples/cc_loop.rs
@@ -0,0 +1,37 @@
+#![no_std]
+#![feature(core_intrinsics)]
+
+#[macro_use]
+extern crate klee;
+use klee::kassume;
+
+use core::intrinsics::unchecked_div;
+use core::ptr;
+
+fn main() {
+    let u = ksymbol!("u");
+    kassume(u < 10);
+    kassert!(f1(u) == f1b(u));
+    //assert!(f1(u) == f1b(u));
+
+    // unsafe {
+    //     ptr::read_volatile(&f2(f1(u)));
+    // }
+}
+
+// add 1 wrapping
+fn f1(u: u8) -> u8 {
+    let mut j = 0;
+    for _i in 0..u {
+        j += 2;
+    }
+    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
new file mode 100644
index 0000000000000000000000000000000000000000..75ccba327b0f76fe759fe1706480179c22a8341f
--- /dev/null
+++ b/klee-examples/examples/cc_native_add.rs
@@ -0,0 +1,22 @@
+#![no_std]
+
+#[macro_use]
+extern crate klee;
+
+use core::ptr;
+
+fn main() {
+    let u = ksymbol!("u");
+
+    unsafe {
+        ptr::read_volatile(&f2(f1(u)));
+    }
+}
+
+fn f1(u: u8) -> u8 {
+    u + 1
+}
+
+fn f2(u: u8) -> u8 {
+    100 / u
+}
diff --git a/klee-examples/examples/cc_saturating.rs b/klee-examples/examples/cc_saturating.rs
new file mode 100644
index 0000000000000000000000000000000000000000..45e561d4ef0c96a9f3cfa19438986faed03e4395
--- /dev/null
+++ b/klee-examples/examples/cc_saturating.rs
@@ -0,0 +1,23 @@
+#![no_std]
+
+#[macro_use]
+extern crate klee;
+use core::ops::Add;
+
+use core::ptr;
+
+fn main() {
+    let u = ksymbol!("u");
+
+    unsafe {
+        ptr::read_volatile(&f2(f1(u)));
+    }
+}
+
+fn f1(u: u8) -> u8 {
+    u.checked_add(1).unwrap_or(u)
+}
+
+fn f2(u: u8) -> u8 {
+    100 / u
+}
diff --git a/klee-examples/examples/cc_unchecked_div.rs b/klee-examples/examples/cc_unchecked_div.rs
new file mode 100644
index 0000000000000000000000000000000000000000..57d7c78210d105acd92da79a5d43be722e26a977
--- /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::intrinsics::unchecked_div;
+use core::ptr;
+
+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
new file mode 100644
index 0000000000000000000000000000000000000000..39d54ac57626c6dbb763ec7795f175e52d918f4e
--- /dev/null
+++ b/klee-examples/examples/cc_wrapping.rs
@@ -0,0 +1,24 @@
+#![no_std]
+#![feature(core_intrinsics)]
+
+#[macro_use]
+extern crate klee;
+
+use core::intrinsics::unchecked_div;
+use core::ptr;
+
+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 {
+    100 / u
+}
diff --git a/klee-examples/examples/path1.rs b/klee-examples/examples/path1.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e6a8334594045413c19bea14a98d692bb3d151e3
--- /dev/null
+++ b/klee-examples/examples/path1.rs
@@ -0,0 +1,30 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+use core::ptr;
+
+#[inline(never)]
+fn add(a:u32, b:u32) -> u32 {
+    a + b
+}
+
+#[no_mangle]
+fn main() {
+    let mut a : [u32; 5] = unsafe { core::mem::uninitialized()};
+    // let mut b : [u32; 5] = unsafe { core::mem::uninitialized()};
+    ksymbol!(&mut a, "a");
+    // ksymbol!(&mut b, "b");
+
+    for (i, a) in a.iter_mut().enumerate() {
+        if *a > 0 {
+            *a = a.wrapping_add(1); //  += 1; //  add(*a, 1);
+            // klee::abort();
+        }
+    }
+    // unsafe {
+    //     ptr::read_volatile(&b);
+    // }
+}
diff --git a/klee-examples/examples/scania.rs b/klee-examples/examples/scania.rs
new file mode 100644
index 0000000000000000000000000000000000000000..7fd18f0e13f47a22f801bddc5344c9ffa51d69c3
--- /dev/null
+++ b/klee-examples/examples/scania.rs
@@ -0,0 +1,20 @@
+#![no_std]
+
+#[macro_use]
+extern crate klee;
+use core::ptr;
+
+fn f1(a: i32, b: i32) -> i32 {
+    a + b + 1
+}
+
+fn f2(a: i32, b: i32) -> i32 {
+    1 + a + b
+}
+
+fn main() {
+    let a = ksymbol!("a");
+    let b = ksymbol!("b");
+
+    kassert!(f1(a, b) == f2(a, b));
+}
diff --git a/klee-examples/examples/scania1.rs b/klee-examples/examples/scania1.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b402a28122f3f02270d6c2fd7c777b08f16c5693
--- /dev/null
+++ b/klee-examples/examples/scania1.rs
@@ -0,0 +1,24 @@
+#![no_std]
+
+#[macro_use]
+extern crate klee;
+use klee::kassume;
+
+use core::ptr;
+
+fn f1(a: i32, b: i32) -> i32 {
+    let mut sum = 0;
+    for i in 0..a {
+        sum += b
+    }
+    sum
+}
+
+fn main() {
+    let a = ksymbol!("a");
+    let b = ksymbol!("b");
+
+    kassume(0 <= a);
+
+    kassert!(f1(a, b) == a * b);
+}
diff --git a/klee-examples/examples/scania2.rs b/klee-examples/examples/scania2.rs
new file mode 100644
index 0000000000000000000000000000000000000000..db6e9fe97d7a466b9bef284ac1bbc7fe67443904
--- /dev/null
+++ b/klee-examples/examples/scania2.rs
@@ -0,0 +1,58 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+use core::ptr;
+
+enum Command {
+    Start,
+    Stop,
+    Set(u8),
+}
+
+struct Ctrl {
+    running: bool,
+    gain: u8,
+}
+
+static mut STATE: Ctrl = Ctrl {
+    running: false,
+    gain: 0,
+};
+
+fn controller(cmd: Command) {
+    match cmd {
+        Command::Start => unsafe { STATE.running = true },
+        Command::Stop => unsafe { STATE.running = false },
+        Command::Set(x) => {
+            if x < 10 {
+                unsafe { STATE.gain = x }
+            }
+        }
+    }
+}
+
+fn cn(c: u8, x: u8) -> Command {
+    match c {
+        0 => Command::Start,
+        1 => Command::Stop,
+        _ => Command::Set(x),
+    }
+}
+
+#[no_mangle]
+fn main() {
+    let c = ksymbol!("c");
+    let x = ksymbol!("x");
+    let cmd = cn(c, x);
+
+    controller(cmd);
+    unsafe {
+        ptr::read_volatile(&c);
+        ptr::read_volatile(&x);
+
+        kassert!(STATE.gain < 10);
+    }
+}
diff --git a/klee-examples/examples/simple.rs b/klee-examples/examples/simple.rs
new file mode 100644
index 0000000000000000000000000000000000000000..318b9ca6890f5104ed84ef460e3e254495007e6b
--- /dev/null
+++ b/klee-examples/examples/simple.rs
@@ -0,0 +1,20 @@
+#![no_std]
+
+#[macro_use]
+extern crate klee;
+
+use core::ptr;
+
+fn main() {
+    let u: i32 = ksymbol!("u");
+    let mut x = 0;
+    if u > 10 {
+        x = 1;
+    } else if u > 5 {
+        x = 2;
+    }
+
+    unsafe {
+        ptr::read_volatile(&x);
+    }
+}
diff --git a/klee-examples/examples/static.rs b/klee-examples/examples/static.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c372fe2a3ea4b4963985e703734ba9a74f660612
--- /dev/null
+++ b/klee-examples/examples/static.rs
@@ -0,0 +1,14 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+static mut B: u32 = 0;
+
+#[no_mangle]
+fn main() {
+    ksymbol!(&mut B, "B");
+
+    let c: u32 = 0 / unsafe { B };
+}
diff --git a/klee-examples/examples/static2.rs b/klee-examples/examples/static2.rs
new file mode 100644
index 0000000000000000000000000000000000000000..36169b58856234d1f7be0965e6ca719e962b61f2
--- /dev/null
+++ b/klee-examples/examples/static2.rs
@@ -0,0 +1,14 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+static mut B: (u32, u32) = (0, 0);
+
+#[no_mangle]
+fn main() {
+    ksymbol!(&mut B, "B");
+
+    let _c = 0 / unsafe { B.1 };
+}
diff --git a/klee-examples/examples/static3.rs b/klee-examples/examples/static3.rs
new file mode 100644
index 0000000000000000000000000000000000000000..6eabf368bc97c00b6132e44d46990565a3ab678f
--- /dev/null
+++ b/klee-examples/examples/static3.rs
@@ -0,0 +1,18 @@
+#![no_std]
+#![no_main]
+
+#[macro_use]
+extern crate klee;
+
+static mut A: (u32, u32) = (1, 2);
+static mut B: (u32, u32) = (0, 0);
+
+#[no_mangle]
+fn main() {
+    unsafe {
+        ksymbol!(&mut B, "B0");
+        B.1 = 0;
+
+        let _c = 0 / (A.0 + A.1 - (B.0 + B.1));
+    }
+}
diff --git a/src/lang_items.rs b/src/lang_items.rs
index 20237d021a1955da14e29769d6183f8a4c89bae3..36ec0bd16ff5c5779e72a3136697c6e7ae3ee511 100644
--- a/src/lang_items.rs
+++ b/src/lang_items.rs
@@ -5,3 +5,6 @@ use core::panic::PanicInfo;
 fn panic(_info: &PanicInfo) -> ! {
     unsafe { intrinsics::abort() }
 }
+
+#[lang = "eh_personality"]
+extern "C" fn eh_personality() {}
diff --git a/src/lib.rs b/src/lib.rs
index 1604b36a1b1102beb2fa68f7d354b4b25f7bec57..8c193894ab15dd7da6a65a7cc8d87a27467a58d0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,7 +4,6 @@
 #![feature(core_intrinsics)]
 
 extern crate cstr_core;
-// extern crate cty;
 
 mod lang_items;
 mod ll;
@@ -16,6 +15,7 @@ use core::ffi::c_void;
 #[doc(hidden)]
 pub use cstr_core::CStr;
 
+#[inline(always)]
 pub fn abort() -> ! {
     unsafe { ll::abort() }
 }
@@ -57,13 +57,11 @@ macro_rules! ksymbol {
             $crate::CStr::from_bytes_with_nul_unchecked(concat!($name, "\0").as_bytes())
         })
     };
-    (&mut $id:ident, $name:expr) => {
-        $crate::kmksymbol(
-            unsafe { &mut $id },
-            unsafe { $crate::CStr::from_bytes_with_nul_unchecked(concat!($name, "\0").as_bytes()) }
-        )
-    }
-
+    (&mut $id:expr, $name:expr) => {
+        $crate::kmksymbol(unsafe { &mut $id }, unsafe {
+            $crate::CStr::from_bytes_with_nul_unchecked(concat!($name, "\0").as_bytes())
+        })
+    };
 }
 
 #[macro_export]
@@ -72,5 +70,5 @@ macro_rules! kassert {
         if !$e {
             $crate::abort();
         }
-    }
+    };
 }