@@ -3323,7 +3323,7 @@ pub const fn ptr_metadata<P: ptr::Pointee<Metadata = M> + ?Sized, M>(_ptr: *cons
33233323 && ub_checks:: can_dereference( core:: ptr:: slice_from_raw_parts( src as * const crate :: mem:: MaybeUninit <T >, count) )
33243324 && ub_checks:: can_write( core:: ptr:: slice_from_raw_parts_mut( dst, count) )
33253325 && 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) } ) ]
33273327#[ cfg_attr( kani, kani:: modifies( crate :: ptr:: slice_from_raw_parts( dst, count) ) ) ]
33283328pub const unsafe fn copy_nonoverlapping < T > ( src : * const T , dst : * mut T , count : usize ) {
33293329 extern "rust-intrinsic" {
@@ -3427,7 +3427,6 @@ pub const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: us
34273427#[ inline( always) ]
34283428#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
34293429#[ rustc_diagnostic_item = "ptr_copy" ]
3430- // FIXME(kani): How to verify safety for types that do not implement Copy and count > 1??
34313430#[ requires( !count. overflowing_mul( size_of:: <T >( ) ) . 1
34323431 && ub_checks:: can_dereference( core:: ptr:: slice_from_raw_parts( src as * const crate :: mem:: MaybeUninit <T >, count) )
34333432 && 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) {
35433542 }
35443543}
35453544
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.
35483549#[ allow( dead_code) ]
3550+ #[ allow( unused_variables) ]
35493551fn check_copy_untyped < T > ( src : * const T , dst : * mut T , count : usize ) -> bool {
3552+ #[ cfg( kani) ]
35503553 if count > 0 {
35513554 let byte = kani:: any_where ( | sz : & usize | * sz < size_of :: < T > ( ) ) ;
35523555 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 {
35573560 } else {
35583561 true
35593562 }
3563+ #[ cfg( not( kani) ) ]
3564+ false
35603565}
35613566
35623567/// Inform Miri that a given pointer definitely has a certain alignment.
@@ -3706,7 +3711,7 @@ mod verify {
37063711 let mut generator = PointerGenerator :: < char , 10 > :: new ( ) ;
37073712 let src = generator. generate_ptr ( ) ;
37083713 let dst = if kani:: any ( ) {
3709- generator. generate_ptr ( ) ;
3714+ generator. generate_ptr ( )
37103715 } else {
37113716 PointerGenerator :: < char , 10 > :: new ( ) . generate_ptr ( )
37123717 } ;
@@ -3720,9 +3725,9 @@ mod verify {
37203725 fn check_copy_nonoverlapping ( ) {
37213726 let mut generator = PointerGenerator :: < char , 10 > :: new ( ) ;
37223727 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.
37243729 let dst = if kani:: any ( ) {
3725- generator. generate_ptr ( ) ;
3730+ generator. generate_ptr ( )
37263731 } else {
37273732 PointerGenerator :: < char , 10 > :: new ( ) . generate_ptr ( )
37283733 } ;
0 commit comments