diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2017-09-12 11:42:23 +0100 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2017-09-17 11:41:40 +0000 |
commit | 81a19050d8127e7b05006f793a8797c8f5248191 (patch) | |
tree | 52805101e833950394df8139b8b2cc1c648526c5 /src/corelib/tools/qsharedpointer_impl.h | |
parent | 2740b9d66819cb44a596644eb5fbb956ffe39b86 (diff) |
QSharedPointer: fix undefined behavior in operator<
Pointers belonging to different arrays must be compared using
std::less.
Change-Id: Ib77af7b1b2da58d7243fa77273a8a45ee9035a1a
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qsharedpointer_impl.h')
-rw-r--r-- | src/corelib/tools/qsharedpointer_impl.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 15573c5588..ede54c155d 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -850,17 +850,20 @@ Q_INLINE_TEMPLATE typename QSharedPointer<X>::difference_type operator-(T *ptr1, template <class T, class X> Q_INLINE_TEMPLATE bool operator<(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) { - return ptr1.data() < ptr2.data(); + using CT = typename std::common_type<T *, X *>::type; + return std::less<CT>()(ptr1.data(), ptr2.data()); } template <class T, class X> Q_INLINE_TEMPLATE bool operator<(const QSharedPointer<T> &ptr1, X *ptr2) { - return ptr1.data() < ptr2; + using CT = typename std::common_type<T *, X *>::type; + return std::less<CT>()(ptr1.data(), ptr2); } template <class T, class X> Q_INLINE_TEMPLATE bool operator<(T *ptr1, const QSharedPointer<X> &ptr2) { - return ptr1 < ptr2.data(); + using CT = typename std::common_type<T *, X *>::type; + return std::less<CT>()(ptr1, ptr2.data()); } // |