@@ -3578,8 +3578,6 @@ mod verify {
35783578 use super :: * ;
35793579 use crate :: kani;
35803580 use core:: mem:: MaybeUninit ;
3581- use core:: ptr:: addr_of_mut;
3582- use core:: { cmp, fmt} ;
35833581 use kani:: { AllocationStatus , Arbitrary , ArbitraryPointer , PointerGenerator } ;
35843582
35853583 #[ kani:: proof_for_contract( typed_swap) ]
@@ -3604,9 +3602,23 @@ mod verify {
36043602
36053603 #[ kani:: proof_for_contract( copy_nonoverlapping) ]
36063604 fn check_copy_nonoverlapping ( ) {
3607- run_with_arbitrary_ptrs :: < char > ( |src, dst| unsafe {
3608- copy_nonoverlapping ( src, dst, kani:: any ( ) )
3609- } ) ;
3605+ // Note: cannot use `ArbitraryPointer` here since it may indirectly invoke
3606+ // `copy_nonoverlapping` to initialize the memory.
3607+ // Kani contract checking thinks that call is part of the verification workflow.
3608+ let gen_any_ptr = |buf : & mut [ MaybeUninit < char > ; 100 ] | -> * mut char {
3609+ let base = buf. as_mut_ptr ( ) as * mut u8 ;
3610+ base. wrapping_add ( kani:: any_where ( |offset : & usize | * offset < 400 ) ) as * mut char
3611+ } ;
3612+ let mut buffer1 = [ MaybeUninit :: < char > :: uninit ( ) ; 100 ] ;
3613+ for i in 0 ..100 {
3614+ if kani:: any ( ) {
3615+ buffer1[ i] = MaybeUninit :: new ( kani:: any ( ) ) ;
3616+ }
3617+ }
3618+ let mut buffer2 = [ MaybeUninit :: < char > :: uninit ( ) ; 100 ] ;
3619+ let src = gen_any_ptr ( & mut buffer1) ;
3620+ let dst = if kani:: any ( ) { gen_any_ptr ( & mut buffer2) } else { gen_any_ptr ( & mut buffer1) } ;
3621+ unsafe { copy_nonoverlapping ( src, dst, kani:: any ( ) ) }
36103622 }
36113623
36123624 #[ kani:: proof_for_contract( write_bytes) ]
0 commit comments