QList: make QListSpecialMethods dtors protected

QList publicly inherits from QListSpecialMethods. Thus, any specialisation
of QListSpecialMethods should make their destructor protected, to avoid
deletion through a pointer to QListSpecialMethods invoking UB.

Change-Id: I7e317606f84826cc0faf1bfc05dee97da6eaf2eb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Marc Mutz 2015-04-15 11:31:20 +02:00
parent aea74dcaee
commit 198190b76b
3 changed files with 14 additions and 1 deletions

View File

@ -55,6 +55,10 @@ class QByteArrayList : public QList<QByteArray>
template <> struct QListSpecialMethods<QByteArray> template <> struct QListSpecialMethods<QByteArray>
#endif #endif
{ {
#ifndef Q_QDOC
protected:
~QListSpecialMethods() {}
#endif
public: public:
inline QByteArray join() const inline QByteArray join() const
{ return QtPrivate::QByteArrayList_join(self(), 0, 0); } { return QtPrivate::QByteArrayList_join(self(), 0, 0); }

View File

@ -62,8 +62,13 @@ QT_BEGIN_NAMESPACE
template <typename T> class QVector; template <typename T> class QVector;
template <typename T> class QSet; template <typename T> class QSet;
template <typename T> struct QListSpecialMethods { }; template <typename T> struct QListSpecialMethods
{
protected:
~QListSpecialMethods() {}
};
template <> struct QListSpecialMethods<QByteArray>; template <> struct QListSpecialMethods<QByteArray>;
template <> struct QListSpecialMethods<QString>;
struct Q_CORE_EXPORT QListData { struct Q_CORE_EXPORT QListData {
// tags for tag-dispatching of QList implementations, // tags for tag-dispatching of QList implementations,

View File

@ -57,6 +57,10 @@ class QStringList : public QList<QString>
template <> struct QListSpecialMethods<QString> template <> struct QListSpecialMethods<QString>
#endif #endif
{ {
#ifndef Q_QDOC
protected:
~QListSpecialMethods() {}
#endif
public: public:
inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive); inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive);
inline int removeDuplicates(); inline int removeDuplicates();