[gcc(refs/users/guojiufu/heads/personal-branch)] libstdc++: Avoid negating a size_t [pr 94747]

Jiu Fu Guo guojiufu@gcc.gnu.org
Tue May 12 07:22:09 GMT 2020


https://gcc.gnu.org/g:e6b31fc717207565f144aaefa608344789221f07

commit e6b31fc717207565f144aaefa608344789221f07
Author: Nathan Sidwell <nathan@acm.org>
Date:   Mon May 4 10:06:40 2020 -0700

    libstdc++:  Avoid negating a size_t  [pr 94747]
    
    Although the code here is well formed, it doesn't show intent well.
    The reason checkers trigger on this is that it is a cause of real
    bugs.  So, negate a ptrdiff_t instead.
    
            * libsupc++/dyncast.cc (__dynamic_cast): Cast offsetof to
            ptrdiff_t before negation, to show intent more clearly.

Diff:
---
 libstdc++-v3/ChangeLog            |  6 ++++++
 libstdc++-v3/libsupc++/dyncast.cc | 11 ++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0624bb733dd..739ab9eeb29 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-04  Nathan Sidwell  <nathan@acm.org>
+
+	PR libstdc++/94747
+	* libsupc++/dyncast.cc (__dynamic_cast): Cast offsetof to
+	ptrdiff_t before negation, to show intent more clearly.
+
 2020-05-04  Jonathan Wakely  <jwakely@redhat.com>
 
 	PR libstdc++/94936
diff --git a/libstdc++-v3/libsupc++/dyncast.cc b/libstdc++-v3/libsupc++/dyncast.cc
index 1254471f6e8..7a5f483f9cf 100644
--- a/libstdc++-v3/libsupc++/dyncast.cc
+++ b/libstdc++-v3/libsupc++/dyncast.cc
@@ -49,8 +49,8 @@ __dynamic_cast (const void *src_ptr,    // object started from
   {
   const void *vtable = *static_cast <const void *const *> (src_ptr);
   const vtable_prefix *prefix =
-      adjust_pointer <vtable_prefix> (vtable, 
-				      -offsetof (vtable_prefix, origin));
+    (adjust_pointer <vtable_prefix>
+     (vtable,  -ptrdiff_t (offsetof (vtable_prefix, origin))));
   const void *whole_ptr =
       adjust_pointer <void> (src_ptr, prefix->whole_object);
   const __class_type_info *whole_type = prefix->whole_type;
@@ -63,8 +63,8 @@ __dynamic_cast (const void *src_ptr,    // object started from
   // segfault later trying to use a vbase offset that doesn't exist.
   const void *whole_vtable = *static_cast <const void *const *> (whole_ptr);
   const vtable_prefix *whole_prefix =
-    adjust_pointer <vtable_prefix> (whole_vtable,
-				    -offsetof (vtable_prefix, origin));
+    (adjust_pointer <vtable_prefix>
+     (whole_vtable, -ptrdiff_t (offsetof (vtable_prefix, origin))));
   if (whole_prefix->whole_type != whole_type)
     return NULL;
   
@@ -75,7 +75,8 @@ __dynamic_cast (const void *src_ptr,    // object started from
   if (contained_public_p (result.dst2src))
     // Src is known to be a public base of dst.
     return const_cast <void *> (result.dst_ptr);
-  if (contained_public_p (__class_type_info::__sub_kind (result.whole2src & result.whole2dst)))
+  if (contained_public_p (__class_type_info::__sub_kind
+			  (result.whole2src & result.whole2dst)))
     // Both src and dst are known to be public bases of whole. Found a valid
     // cross cast.
     return const_cast <void *> (result.dst_ptr);


More information about the Libstdc++-cvs mailing list