Skip to content

Commit 1c4ea17

Browse files
authored
Add contracts for NonZero::from_mut_unchecked (#345)
Contract can now be expressed as model-checking/kani#4151 has been merged. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 and MIT licenses.
1 parent fca4586 commit 1c4ea17

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

library/core/src/num/nonzero.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,12 @@ where
450450
#[must_use]
451451
#[inline]
452452
#[track_caller]
453+
#[requires({
454+
let size = core::mem::size_of::<T>();
455+
let ptr = n as *const T as *const u8;
456+
let slice = unsafe { core::slice::from_raw_parts(ptr, size) };
457+
!slice.iter().all(|&byte| byte == 0)
458+
})]
453459
pub unsafe fn from_mut_unchecked(n: &mut T) -> &mut Self {
454460
match Self::from_mut(n) {
455461
Some(n) => n,
@@ -2395,6 +2401,80 @@ mod verify {
23952401
nonzero_check!(u128, core::num::NonZeroU128, nonzero_check_new_unchecked_for_u128);
23962402
nonzero_check!(usize, core::num::NonZeroUsize, nonzero_check_new_unchecked_for_usize);
23972403

2404+
macro_rules! nonzero_check_from_mut_unchecked {
2405+
($t:ty, $nonzero_type:ty, $harness_name:ident) => {
2406+
#[kani::proof_for_contract(NonZero::<$t>::from_mut_unchecked)]
2407+
pub fn $harness_name() {
2408+
let mut x: $t = kani::any();
2409+
unsafe {
2410+
<$nonzero_type>::from_mut_unchecked(&mut x);
2411+
}
2412+
}
2413+
};
2414+
}
2415+
2416+
// Generate harnesses for multiple types
2417+
nonzero_check_from_mut_unchecked!(
2418+
i8,
2419+
core::num::NonZeroI8,
2420+
nonzero_check_from_mut_unchecked_i8
2421+
);
2422+
nonzero_check_from_mut_unchecked!(
2423+
i16,
2424+
core::num::NonZeroI16,
2425+
nonzero_check_from_mut_unchecked_i16
2426+
);
2427+
nonzero_check_from_mut_unchecked!(
2428+
i32,
2429+
core::num::NonZeroI32,
2430+
nonzero_check_from_mut_unchecked_i32
2431+
);
2432+
nonzero_check_from_mut_unchecked!(
2433+
i64,
2434+
core::num::NonZeroI64,
2435+
nonzero_check_from_mut_unchecked_i64
2436+
);
2437+
nonzero_check_from_mut_unchecked!(
2438+
i128,
2439+
core::num::NonZeroI128,
2440+
nonzero_check_from_mut_unchecked_i128
2441+
);
2442+
nonzero_check_from_mut_unchecked!(
2443+
isize,
2444+
core::num::NonZeroIsize,
2445+
nonzero_check_from_mut_unchecked_isize
2446+
);
2447+
nonzero_check_from_mut_unchecked!(
2448+
u8,
2449+
core::num::NonZeroU8,
2450+
nonzero_check_from_mut_unchecked_u8
2451+
);
2452+
nonzero_check_from_mut_unchecked!(
2453+
u16,
2454+
core::num::NonZeroU16,
2455+
nonzero_check_from_mut_unchecked_u16
2456+
);
2457+
nonzero_check_from_mut_unchecked!(
2458+
u32,
2459+
core::num::NonZeroU32,
2460+
nonzero_check_from_mut_unchecked_u32
2461+
);
2462+
nonzero_check_from_mut_unchecked!(
2463+
u64,
2464+
core::num::NonZeroU64,
2465+
nonzero_check_from_mut_unchecked_u64
2466+
);
2467+
nonzero_check_from_mut_unchecked!(
2468+
u128,
2469+
core::num::NonZeroU128,
2470+
nonzero_check_from_mut_unchecked_u128
2471+
);
2472+
nonzero_check_from_mut_unchecked!(
2473+
usize,
2474+
core::num::NonZeroUsize,
2475+
nonzero_check_from_mut_unchecked_usize
2476+
);
2477+
23982478
macro_rules! nonzero_check_cmp {
23992479
($nonzero_type:ty, $nonzero_check_cmp_for:ident) => {
24002480
#[kani::proof]

0 commit comments

Comments
 (0)