@@ -171,6 +171,7 @@ impl<T> Invariant for Iter<'_, T> {
171
171
/// `self.ptr` and `self.end_or_len`.
172
172
fn is_safe ( & self ) -> bool {
173
173
let ty_size = crate :: mem:: size_of :: < T > ( ) ;
174
+ // Use `abs_diff` since `end_or_len` may be smaller than `ptr` if `T` is a ZST.
174
175
let distance = self . ptr . addr ( ) . get ( ) . abs_diff ( self . end_or_len as usize ) ;
175
176
if ty_size == 0 || distance == 0 {
176
177
self . ptr . is_aligned ( )
@@ -236,8 +237,8 @@ impl<T> Invariant for IterMut<'_, T> {
236
237
if ty_size == 0 || distance == 0 {
237
238
self . ptr . is_aligned ( )
238
239
} else {
239
- let slice_ptr: * const [ T ] =
240
- crate :: ptr:: from_raw_parts ( self . ptr . as_ptr ( ) , distance / ty_size) ;
240
+ let slice_ptr: * mut [ T ] =
241
+ crate :: ptr:: from_raw_parts_mut ( self . ptr . as_ptr ( ) , distance / ty_size) ;
241
242
crate :: ub_checks:: same_allocation ( self . ptr . as_ptr ( ) , self . end_or_len )
242
243
&& self . ptr . addr ( ) . get ( ) <= self . end_or_len as usize
243
244
&& distance % ty_size == 0
@@ -3525,8 +3526,8 @@ mod verify {
3525
3526
3526
3527
fn any_slice < T > ( orig_slice : & [ T ] ) -> & [ T ] {
3527
3528
if kani:: any ( ) {
3528
- let first = kani:: any_where ( |idx : & usize | * idx <= orig_slice. len ( ) ) ;
3529
- let last = kani:: any_where ( |idx : & usize | * idx >= first && * idx <= orig_slice . len ( ) ) ;
3529
+ let last = kani:: any_where ( |idx : & usize | * idx <= orig_slice. len ( ) ) ;
3530
+ let first = kani:: any_where ( |idx : & usize | * idx <= last ) ;
3530
3531
& orig_slice[ first..last]
3531
3532
} else {
3532
3533
let ptr = kani:: any_where :: < usize , _ > ( |val| * val != 0 ) as * const T ;
0 commit comments