From abedf7600169b0d0b9ed016b09a162d9613bb2e6 Mon Sep 17 00:00:00 2001 From: Per <Per Lindgren> Date: Mon, 30 Dec 2019 19:00:55 +0100 Subject: [PATCH] regist_test with replay --- Cargo.toml | 8 +++++++- examples/register_test.rs | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 59f9abb..17af6d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] panic-halt = "0.2.0" -cortex-m-semihosting = "0.3.5" + vcell = "0.1.2" volatile-register = "0.2.0" @@ -14,6 +14,10 @@ volatile-register = "0.2.0" version = "0.1.3" optional = true +[dependencies.cortex-m-semihosting] +version = "0.3.5" +optional = true + [dependencies.panic-klee] git = "https://gitlab.henriktjader.com/pln/panic-klee.git" version = "0.1.0" @@ -42,6 +46,8 @@ klee-analysis = ["vcell/klee-analysis"] [profile.dev] panic = "abort" +incremental = false +lto = true [profile.release] debug = true diff --git a/examples/register_test.rs b/examples/register_test.rs index 7398740..7b11b46 100644 --- a/examples/register_test.rs +++ b/examples/register_test.rs @@ -80,6 +80,36 @@ // object 1: text: .... // // The first read gives 1, the second 2, and we hit unreacable. +// +// Showcase how individual fields can be made symbolic +// $ cargo klee --example register_test -r -k -g -v +// ... +// Reading symbols from register.replay...done. +// +// (gdb) set env KTEST_FILE=klee-last/test000001.ktest +// (gdb) run # for the generated test the program will run to end +// Starting program: /home/pln/rust/grepit/klee-examples/target/debug/examples/register_test.replay +// [Inferior 1 (process 25074) exited with code ...] +// +// (gdb) set env KTEST_FILE=klee-last/test000003.ktest +// (gdb) run # for the generated test the program will panic due to unreachable. +// // Starting program: /home/pln/rust/grepit/klee-examples/target/debug/examples/register_test.replay +// Program received signal SIGABRT, Aborted. +// 0x00007ffff7dd3f25 in raise () from /usr/lib/libc.so.6 +// (gdb) backtrace +// #0 0x00007ffff7dd3f25 in raise () from /usr/lib/libc.so.6 +// #1 0x00007ffff7dbd897 in abort () from /usr/lib/libc.so.6 +// #2 0x00005555555553db in rust_begin_unwind (_info=0x7fffffffd268) at /home/pln/.cargo/git/checkouts/panic-klee-aa8d015442188497/3b0c897/src/lib.rs:8 +// #3 0x000055555555533d in core::panicking::panic_fmt () at src/libcore/panicking.rs:139 +// #4 0x00005555555553a9 in core::panicking::panic () at src/libcore/panicking.rs:70 +// #5 0x0000555555555303 in main () at examples/register_test.rs:104 +// (gdb) frame 5 +// #5 0x0000555555555303 in main () at examples/register_test.rs:104 +// 104 unreachable!(); +// (gdb) print read_1 +// $1 = 1 +// (gdb) print read_2 +// $2 = 2 #![no_std] #![no_main] @@ -93,11 +123,13 @@ fn main() { let rw: RW<u32> = unsafe { core::mem::MaybeUninit::uninit().assume_init() }; // reading will render a symbolic value of type u32 - if rw.read() == 1 { + let read_1 = rw.read(); + if read_1 == 1 { // we emulate a write to the hardware register unsafe { rw.write(0) }; // this read is still treated as a new symbolic value of type u32 - if rw.read() == 2 { + let read_2 = rw.read(); + if read_2 == 2 { // will generate a panic!() if reached. unreachable!(); } -- GitLab