Skip to content

Commit 5e24d04

Browse files
committed
Fix copy_nonoverlapping harness
1 parent b1010dd commit 5e24d04

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

library/core/src/intrinsics.rs

+17-5
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)