@@ -1586,137 +1586,72 @@ from_str_radix_size_impl! { i32 isize, u32 usize }
1586
1586
#[ cfg( target_pointer_width = "64" ) ]
1587
1587
from_str_radix_size_impl ! { i64 isize , u64 usize }
1588
1588
1589
+ #[ cfg( kani) ]
1589
1590
#[ unstable( feature = "kani" , issue = "none" ) ]
1590
1591
mod verify {
1591
1592
use super :: * ;
1592
1593
1593
- // `unchecked_add` proofs
1594
- //
1595
- // Target types:
1596
- // i{8,16,32,64,128, size} and u{8,16,32,64,128, size} -- 12 types in total
1597
- //
1598
- // Target contracts:
1599
- // #[requires(!self.overflowing_add(rhs).1)]
1600
- //
1601
- // Target function:
1602
- // pub const unsafe fn unchecked_add(self, rhs: Self) -> Self
1603
- #[ kani:: proof_for_contract( i8 :: unchecked_add) ]
1604
- pub fn check_unchecked_add_i8 ( ) {
1605
- let num1: i8 = kani:: any :: < i8 > ( ) ;
1606
- let num2: i8 = kani:: any :: < i8 > ( ) ;
1607
-
1608
- unsafe {
1609
- num1. unchecked_add ( num2) ;
1610
- }
1611
- }
1612
-
1613
- #[ kani:: proof_for_contract( i16 :: unchecked_add) ]
1614
- pub fn check_unchecked_add_i16 ( ) {
1615
- let num1: i16 = kani:: any :: < i16 > ( ) ;
1616
- let num2: i16 = kani:: any :: < i16 > ( ) ;
1617
-
1618
- unsafe {
1619
- num1. unchecked_add ( num2) ;
1620
- }
1621
- }
1622
-
1623
- #[ kani:: proof_for_contract( i32 :: unchecked_add) ]
1624
- pub fn check_unchecked_add_i32 ( ) {
1625
- let num1: i32 = kani:: any :: < i32 > ( ) ;
1626
- let num2: i32 = kani:: any :: < i32 > ( ) ;
1627
-
1628
- unsafe {
1629
- num1. unchecked_add ( num2) ;
1630
- }
1631
- }
1632
-
1633
- #[ kani:: proof_for_contract( i64 :: unchecked_add) ]
1634
- pub fn check_unchecked_add_i64 ( ) {
1635
- let num1: i64 = kani:: any :: < i64 > ( ) ;
1636
- let num2: i64 = kani:: any :: < i64 > ( ) ;
1637
-
1638
- unsafe {
1639
- num1. unchecked_add ( num2) ;
1640
- }
1641
- }
1642
-
1643
- #[ kani:: proof_for_contract( i128 :: unchecked_add) ]
1644
- pub fn check_unchecked_add_i128 ( ) {
1645
- let num1: i128 = kani:: any :: < i128 > ( ) ;
1646
- let num2: i128 = kani:: any :: < i128 > ( ) ;
1647
-
1648
- unsafe {
1649
- num1. unchecked_add ( num2) ;
1650
- }
1651
- }
1652
-
1653
- #[ kani:: proof_for_contract( isize :: unchecked_add) ]
1654
- pub fn check_unchecked_add_isize ( ) {
1655
- let num1: isize = kani:: any :: < isize > ( ) ;
1656
- let num2: isize = kani:: any :: < isize > ( ) ;
1594
+ macro_rules! generate_unchecked_math_harness {
1595
+ ( $type: ty, $method: ident, $harness_name: ident) => {
1596
+ #[ kani:: proof_for_contract( $type:: $method) ]
1597
+ pub fn $harness_name( ) {
1598
+ let num1: $type = kani:: any:: <$type>( ) ;
1599
+ let num2: $type = kani:: any:: <$type>( ) ;
1657
1600
1658
- unsafe {
1659
- num1. unchecked_add ( num2) ;
1660
- }
1661
- }
1662
-
1663
- #[ kani:: proof_for_contract( u8 :: unchecked_add) ]
1664
- pub fn check_unchecked_add_u8 ( ) {
1665
- let num1: u8 = kani:: any :: < u8 > ( ) ;
1666
- let num2: u8 = kani:: any :: < u8 > ( ) ;
1667
-
1668
- unsafe {
1669
- num1. unchecked_add ( num2) ;
1670
- }
1671
- }
1672
-
1673
- #[ kani:: proof_for_contract( u16 :: unchecked_add) ]
1674
- pub fn check_unchecked_add_u16 ( ) {
1675
- let num1: u16 = kani:: any :: < u16 > ( ) ;
1676
- let num2: u16 = kani:: any :: < u16 > ( ) ;
1677
-
1678
- unsafe {
1679
- num1. unchecked_add ( num2) ;
1680
- }
1681
- }
1682
-
1683
- #[ kani:: proof_for_contract( u32 :: unchecked_add) ]
1684
- pub fn check_unchecked_add_u32 ( ) {
1685
- let num1: u32 = kani:: any :: < u32 > ( ) ;
1686
- let num2: u32 = kani:: any :: < u32 > ( ) ;
1687
-
1688
- unsafe {
1689
- num1. unchecked_add ( num2) ;
1601
+ unsafe {
1602
+ num1. $method( num2) ;
1603
+ }
1604
+ }
1690
1605
}
1691
1606
}
1692
1607
1693
- #[ kani:: proof_for_contract( u64 :: unchecked_add) ]
1694
- pub fn check_unchecked_add_u64 ( ) {
1695
- let num1: u64 = kani:: any :: < u64 > ( ) ;
1696
- let num2: u64 = kani:: any :: < u64 > ( ) ;
1608
+ macro_rules! generate_unchecked_shift_harness {
1609
+ ( $type: ty, $method: ident, $harness_name: ident) => {
1610
+ #[ kani:: proof_for_contract( $type:: $method) ]
1611
+ pub fn $harness_name( ) {
1612
+ let num1: $type = kani:: any:: <$type>( ) ;
1613
+ let num2: u32 = kani:: any:: <u32 >( ) ;
1697
1614
1698
- unsafe {
1699
- num1. unchecked_add ( num2) ;
1615
+ unsafe {
1616
+ num1. $method( num2) ;
1617
+ }
1618
+ }
1700
1619
}
1701
1620
}
1702
1621
1703
- #[ kani:: proof_for_contract( u128 :: unchecked_add) ]
1704
- pub fn check_unchecked_add_u128 ( ) {
1705
- let num1: u128 = kani:: any :: < u128 > ( ) ;
1706
- let num2: u128 = kani:: any :: < u128 > ( ) ;
1622
+ macro_rules! generate_unchecked_neg_harness {
1623
+ ( $type: ty, $method: ident, $harness_name: ident) => {
1624
+ #[ kani:: proof_for_contract( $type:: $method) ]
1625
+ pub fn $harness_name( ) {
1626
+ let num1: $type = kani:: any:: <$type>( ) ;
1707
1627
1708
- unsafe {
1709
- num1. unchecked_add ( num2) ;
1628
+ unsafe {
1629
+ num1. $method( ) ;
1630
+ }
1631
+ }
1710
1632
}
1711
1633
}
1712
1634
1713
- #[ kani:: proof_for_contract( usize :: unchecked_add) ]
1714
- pub fn check_unchecked_add_usize ( ) {
1715
- let num1: usize = kani:: any :: < usize > ( ) ;
1716
- let num2: usize = kani:: any :: < usize > ( ) ;
1717
-
1718
- unsafe {
1719
- num1. unchecked_add ( num2) ;
1720
- }
1721
- }
1635
+ // `unchecked_add` proofs
1636
+ //
1637
+ // Target types:
1638
+ // i{8,16,32,64,128, size} and u{8,16,32,64,128, size} -- 12 types in total
1639
+ //
1640
+ // Target contracts:
1641
+ // #[requires(!self.overflowing_add(rhs).1)]
1642
+ //
1643
+ // Target function:
1644
+ // pub const unsafe fn unchecked_add(self, rhs: Self) -> Self
1645
+ generate_unchecked_math_harness ! ( i8 , unchecked_add, checked_unchecked_add_i8) ;
1646
+ generate_unchecked_math_harness ! ( i16 , unchecked_add, checked_unchecked_add_i16) ;
1647
+ generate_unchecked_math_harness ! ( i32 , unchecked_add, checked_unchecked_add_i32) ;
1648
+ generate_unchecked_math_harness ! ( i64 , unchecked_add, checked_unchecked_add_i64) ;
1649
+ generate_unchecked_math_harness ! ( i128 , unchecked_add, checked_unchecked_add_i128) ;
1650
+ generate_unchecked_math_harness ! ( isize , unchecked_add, checked_unchecked_add_isize) ;
1651
+ generate_unchecked_math_harness ! ( u8 , unchecked_add, checked_unchecked_add_u8) ;
1652
+ generate_unchecked_math_harness ! ( u16 , unchecked_add, checked_unchecked_add_u16) ;
1653
+ generate_unchecked_math_harness ! ( u32 , unchecked_add, checked_unchecked_add_u32) ;
1654
+ generate_unchecked_math_harness ! ( u64 , unchecked_add, checked_unchecked_add_u64) ;
1655
+ generate_unchecked_math_harness ! ( u128 , unchecked_add, checked_unchecked_add_u128) ;
1656
+ generate_unchecked_math_harness ! ( usize , unchecked_add, checked_unchecked_add_usize) ;
1722
1657
}
0 commit comments