re PR libstdc++/66327 (-fsanitize=nonnull-attribute errors in stl_algobase.h)
authorJonathan Wakely <jwakely@redhat.com>
Fri, 29 May 2015 13:28:54 +0000 (14:28 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 29 May 2015 13:28:54 +0000 (14:28 +0100)
PR libstdc++/66327
* include/bits/stl_algobase.h (__equal<true>::equal): Do not call
memcmp with null pointers.
(__lexicographical_compare<true>::__lc): Do not call memcmp for empty
ranges.

From-SVN: r223865

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h

index 286197c3f6ba903a7295ca112688455e327531b4..94c7963eea763c2a4b19584d5664c1288bc7a8e0 100644 (file)
@@ -1,3 +1,11 @@
+2015-05-29  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/66327
+       * include/bits/stl_algobase.h (__equal<true>::equal): Do not call
+       memcmp with null pointers.
+       (__lexicographical_compare<true>::__lc): Do not call memcmp for empty
+       ranges.
+
 2015-05-28  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/65352
index 409ef364da50e0e8936d749019d878ed365d651f..db065e2accda64e1dd2f34a80a2e5bdca2d640b1 100644 (file)
@@ -812,6 +812,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         static bool
         equal(const _Tp* __first1, const _Tp* __last1, const _Tp* __first2)
         {
+         if (__first1 == 0 || __first2 == 0)
+           return __first1 == __last1;
+
          return !__builtin_memcmp(__first1, __first2, sizeof(_Tp)
                                   * (__last1 - __first1));
        }
@@ -917,9 +920,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        {
          const size_t __len1 = __last1 - __first1;
          const size_t __len2 = __last2 - __first2;
-         const int __result = __builtin_memcmp(__first1, __first2,
-                                               std::min(__len1, __len2));
-         return __result != 0 ? __result < 0 : __len1 < __len2;
+         if (__len1 && __len2)
+           {
+             if (int __result = __builtin_memcmp(__first1, __first2,
+                                                 std::min(__len1, __len2)))
+               {
+                 return __result < 0;
+               }
+           }
+         return __len1 < __len2;
        }
     };