@@ -940,6 +940,7 @@ where
940940    F :  FnMut ( & T ,  & T )  -> bool , 
941941{ 
942942    if  v. len ( )  >= 2  && is_less ( & v[ 1 ] ,  & v[ 0 ] )  { 
943+         // SAFETY: Copy tmp back even if panic, and ensure unique observation. 
943944        unsafe  { 
944945            // There are three ways to implement insertion here: 
945946            // 
@@ -992,6 +993,7 @@ where
992993
993994    impl < T >  Drop  for  InsertionHole < T >  { 
994995        fn  drop ( & mut  self )  { 
996+             // SAFETY: The caller must ensure that src and dest are correctly set. 
995997            unsafe  { 
996998                ptr:: copy_nonoverlapping ( self . src ,  self . dest ,  1 ) ; 
997999            } 
@@ -1012,6 +1014,8 @@ where
10121014{ 
10131015    let  len = v. len ( ) ; 
10141016    let  v = v. as_mut_ptr ( ) ; 
1017+ 
1018+     // SAFETY: mid and len must be in-bounds of v. 
10151019    let  ( v_mid,  v_end)  = unsafe  {  ( v. add ( mid) ,  v. add ( len) )  } ; 
10161020
10171021    // The merge process first copies the shorter run into `buf`. Then it traces the newly copied 
@@ -1035,6 +1039,8 @@ where
10351039
10361040    if  mid <= len - mid { 
10371041        // The left run is shorter. 
1042+ 
1043+         // SAFETY: buf must have enough capacity for `v[..mid]`. 
10381044        unsafe  { 
10391045            ptr:: copy_nonoverlapping ( v,  buf,  mid) ; 
10401046            hole = MergeHole  {  start :  buf,  end :  buf. add ( mid) ,  dest :  v } ; 
@@ -1048,6 +1054,8 @@ where
10481054        while  * left < hole. end  && right < v_end { 
10491055            // Consume the lesser side. 
10501056            // If equal, prefer the left run to maintain stability. 
1057+ 
1058+             // SAFETY: left and right must be valid and part of v same for out. 
10511059            unsafe  { 
10521060                let  to_copy = if  is_less ( & * right,  & * * left)  { 
10531061                    get_and_increment ( & mut  right) 
@@ -1059,6 +1067,8 @@ where
10591067        } 
10601068    }  else  { 
10611069        // The right run is shorter. 
1070+ 
1071+         // SAFETY: buf must have enough capacity for `v[mid..]`. 
10621072        unsafe  { 
10631073            ptr:: copy_nonoverlapping ( v_mid,  buf,  len - mid) ; 
10641074            hole = MergeHole  {  start :  buf,  end :  buf. add ( len - mid) ,  dest :  v_mid } ; 
@@ -1072,6 +1082,8 @@ where
10721082        while  v < * left && buf < * right { 
10731083            // Consume the greater side. 
10741084            // If equal, prefer the right run to maintain stability. 
1085+ 
1086+             // SAFETY: left and right must be valid and part of v same for out. 
10751087            unsafe  { 
10761088                let  to_copy = if  is_less ( & * right. sub ( 1 ) ,  & * left. sub ( 1 ) )  { 
10771089                    decrement_and_get ( left) 
@@ -1087,11 +1099,14 @@ where
10871099
10881100    unsafe  fn  get_and_increment < T > ( ptr :  & mut  * mut  T )  -> * mut  T  { 
10891101        let  old = * ptr; 
1102+ 
1103+         // SAFETY: ptr.add(1) must still be a valid pointer and part of `v`. 
10901104        * ptr = unsafe  {  ptr. add ( 1 )  } ; 
10911105        old
10921106    } 
10931107
10941108    unsafe  fn  decrement_and_get < T > ( ptr :  & mut  * mut  T )  -> * mut  T  { 
1109+         // SAFETY: ptr.sub(1) must still be a valid pointer and part of `v`. 
10951110        * ptr = unsafe  {  ptr. sub ( 1 )  } ; 
10961111        * ptr
10971112    } 
@@ -1105,7 +1120,7 @@ where
11051120
11061121    impl < T >  Drop  for  MergeHole < T >  { 
11071122        fn  drop ( & mut  self )  { 
1108-             // `T` is not a zero-sized type, and these are pointers into a slice's elements. 
1123+             // SAFETY:  `T` is not a zero-sized type, and these are pointers into a slice's elements. 
11091124            unsafe  { 
11101125                let  len = self . end . sub_ptr ( self . start ) ; 
11111126                ptr:: copy_nonoverlapping ( self . start ,  self . dest ,  len) ; 
@@ -1180,6 +1195,8 @@ pub fn merge_sort<T, CmpF, ElemAllocF, ElemDeallocF, RunAllocF, RunDeallocF>(
11801195        let  mut  start = end - 1 ; 
11811196        if  start > 0  { 
11821197            start -= 1 ; 
1198+ 
1199+             // SAFETY: The v.get_unchecked must be fed with correct inbound indicies. 
11831200            unsafe  { 
11841201                if  is_less ( v. get_unchecked ( start + 1 ) ,  v. get_unchecked ( start) )  { 
11851202                    while  start > 0  && is_less ( v. get_unchecked ( start) ,  v. get_unchecked ( start - 1 ) )  { 
@@ -1210,6 +1227,8 @@ pub fn merge_sort<T, CmpF, ElemAllocF, ElemDeallocF, RunAllocF, RunDeallocF>(
12101227        while  let  Some ( r)  = collapse ( runs. as_slice ( ) )  { 
12111228            let  left = runs[ r + 1 ] ; 
12121229            let  right = runs[ r] ; 
1230+             // SAFETY: `buf_ptr` must hold enough capacity for the shorter of the two sides, and 
1231+             // neither side may be on length 0. 
12131232            unsafe  { 
12141233                merge ( & mut  v[ left. start ..right. start  + right. len ] ,  left. len ,  buf_ptr,  is_less) ; 
12151234            } 
0 commit comments