Skip to content

Commit 54a03ef

Browse files
author
yew005
committed
Add harness generation macros for unchecked methods && Update unchecked_add harnesses
1 parent 457a2b5 commit 54a03ef

File tree

1 file changed

+52
-117
lines changed

1 file changed

+52
-117
lines changed

library/core/src/num/mod.rs

+52-117
Original file line numberDiff line numberDiff line change
@@ -1586,137 +1586,72 @@ from_str_radix_size_impl! { i32 isize, u32 usize }
15861586
#[cfg(target_pointer_width = "64")]
15871587
from_str_radix_size_impl! { i64 isize, u64 usize }
15881588

1589+
#[cfg(kani)]
15891590
#[unstable(feature = "kani", issue = "none")]
15901591
mod verify {
15911592
use super::*;
15921593

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>();
16571600

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+
}
16901605
}
16911606
}
16921607

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>();
16971614

1698-
unsafe {
1699-
num1.unchecked_add(num2);
1615+
unsafe {
1616+
num1.$method(num2);
1617+
}
1618+
}
17001619
}
17011620
}
17021621

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>();
17071627

1708-
unsafe {
1709-
num1.unchecked_add(num2);
1628+
unsafe {
1629+
num1.$method();
1630+
}
1631+
}
17101632
}
17111633
}
17121634

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);
17221657
}

0 commit comments

Comments
 (0)