@@ -437,6 +437,23 @@ impl<T> [T] {
437437#[ unstable( feature = "slice_ptr_range" ,  issue = "65807" ) ]  
438438    #[ inline]  
439439    pub  fn  as_ptr_range ( & self )  -> Range < * const  T >  { 
440+         // The `add` here is safe, because: 
441+         // 
442+         //   - Both pointers are part of the same object, as pointing directly 
443+         //     past the object also counts. 
444+         // 
445+         //   - The size of the slice is never larger than isize::MAX bytes, as 
446+         //     noted here: 
447+         //       - https://github.com/rust-lang/unsafe-code-guidelines/issues/102#issuecomment-473340447 
448+         //       - https://doc.rust-lang.org/reference/behavior-considered-undefined.html 
449+         //       - https://doc.rust-lang.org/core/slice/fn.from_raw_parts.html#safety 
450+         //     (This doesn't seem normative yet, but the very same assumption is 
451+         //     made in many places, including the Index implementation of slices.) 
452+         // 
453+         //   - There is no wrapping around involved, as slices do not wrap past 
454+         //     the end of the address space. 
455+         // 
456+         // See the documentation of pointer::add. 
440457        let  start = self . as_ptr ( ) ; 
441458        let  end = unsafe  {  start. add ( self . len ( ) )  } ; 
442459        start..end
@@ -461,6 +478,7 @@ impl<T> [T] {
461478#[ unstable( feature = "slice_ptr_range" ,  issue = "65807" ) ]  
462479    #[ inline]  
463480    pub  fn  as_mut_ptr_range ( & mut  self )  -> Range < * mut  T >  { 
481+         // See as_ptr_range() above for why `add` here is safe. 
464482        let  start = self . as_mut_ptr ( ) ; 
465483        let  end = unsafe  {  start. add ( self . len ( ) )  } ; 
466484        start..end
0 commit comments