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

View File

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