PR libstdc++/66327
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 May 2015 13:28:54 +0000 (13:28 +0000)
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 May 2015 13:28:54 +0000 (13:28 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@223865 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 286197c..94c7963 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 409ef36..db065e2 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;
        }
     };