QCoreApplication: enforce non-null arguments when sending/posting events
Passing nullptr as receiver and/or as an event parameter to sendEvent, postEvent, etc. is meaningless. It's also something that users can check for. Therefore, it should not be allowed. Note that the current code already relies on the arguments not to be null, albeit "indirectly" (e.g. they get dereferenced without any null checks). Hence: add asserts that check for non-null in all the relevant codepaths, except for the ones in which there's currently just a warning; for those, add a Qt 7 note. Change-Id: Ia4c58551de88a5d1003f09efa448c1330b6cb122 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
parent
0cea6384ae
commit
d8fd2425fb
@ -1133,6 +1133,9 @@ bool QCoreApplication::forwardEvent(QObject *receiver, QEvent *event, QEvent *or
|
|||||||
|
|
||||||
bool QCoreApplication::notify(QObject *receiver, QEvent *event)
|
bool QCoreApplication::notify(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(receiver);
|
||||||
|
Q_ASSERT(event);
|
||||||
|
|
||||||
// no events are delivered after ~QCoreApplication() has started
|
// no events are delivered after ~QCoreApplication() has started
|
||||||
if (QCoreApplicationPrivate::is_app_closing)
|
if (QCoreApplicationPrivate::is_app_closing)
|
||||||
return true;
|
return true;
|
||||||
@ -1141,6 +1144,9 @@ bool QCoreApplication::notify(QObject *receiver, QEvent *event)
|
|||||||
|
|
||||||
static bool doNotify(QObject *receiver, QEvent *event)
|
static bool doNotify(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT(event);
|
||||||
|
|
||||||
|
// ### Qt 7: turn into an assert
|
||||||
if (receiver == nullptr) { // serious error
|
if (receiver == nullptr) { // serious error
|
||||||
qWarning("QCoreApplication::notify: Unexpected null receiver");
|
qWarning("QCoreApplication::notify: Unexpected null receiver");
|
||||||
return true;
|
return true;
|
||||||
@ -1464,10 +1470,12 @@ void QCoreApplication::exit(int returnCode)
|
|||||||
*/
|
*/
|
||||||
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
|
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT_X(receiver, "QCoreApplication::sendEvent", "Unexpected null receiver");
|
||||||
|
Q_ASSERT_X(event, "QCoreApplication::sendEvent", "Unexpected null event");
|
||||||
|
|
||||||
Q_TRACE(QCoreApplication_sendEvent, receiver, event, event->type());
|
Q_TRACE(QCoreApplication_sendEvent, receiver, event, event->type());
|
||||||
|
|
||||||
if (event)
|
event->m_spont = false;
|
||||||
event->m_spont = false;
|
|
||||||
return notifyInternal2(receiver, event);
|
return notifyInternal2(receiver, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1476,10 +1484,12 @@ bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
|
|||||||
*/
|
*/
|
||||||
bool QCoreApplication::sendSpontaneousEvent(QObject *receiver, QEvent *event)
|
bool QCoreApplication::sendSpontaneousEvent(QObject *receiver, QEvent *event)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT_X(receiver, "QCoreApplication::sendSpontaneousEvent", "Unexpected null receiver");
|
||||||
|
Q_ASSERT_X(event, "QCoreApplication::sendSpontaneousEvent", "Unexpected null event");
|
||||||
|
|
||||||
Q_TRACE(QCoreApplication_sendSpontaneousEvent, receiver, event, event->type());
|
Q_TRACE(QCoreApplication_sendSpontaneousEvent, receiver, event, event->type());
|
||||||
|
|
||||||
if (event)
|
event->m_spont = true;
|
||||||
event->m_spont = true;
|
|
||||||
return notifyInternal2(receiver, event);
|
return notifyInternal2(receiver, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1544,8 +1554,11 @@ QCoreApplicationPrivate::QPostEventListLocker QCoreApplicationPrivate::lockThrea
|
|||||||
*/
|
*/
|
||||||
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
|
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
|
||||||
{
|
{
|
||||||
|
Q_ASSERT_X(event, "QCoreApplication::postEvent", "Unexpected null event");
|
||||||
|
|
||||||
Q_TRACE_SCOPE(QCoreApplication_postEvent, receiver, event, event->type());
|
Q_TRACE_SCOPE(QCoreApplication_postEvent, receiver, event, event->type());
|
||||||
|
|
||||||
|
// ### Qt 7: turn into an assert
|
||||||
if (receiver == nullptr) {
|
if (receiver == nullptr) {
|
||||||
qWarning("QCoreApplication::postEvent: Unexpected null receiver");
|
qWarning("QCoreApplication::postEvent: Unexpected null receiver");
|
||||||
delete event;
|
delete event;
|
||||||
@ -1615,11 +1628,11 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
|
|||||||
*/
|
*/
|
||||||
bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventList *postedEvents)
|
bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEventList *postedEvents)
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
Q_ASSERT(event);
|
Q_ASSERT(event);
|
||||||
Q_ASSERT(receiver);
|
Q_ASSERT(receiver);
|
||||||
Q_ASSERT(postedEvents);
|
Q_ASSERT(postedEvents);
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
// compress posted timers to this object.
|
// compress posted timers to this object.
|
||||||
if (event->type() == QEvent::Timer && receiver->d_func()->postedEvents > 0) {
|
if (event->type() == QEvent::Timer && receiver->d_func()->postedEvents > 0) {
|
||||||
int timerId = ((QTimerEvent *) event)->timerId();
|
int timerId = ((QTimerEvent *) event)->timerId();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user