@@ -450,6 +450,12 @@ where
450
450
#[ must_use]
451
451
#[ inline]
452
452
#[ 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
+ } ) ]
453
459
pub unsafe fn from_mut_unchecked ( n : & mut T ) -> & mut Self {
454
460
match Self :: from_mut ( n) {
455
461
Some ( n) => n,
@@ -2395,6 +2401,80 @@ mod verify {
2395
2401
nonzero_check ! ( u128 , core:: num:: NonZeroU128 , nonzero_check_new_unchecked_for_u128) ;
2396
2402
nonzero_check ! ( usize , core:: num:: NonZeroUsize , nonzero_check_new_unchecked_for_usize) ;
2397
2403
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
+
2398
2478
macro_rules! nonzero_check_cmp {
2399
2479
( $nonzero_type: ty, $nonzero_check_cmp_for: ident) => {
2400
2480
#[ kani:: proof]
0 commit comments