QtTest: fix UB in QSpontaneKeyEvent::setSpontaneous()

Found by UBSan:

  src/testlib/qtestspontaneevent.h:95:38: runtime error: member call on address 0x7ffc33019650 which does not point to an object of type 'QSpontaneKeyEvent' 0x7ffc33019650: note: object is of type 'QMouseEvent'
  83 2b 00 00  98 e8 fa 8e 83 2b 00 00  00 00 00 00 00 00 00 00  02 00 04 00 00 00 00 00  00 00 00 00
               ^~~~~~~~~~~~~~~~~~~~~~~
               vptr for 'QMouseEvent'

  src/testlib/qtestspontaneevent.h:95:38: runtime error: member call on address 0x7ffc330196e0 which does not point to an object of type 'QSpontaneKeyEvent' 0x7ffc330196e0: note: object is of type 'QKeyEvent'
  00 00 00 00  f8 e8 fa 8e 83 2b 00 00  00 00 00 00 00 00 00 00  07 00 04 00 00 00 00 00  00 00 00 00
               ^~~~~~~~~~~~~~~~~~~~~~~
               vptr for 'QKeyEvent'

Fix by providing setSpontaneous() on QEvent as a private function and
befriending QSpontaneKeyEvent. Make setSpontaneous() always-inline to
avoid BiC between 5.6.0 and 5.6.1.

Change-Id: Ic60d82ed6a858f4f13f41fa3d2d1db6e808896b7
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
This commit is contained in:
Marc Mutz 2016-03-05 11:31:27 +01:00
parent b8f98d9565
commit bc087db590
2 changed files with 7 additions and 9 deletions

View File

@ -317,6 +317,11 @@ private:
friend class QGraphicsView;
friend class QGraphicsScene;
friend class QGraphicsScenePrivate;
// from QtTest:
friend class QSpontaneKeyEvent;
// needs this:
Q_ALWAYS_INLINE
void setSpontaneous() { spont = true; }
};
class Q_CORE_EXPORT QTimerEvent : public QEvent

View File

@ -76,17 +76,10 @@ public:
}
#endif
// ### Qt 6: remove everything except this function:
static inline void setSpontaneous(QEvent *ev)
{
// use a union instead of a reinterpret_cast to prevent alignment warnings
union
{
QSpontaneKeyEvent *skePtr;
QEvent *evPtr;
} helper;
helper.evPtr = ev;
helper.skePtr->setSpontaneous();
ev->setSpontaneous();
}
protected: