@@ -165,16 +165,15 @@ impl<T> Invariant for Iter<'_, T> {
165
165
/// An iterator can be safely used if its pointer can be read for its current length.
166
166
///
167
167
/// If the type is a ZST or the encoded length is `0`, the only safety requirement is that
168
- /// its pointer is aligned (since zero-size access is always safe for aligned pointers),
169
- /// and that `self.ptr` value is less or equal to `self.end_or_len`.
168
+ /// its pointer is aligned (since zero-size access is always safe for aligned pointers).
170
169
///
171
170
/// For other cases, we need to ensure that it is safe to read the memory between
172
171
/// `self.ptr` and `self.end_or_len`.
173
172
fn is_safe ( & self ) -> bool {
174
173
let ty_size = crate :: mem:: size_of :: < T > ( ) ;
175
174
let distance = self . ptr . addr ( ) . get ( ) . abs_diff ( self . end_or_len as usize ) ;
176
175
if ty_size == 0 || distance == 0 {
177
- self . ptr . is_aligned ( ) && self . ptr . addr ( ) . get ( ) <= self . end_or_len as usize
176
+ self . ptr . is_aligned ( )
178
177
} else {
179
178
let slice_ptr: * const [ T ] =
180
179
crate :: ptr:: from_raw_parts ( self . ptr . as_ptr ( ) , distance / ty_size) ;
@@ -232,16 +231,16 @@ impl<T> Invariant for IterMut<'_, T> {
232
231
/// It must be safe to write in the memory interval between `self.ptr`
233
232
/// and `self.end_or_len`.
234
233
fn is_safe ( & self ) -> bool {
235
- let size = crate :: mem:: size_of :: < T > ( ) ;
236
- if size == 0 {
237
- self . ptr . is_aligned ( ) && self . ptr . addr ( ) . get ( ) <= self . end_or_len as usize
234
+ let ty_size = crate :: mem:: size_of :: < T > ( ) ;
235
+ let distance = self . ptr . addr ( ) . get ( ) . abs_diff ( self . end_or_len as usize ) ;
236
+ if ty_size == 0 || distance == 0 {
237
+ self . ptr . is_aligned ( )
238
238
} else {
239
- let distance = self . ptr . addr ( ) . get ( ) . abs_diff ( self . end_or_len as usize ) ;
240
- let slice_ptr: * mut [ T ] =
241
- crate :: ptr:: from_raw_parts_mut ( self . ptr . as_ptr ( ) , distance / size) ;
239
+ let slice_ptr: * const [ T ] =
240
+ crate :: ptr:: from_raw_parts ( self . ptr . as_ptr ( ) , distance / ty_size) ;
242
241
crate :: ub_checks:: same_allocation ( self . ptr . as_ptr ( ) , self . end_or_len )
243
242
&& self . ptr . addr ( ) . get ( ) <= self . end_or_len as usize
244
- && distance % size == 0
243
+ && distance % ty_size == 0
245
244
&& crate :: ub_checks:: can_dereference ( slice_ptr)
246
245
&& crate :: ub_checks:: can_write ( slice_ptr)
247
246
}
0 commit comments