@@ -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