QSignalSpy: separate messages for invalid and non-signal meta-methods

If a signal was invalid, the code still called messageSignature(),
which returns a null QByteArray, and passed its constData() to
qWarning("%s"). That probably worked in our implementation, because it
falls back to QString::asprintf(), but it raised eyebrows, so avoid
calling messageSignature() on invalid QMetaMethod.

This changes the warning output, so adjust the test.

Task-number: QTBUG-123544
Change-Id: I41bc6650de091f61354ff91ee45659668f0e0223
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Marc Mutz 2024-03-21 22:47:33 +01:00
parent fa5cb84069
commit d2dbe2d7f7
2 changed files with 12 additions and 13 deletions

View File

@ -71,13 +71,7 @@ private:
if (!isObjectValid(obj)) if (!isObjectValid(obj))
return {}; return {};
if (!signal0) { return verify(obj, QMetaMethod::fromSignal(signal0));
qWarning("QSignalSpy: Null signal pointer is not valid");
return {};
}
const QMetaMethod signalMetaMethod = QMetaMethod::fromSignal(signal0);
return verify(obj, signalMetaMethod);
} }
public: public:
#endif // Q_QDOC #endif // Q_QDOC
@ -157,12 +151,17 @@ private:
static bool isSignalMetaMethodValid(const QMetaMethod &signal) static bool isSignalMetaMethodValid(const QMetaMethod &signal)
{ {
const bool valid = signal.isValid() && signal.methodType() == QMetaMethod::Signal; if (!signal.isValid()) {
qWarning("QSignalSpy: Null signal is not valid");
return false;
}
if (!valid) if (signal.methodType() != QMetaMethod::Signal) {
qWarning("QSignalSpy: Not a valid signal: '%s'", signal.methodSignature().constData()); qWarning("QSignalSpy: Not a signal: '%s'", signal.methodSignature().constData());
return false;
}
return valid; return true;
} }
static bool isObjectValid(const QObject *object) static bool isObjectValid(const QObject *object)

View File

@ -485,12 +485,12 @@ void tst_QSignalSpy::spyOnMetaMethod_invalid_data()
<< QMetaMethod(); << QMetaMethod();
QTest::addRow("Empty signal") QTest::addRow("Empty signal")
<< "QSignalSpy: Not a valid signal: ''"_ba << "QSignalSpy: Null signal is not valid"_ba
<< new QObject(this) << new QObject(this)
<< QMetaMethod(); << QMetaMethod();
QTest::addRow("Method is not a signal") QTest::addRow("Method is not a signal")
<< "QSignalSpy: Not a valid signal: 'deleteLater()'"_ba << "QSignalSpy: Not a signal: 'deleteLater()'"_ba
<< new QObject(this) << new QObject(this)
<< QObject::staticMetaObject.method(QObject::staticMetaObject.indexOfMethod("deleteLater()")); << QObject::staticMetaObject.method(QObject::staticMetaObject.indexOfMethod("deleteLater()"));
} }