@@ -1605,19 +1605,39 @@ mod verify {
1605
1605
}
1606
1606
}
1607
1607
1608
+ macro_rules! generate_unchecked_mul_harness {
1609
+ ( $type: ty, $method: ident, $harness_name: ident, $min: expr, $max: expr) => {
1610
+ #[ kani:: proof_for_contract( $type:: $method) ]
1611
+ pub fn $harness_name( ) {
1612
+ let num1: $type = kani:: any( ) ;
1613
+ let num2: $type = kani:: any( ) ;
1614
+
1615
+ // Limit the values of num1 and num2 to the specified range for multiplication
1616
+ kani:: assume( num1 >= $min && num1 <= $max) ;
1617
+ kani:: assume( num2 >= $min && num2 <= $max) ;
1618
+
1619
+ unsafe {
1620
+ num1. $method( num2) ;
1621
+ }
1622
+ }
1623
+ }
1624
+ }
1625
+
1626
+
1608
1627
macro_rules! generate_unchecked_shift_harness {
1609
1628
( $type: ty, $method: ident, $harness_name: ident) => {
1610
1629
#[ kani:: proof_for_contract( $type:: $method) ]
1611
1630
pub fn $harness_name( ) {
1612
1631
let num1: $type = kani:: any:: <$type>( ) ;
1613
1632
let num2: u32 = kani:: any:: <u32 >( ) ;
1614
-
1633
+
1615
1634
unsafe {
1616
1635
num1. $method( num2) ;
1617
1636
}
1618
1637
}
1619
1638
}
1620
1639
}
1640
+
1621
1641
1622
1642
macro_rules! generate_unchecked_neg_harness {
1623
1643
( $type: ty, $method: ident, $harness_name: ident) => {
@@ -1654,4 +1674,54 @@ mod verify {
1654
1674
generate_unchecked_math_harness ! ( u64 , unchecked_add, checked_unchecked_add_u64) ;
1655
1675
generate_unchecked_math_harness ! ( u128 , unchecked_add, checked_unchecked_add_u128) ;
1656
1676
generate_unchecked_math_harness ! ( usize , unchecked_add, checked_unchecked_add_usize) ;
1677
+
1678
+ // unchecked_mul proofs
1679
+ //
1680
+ // Target types:
1681
+ // i{8,16,32,64,128, size} and u{8,16,32,64,128, size} -- 12 types in total
1682
+ //
1683
+ // Target contracts:
1684
+ // #[requires(!self.overflowing_mul(rhs).1)]
1685
+ //
1686
+ // Target function:
1687
+ // pub const unsafe fn unchecked_mul(self, rhs: Self) -> Self
1688
+ // exponential state spaces for 32,64 and 128, hence provided limited range for verification.
1689
+ generate_unchecked_math_harness ! ( i8 , unchecked_mul, checked_unchecked_mul_i8) ;
1690
+ generate_unchecked_math_harness ! ( i16 , unchecked_mul, checked_unchecked_mul_i16) ;
1691
+ generate_unchecked_mul_harness ! ( i32 , unchecked_mul, checked_unchecked_mul_i32, -10_000i32 , 10_000i32 ) ;
1692
+ generate_unchecked_mul_harness ! ( i64 , unchecked_mul, checked_unchecked_mul_i64, -1_000i64 , 1_000i64 ) ;
1693
+ generate_unchecked_mul_harness ! ( i128 , unchecked_mul, checked_unchecked_mul_i128, -1_000_000_000_000_000i128 , 1_000_000_000_000_000i128 ) ;
1694
+ generate_unchecked_mul_harness ! ( isize , unchecked_mul, checked_unchecked_mul_isize, -100_000isize , 100_000isize ) ;
1695
+ generate_unchecked_math_harness ! ( u8 , unchecked_mul, checked_unchecked_mul_u8) ;
1696
+ generate_unchecked_math_harness ! ( u16 , unchecked_mul, checked_unchecked_mul_u16) ;
1697
+ generate_unchecked_mul_harness ! ( u32 , unchecked_mul, checked_unchecked_mul_u32, 0u32 , 20_000u32 ) ;
1698
+ generate_unchecked_mul_harness ! ( u64 , unchecked_mul, checked_unchecked_mul_u64, 0u64 , 2_000u64 ) ;
1699
+ generate_unchecked_mul_harness ! ( u128 , unchecked_mul, checked_unchecked_mul_u128, 0u128 , 1_000_000_000_000_000u128 ) ;
1700
+ generate_unchecked_mul_harness ! ( usize , unchecked_mul, checked_unchecked_mul_usize, 0usize , 100_000usize ) ;
1701
+
1702
+
1703
+ // unchecked_shr proofs
1704
+ //
1705
+ // Target types:
1706
+ // i{8,16,32,64,128,size} and u{8,16,32,64,128,size} -- 12 types in total
1707
+ //
1708
+ // Target contracts:
1709
+ // #[requires(rhs < <$ActualT>::BITS)]
1710
+ //
1711
+ // Target function:
1712
+ // pub const unsafe fn unchecked_shr(self, rhs: u32) -> Self
1713
+ generate_unchecked_shift_harness ! ( i8 , unchecked_shr, checked_unchecked_shr_i8) ;
1714
+ generate_unchecked_shift_harness ! ( i16 , unchecked_shr, checked_unchecked_shr_i16) ;
1715
+ generate_unchecked_shift_harness ! ( i32 , unchecked_shr, checked_unchecked_shr_i32) ;
1716
+ generate_unchecked_shift_harness ! ( i64 , unchecked_shr, checked_unchecked_shr_i64) ;
1717
+ generate_unchecked_shift_harness ! ( i128 , unchecked_shr, checked_unchecked_shr_i128) ;
1718
+ generate_unchecked_shift_harness ! ( isize , unchecked_shr, checked_unchecked_shr_isize) ;
1719
+ generate_unchecked_shift_harness ! ( u8 , unchecked_shr, checked_unchecked_shr_u8) ;
1720
+ generate_unchecked_shift_harness ! ( u16 , unchecked_shr, checked_unchecked_shr_u16) ;
1721
+ generate_unchecked_shift_harness ! ( u32 , unchecked_shr, checked_unchecked_shr_u32) ;
1722
+ generate_unchecked_shift_harness ! ( u64 , unchecked_shr, checked_unchecked_shr_u64) ;
1723
+ generate_unchecked_shift_harness ! ( u128 , unchecked_shr, checked_unchecked_shr_u128) ;
1724
+ generate_unchecked_shift_harness ! ( usize , unchecked_shr, checked_unchecked_shr_usize) ;
1725
+ }
1726
+ }
1657
1727
}
0 commit comments