@@ -272,6 +272,25 @@ impl<T> Ptr<T> {
272272 }
273273 }
274274
275+ #[ inline]
276+ pub fn is_empty ( & self ) -> bool {
277+ match self . kind {
278+ PtrKind :: Null => true ,
279+ PtrKind :: StackSingle ( _) | PtrKind :: HeapSingle ( _) => false ,
280+ PtrKind :: Vec ( ref weak) => weak
281+ . upgrade ( )
282+ . expect ( "ub: dangling pointer" )
283+ . borrow ( )
284+ . is_empty ( ) ,
285+ PtrKind :: StackArray ( ref weak) | PtrKind :: HeapArray ( ref weak) => weak
286+ . upgrade ( )
287+ . expect ( "ub: dangling pointer" )
288+ . borrow ( )
289+ . is_empty ( ) ,
290+ PtrKind :: Reinterpreted ( ref data) => self . offset >= data. total_byte_len ( ) ,
291+ }
292+ }
293+
275294 #[ inline]
276295 pub fn offset ( & self , offset : isize ) -> Self {
277296 let step = self . elem_step ( ) ;
@@ -660,7 +679,9 @@ impl<T> std::ops::AddAssign<u64> for Ptr<T> {
660679 #[ inline]
661680 fn add_assign ( & mut self , other : u64 ) {
662681 let step = self . elem_step ( ) ;
663- self . offset = self . offset . wrapping_add ( ( other as usize ) * step) ;
682+ self . offset = self
683+ . offset
684+ . wrapping_add ( ( other as usize ) . wrapping_mul ( step) ) ;
664685 }
665686}
666687
@@ -670,23 +691,27 @@ impl<T> std::ops::AddAssign<i32> for Ptr<T> {
670691 let step = self . elem_step ( ) ;
671692 self . offset = self
672693 . offset
673- . wrapping_add ( ( ( other as isize ) * step as isize ) as usize ) ;
694+ . wrapping_add ( ( ( other as isize ) . wrapping_mul ( step as isize ) ) as usize ) ;
674695 }
675696}
676697
677698impl < T > std:: ops:: AddAssign < u32 > for Ptr < T > {
678699 #[ inline]
679700 fn add_assign ( & mut self , other : u32 ) {
680701 let step = self . elem_step ( ) ;
681- self . offset = self . offset . wrapping_add ( ( other as usize ) * step) ;
702+ self . offset = self
703+ . offset
704+ . wrapping_add ( ( other as usize ) . wrapping_mul ( step) ) ;
682705 }
683706}
684707
685708impl < T > std:: ops:: AddAssign < isize > for Ptr < T > {
686709 #[ inline]
687710 fn add_assign ( & mut self , other : isize ) {
688711 let step = self . elem_step ( ) ;
689- self . offset = self . offset . wrapping_add ( ( other * step as isize ) as usize ) ;
712+ self . offset = self
713+ . offset
714+ . wrapping_add ( ( other. wrapping_mul ( step as isize ) ) as usize ) ;
690715 }
691716}
692717
@@ -900,6 +925,7 @@ thread_local! {
900925}
901926
902927impl Ptr < u8 > {
928+ #[ allow( clippy:: explicit_counter_loop) ]
903929 pub fn memcpy ( & self , src : & Self , len : usize ) {
904930 let mut dst = self . clone ( ) ;
905931 let mut i: usize = 0 ;
@@ -914,6 +940,7 @@ impl Ptr<u8> {
914940 assert_eq ! ( i, len, "ub: memcpy" ) ;
915941 }
916942
943+ #[ allow( clippy:: explicit_counter_loop) ]
917944 pub fn memset ( & self , value : u8 , num : usize ) {
918945 let mut dst = self . clone ( ) ;
919946 for _ in 0 ..num {
@@ -922,6 +949,7 @@ impl Ptr<u8> {
922949 }
923950 }
924951
952+ #[ allow( clippy:: explicit_counter_loop) ]
925953 pub fn memcmp ( & self , other : & Self , len : usize ) -> i32 {
926954 let mut a = self . clone ( ) ;
927955 let mut b = other. clone ( ) ;
0 commit comments