Skip to content

Commit b6b7b89

Browse files
author
AlexLB99
committed
fixed failure causes
1 parent 1645d00 commit b6b7b89

1 file changed

Lines changed: 48 additions & 6 deletions

File tree

  • library/core/src/intrinsics

library/core/src/intrinsics/mod.rs

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4368,30 +4368,30 @@ mod verify {
43684368
#[kani::stub_verified(transmute_unchecked_wrapper)]
43694369
fn should_succeed_u8_to_bool() {
43704370
let src: u8 = kani::any_where(|x| *x <= 1);
4371-
let dst: char = unsafe { transmute_unchecked_wrapper(src) };
4371+
let dst: bool = unsafe { transmute_unchecked_wrapper(src) };
43724372
}
43734373

43744374
#[kani::proof]
43754375
#[kani::stub_verified(transmute_unchecked_wrapper)]
43764376
#[kani::should_panic]
43774377
fn should_fail_u8_to_bool() {
43784378
let src: u8 = kani::any_where(|x| *x > 1);
4379-
let dst: char = unsafe { transmute_unchecked_wrapper(src) };
4379+
let dst: bool = unsafe { transmute_unchecked_wrapper(src) };
43804380
}
43814381

43824382
#[kani::proof]
43834383
#[kani::stub_verified(transmute_unchecked_wrapper)]
43844384
fn should_succeed_i8_to_bool() {
43854385
let src: u8 = kani::any_where(|x| *x as u8 <= 1);
4386-
let dst: char = unsafe { transmute_unchecked_wrapper(src) };
4386+
let dst: bool = unsafe { transmute_unchecked_wrapper(src) };
43874387
}
43884388

43894389
#[kani::proof]
43904390
#[kani::stub_verified(transmute_unchecked_wrapper)]
43914391
#[kani::should_panic]
43924392
fn should_fail_i8_to_bool() {
43934393
let src: u8 = kani::any_where(|x| *x as u8 > 1);
4394-
let dst: char = unsafe { transmute_unchecked_wrapper(src) };
4394+
let dst: bool = unsafe { transmute_unchecked_wrapper(src) };
43954395
}
43964396

43974397
//The following harnesses do the same as above, but for compound types
@@ -4442,18 +4442,60 @@ mod verify {
44424442
#[kani::proof]
44434443
#[kani::stub_verified(transmute_unchecked_wrapper)]
44444444
fn should_succeed_tuple_to_array() {
4445-
let src: (u8, u8) = (kani::any(), kani::any_where(|x| *x <= 1));
4445+
let src: (u8, u8) = (kani::any_where(|x| *x <= 1), kani::any_where(|x| *x <= 1));
44464446
let dst: [bool; 2] = unsafe { transmute_unchecked_wrapper(src) };
44474447
}
44484448

44494449
#[kani::proof]
44504450
#[kani::stub_verified(transmute_unchecked_wrapper)]
44514451
#[kani::should_panic]
44524452
fn should_fail_tuple_to_array() {
4453-
let src: (u8, u8) = (kani::any(), kani::any_where(|x| *x > 1));
4453+
let src: (u8, u8) = (kani::any_where(|x| *x > 1), kani::any_where(|x| *x > 1));
44544454
let dst: [bool; 2] = unsafe { transmute_unchecked_wrapper(src) };
44554455
}
44564456

4457+
//generates should_succeed harnesses when the output type has no possible invalid values, like ints
4458+
macro_rules! should_succeed_no_validity_reqs {
4459+
($harness:ident, $src:ty, $dst:ty) => {
4460+
#[kani::proof]
4461+
#[kani::stub_verified(transmute_unchecked_wrapper)]
4462+
fn $harness() {
4463+
let src: $src = kani::any();
4464+
let dst: $dst = unsafe { transmute_unchecked_wrapper(src) };
4465+
}
4466+
};
4467+
}
4468+
4469+
//call the above macro for all combinations of primitives where the output value cannot be invalid
4470+
//transmute between 1-byte primitives
4471+
should_succeed_no_validity_reqs!(should_succeed_i8_to_u8, i8, u8);
4472+
should_succeed_no_validity_reqs!(should_succeed_u8_to_i8, u8, i8);
4473+
should_succeed_no_validity_reqs!(should_succeed_bool_to_i8, bool, i8);
4474+
should_succeed_no_validity_reqs!(should_succeed_bool_to_u8, bool, u8);
4475+
//transmute between 2-byte primitives
4476+
should_succeed_no_validity_reqs!(should_succeed_i16_to_u16, i16, u16);
4477+
should_succeed_no_validity_reqs!(should_succeed_u16_to_i16, u16, i16);
4478+
//transmute between 4-byte primitives
4479+
should_succeed_no_validity_reqs!(should_succeed_i32_to_u32, i32, u32);
4480+
should_succeed_no_validity_reqs!(should_succeed_i32_to_f32, i32, f32);
4481+
should_succeed_no_validity_reqs!(should_succeed_u32_to_i32, u32, i32);
4482+
should_succeed_no_validity_reqs!(should_succeed_u32_to_f32, u32, f32);
4483+
should_succeed_no_validity_reqs!(should_succeed_char_to_i32, char, i32);
4484+
should_succeed_no_validity_reqs!(should_succeed_char_to_u32, char, u32);
4485+
should_succeed_no_validity_reqs!(should_succeed_char_to_f32, char, f32);
4486+
should_succeed_no_validity_reqs!(should_succeed_f32_to_i32, f32, i32);
4487+
should_succeed_no_validity_reqs!(should_succeed_f32_to_u32, f32, u32);
4488+
//transmute between 8-byte primitives
4489+
should_succeed_no_validity_reqs!(should_succeed_i64_to_u64, i64, u64);
4490+
should_succeed_no_validity_reqs!(should_succeed_i64_to_f64, i64, f64);
4491+
should_succeed_no_validity_reqs!(should_succeed_u64_to_i64, u64, i64);
4492+
should_succeed_no_validity_reqs!(should_succeed_u64_to_f64, u64, f64);
4493+
should_succeed_no_validity_reqs!(should_succeed_f64_to_i64, f64, i64);
4494+
should_succeed_no_validity_reqs!(should_succeed_f64_to_u64, f64, u64);
4495+
//transmute between 16-byte primitives
4496+
should_succeed_no_validity_reqs!(should_succeed_i128_to_u128, i128, u128);
4497+
should_succeed_no_validity_reqs!(should_succeed_u128_to_i128, u128, i128);
4498+
44574499
//Note: the following harness fails when it in theory should not
44584500
//The problem is that ub_checks::can_dereference(), used in a validity precondition
44594501
//for transmute_unchecked_wrapper, doesn't catch references that refer to invalid values.

0 commit comments

Comments
 (0)