@@ -3323,7 +3323,7 @@ pub const fn ptr_metadata<P: ptr::Pointee<Metadata = M> + ?Sized, M>(_ptr: *cons
3323
3323
&& ub_checks:: can_dereference( core:: ptr:: slice_from_raw_parts( src as * const crate :: mem:: MaybeUninit <T >, count) )
3324
3324
&& ub_checks:: can_write( core:: ptr:: slice_from_raw_parts_mut( dst, count) )
3325
3325
&& ub_checks:: is_nonoverlapping( src as * const ( ) , dst as * const ( ) , size_of:: <T >( ) , count) ) ]
3326
- #[ ensures( |_| { check_copy_untyped( src, dst, count) } ) ]
3326
+ #[ ensures( |_| { check_copy_untyped( src, dst, count) } ) ]
3327
3327
#[ cfg_attr( kani, kani:: modifies( crate :: ptr:: slice_from_raw_parts( dst, count) ) ) ]
3328
3328
pub const unsafe fn copy_nonoverlapping < T > ( src : * const T , dst : * mut T , count : usize ) {
3329
3329
extern "rust-intrinsic" {
@@ -3427,7 +3427,6 @@ pub const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: us
3427
3427
#[ inline( always) ]
3428
3428
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
3429
3429
#[ rustc_diagnostic_item = "ptr_copy" ]
3430
- // FIXME(kani): How to verify safety for types that do not implement Copy and count > 1??
3431
3430
#[ requires( !count. overflowing_mul( size_of:: <T >( ) ) . 1
3432
3431
&& ub_checks:: can_dereference( core:: ptr:: slice_from_raw_parts( src as * const crate :: mem:: MaybeUninit <T >, count) )
3433
3432
&& ub_checks:: can_write( core:: ptr:: slice_from_raw_parts_mut( dst, count) ) ) ]
@@ -3543,10 +3542,14 @@ pub const unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize) {
3543
3542
}
3544
3543
}
3545
3544
3546
- // Ensures the initialization state is preserved.
3547
- // This is used for contracts only.
3545
+ /// Return whether the initialization state is preserved.
3546
+ ///
3547
+ /// This is used for contracts only.
3548
+ /// FIXME: Change this once we add support to quantifiers.
3548
3549
#[ allow( dead_code) ]
3550
+ #[ allow( unused_variables) ]
3549
3551
fn check_copy_untyped < T > ( src : * const T , dst : * mut T , count : usize ) -> bool {
3552
+ #[ cfg( kani) ]
3550
3553
if count > 0 {
3551
3554
let byte = kani:: any_where ( | sz : & usize | * sz < size_of :: < T > ( ) ) ;
3552
3555
let elem = kani:: any_where ( | val : & usize | * val < count) ;
@@ -3557,6 +3560,8 @@ fn check_copy_untyped<T>(src: *const T, dst: *mut T, count: usize) -> bool {
3557
3560
} else {
3558
3561
true
3559
3562
}
3563
+ #[ cfg( not( kani) ) ]
3564
+ false
3560
3565
}
3561
3566
3562
3567
/// Inform Miri that a given pointer definitely has a certain alignment.
@@ -3706,7 +3711,7 @@ mod verify {
3706
3711
let mut generator = PointerGenerator :: < char , 10 > :: new ( ) ;
3707
3712
let src = generator. generate_ptr ( ) ;
3708
3713
let dst = if kani:: any ( ) {
3709
- generator. generate_ptr ( ) ;
3714
+ generator. generate_ptr ( )
3710
3715
} else {
3711
3716
PointerGenerator :: < char , 10 > :: new ( ) . generate_ptr ( )
3712
3717
} ;
@@ -3720,9 +3725,9 @@ mod verify {
3720
3725
fn check_copy_nonoverlapping ( ) {
3721
3726
let mut generator = PointerGenerator :: < char , 10 > :: new ( ) ;
3722
3727
let src = generator. generate_ptr ( ) ;
3723
- // Destination may or may not have the same precedence as src.
3728
+ // Destination may or may not have the same provenance as src.
3724
3729
let dst = if kani:: any ( ) {
3725
- generator. generate_ptr ( ) ;
3730
+ generator. generate_ptr ( )
3726
3731
} else {
3727
3732
PointerGenerator :: < char , 10 > :: new ( ) . generate_ptr ( )
3728
3733
} ;
0 commit comments