@@ -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