Skip to content

Commit b6a748d

Browse files
authored
feat: make kani::any::<bool>() non-det bit pattern more intuitive (rust-lang#1539)
* feat: update any bool func * tests: added more paths to exe-trace tests that use bool
1 parent 787ef7f commit b6a748d

File tree

7 files changed

+22
-19
lines changed

7 files changed

+22
-19
lines changed

library/kani/src/arbitrary.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ impl Arbitrary for bool {
4949
#[inline(always)]
5050
fn any() -> Self {
5151
let byte = u8::any();
52-
byte == 0
52+
crate::assume(byte < 2);
53+
byte == 1
5354
}
5455
}
5556

tests/ui/exe-trace/bool/expected

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ Executable trace
66
fn kani_exe_trace_harness
77
let det_vals: Vec<Vec<u8>> = vec![
88
// 0
9-
vec![0
9+
vec![0],
10+
// 1
11+
vec![1]
1012
];
1113
kani::exe_trace_run(det_vals, harness);
1214
}

tests/ui/exe-trace/bool/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
// kani-flags: --harness harness --enable-unstable --gen-exe-trace
55

6-
/// Note: We can't test a false value yet because any::<bool>() could be any non-zero number.
76
#[kani::proof]
87
pub fn harness() {
98
let bool_1: bool = kani::any();
10-
assert!(bool_1 != true);
9+
let bool_2: bool = kani::any();
10+
assert!(!(!bool_1 && bool_2));
1111
}

tests/ui/exe-trace/option/expected

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ Executable trace
55
#[test]
66
fn kani_exe_trace_harness
77
let det_vals: Vec<Vec<u8>> = vec![
8-
// 0
9-
vec![0],
8+
// 1
9+
vec![1],
1010
// 101
11-
vec![101]
11+
vec![101],
12+
// 0
13+
vec![0]
1214
];
1315
kani::exe_trace_run(det_vals, harness);
1416
}

tests/ui/exe-trace/option/main.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@
33

44
// kani-flags: --harness harness --enable-unstable --gen-exe-trace
55

6-
/// This should generate 2 bools.
7-
/// The first should be 0 because the Option type is Some.
8-
/// The second should be 101, the inner value of the Some.
9-
/// Note: We can't test on a None type yet because the first any::<bool>() could be any non-zero number.
106
#[kani::proof]
117
pub fn harness() {
128
let option_1: Option<u8> = kani::any();
13-
assert!(option_1 != Some(101));
9+
let option_2: Option<u8> = kani::any();
10+
assert!(!(option_1 == Some(101) && option_2 == None));
1411
}

tests/ui/exe-trace/result/expected

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ Executable trace
55
#[test]
66
fn kani_exe_trace_harness
77
let det_vals: Vec<Vec<u8>> = vec![
8+
// 1
9+
vec![1],
10+
// 101
11+
vec![101],
812
// 0
913
vec![0],
10-
// 101
11-
vec![101]
14+
// 102
15+
vec![102]
1216
];
1317
kani::exe_trace_run(det_vals, harness);
1418
}

tests/ui/exe-trace/result/main.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@
33

44
// kani-flags: --harness harness --enable-unstable --gen-exe-trace
55

6-
/// This should generate 2 bools.
7-
/// The first should be 0 because the Result type is Ok.
8-
/// The second should be 101, the inner value of the Ok.
9-
/// Note: We can't test an Err type yet because the first any::<bool>() could be any non-zero number.
106
#[kani::proof]
117
pub fn harness() {
128
let result_1: Result<u8, u8> = kani::any();
13-
assert!(result_1 != Ok(101));
9+
let result_2: Result<u8, u8> = kani::any();
10+
assert!(!(result_1 == Ok(101) && result_2 == Err(102)));
1411
}

0 commit comments

Comments
 (0)