@@ -3578,8 +3578,6 @@ mod verify {
3578
3578
use super :: * ;
3579
3579
use crate :: kani;
3580
3580
use core:: mem:: MaybeUninit ;
3581
- use core:: ptr:: addr_of_mut;
3582
- use core:: { cmp, fmt} ;
3583
3581
use kani:: { AllocationStatus , Arbitrary , ArbitraryPointer , PointerGenerator } ;
3584
3582
3585
3583
#[ kani:: proof_for_contract( typed_swap) ]
@@ -3604,9 +3602,23 @@ mod verify {
3604
3602
3605
3603
#[ kani:: proof_for_contract( copy_nonoverlapping) ]
3606
3604
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 ( ) ) }
3610
3622
}
3611
3623
3612
3624
#[ kani:: proof_for_contract( write_bytes) ]
0 commit comments