Skip to content

Commit 9d26114

Browse files
committed
Fix checked_pow_i128/u128 CBMC timeout: bound exponent to avoid explosion
Same fix as saturating_pow_128: use a dedicated macro with exp <= 10 and #[kani::unwind(5)] for the 128-bit checked_pow harnesses.
1 parent b23d05f commit 9d26114

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

library/core/src/num/nonzero.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3515,15 +3515,33 @@ mod verify {
35153515
nonzero_check_checked_pow!(core::num::NonZeroI16, nonzero_check_checked_pow_i16);
35163516
nonzero_check_checked_pow!(core::num::NonZeroI32, nonzero_check_checked_pow_i32);
35173517
nonzero_check_checked_pow!(core::num::NonZeroI64, nonzero_check_checked_pow_i64);
3518-
nonzero_check_checked_pow!(core::num::NonZeroI128, nonzero_check_checked_pow_i128);
35193518
nonzero_check_checked_pow!(core::num::NonZeroIsize, nonzero_check_checked_pow_isize);
35203519
nonzero_check_checked_pow!(core::num::NonZeroU8, nonzero_check_checked_pow_u8);
35213520
nonzero_check_checked_pow!(core::num::NonZeroU16, nonzero_check_checked_pow_u16);
35223521
nonzero_check_checked_pow!(core::num::NonZeroU32, nonzero_check_checked_pow_u32);
35233522
nonzero_check_checked_pow!(core::num::NonZeroU64, nonzero_check_checked_pow_u64);
3524-
nonzero_check_checked_pow!(core::num::NonZeroU128, nonzero_check_checked_pow_u128);
35253523
nonzero_check_checked_pow!(core::num::NonZeroUsize, nonzero_check_checked_pow_usize);
35263524

3525+
// 128-bit types use a bounded exponent to avoid CBMC timeout (same reason
3526+
// as nonzero_check_saturating_pow_128): checked_pow uses binary exponentiation
3527+
// with expensive 128-bit multiplications in CBMC's bitvector encoding.
3528+
macro_rules! nonzero_check_checked_pow_128 {
3529+
($nonzero_type:ty, $harness:ident) => {
3530+
#[kani::proof]
3531+
#[kani::unwind(5)]
3532+
pub fn $harness() {
3533+
let x: $nonzero_type = kani::any();
3534+
let exp: u32 = kani::any_where(|&e| e <= 10);
3535+
if let Some(result) = x.checked_pow(exp) {
3536+
assert!(result.get() != 0);
3537+
}
3538+
}
3539+
};
3540+
}
3541+
3542+
nonzero_check_checked_pow_128!(core::num::NonZeroI128, nonzero_check_checked_pow_i128);
3543+
nonzero_check_checked_pow_128!(core::num::NonZeroU128, nonzero_check_checked_pow_u128);
3544+
35273545
macro_rules! nonzero_check_saturating_pow {
35283546
($nonzero_type:ty, $harness:ident) => {
35293547
#[kani::proof]

0 commit comments

Comments
 (0)