From 7a47aebe9ed41d6cd9c9bcd45758d4d553668e99 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 10 Oct 2013 17:06:37 +0200 Subject: [PATCH] Let QLoggingCategory::defaultCategory return a pointer The pointer can be null. Going trough the reference invokes undefined behavior here. Change-Id: Ia84e4e732cdcbbaee0f5f0679765d18069ea8b2d Reviewed-by: Kai Koehne --- src/corelib/global/qlogging.cpp | 2 +- src/corelib/io/qloggingcategory.cpp | 15 ++++++--- src/corelib/io/qloggingcategory.h | 2 +- .../qloggingcategory/tst_qloggingcategory.cpp | 32 +++++++++---------- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index 063e94069f..b9b5173881 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -927,7 +927,7 @@ static void qt_message_print(QtMsgType msgType, const QMessageLogContext &contex #ifndef QT_BOOTSTRAPPED // qDebug, qWarning, ... macros do not check whether category is enabled if (!context.category || (strcmp(context.category, "default") == 0)) { - if (QLoggingCategory *defaultCategory = &QLoggingCategory::defaultCategory()) { + if (QLoggingCategory *defaultCategory = QLoggingCategory::defaultCategory()) { if (!defaultCategory->isEnabled(msgType)) return; } diff --git a/src/corelib/io/qloggingcategory.cpp b/src/corelib/io/qloggingcategory.cpp index 6c5df1e8e7..2ef392c209 100644 --- a/src/corelib/io/qloggingcategory.cpp +++ b/src/corelib/io/qloggingcategory.cpp @@ -244,12 +244,19 @@ void QLoggingCategory::setEnabled(QtMsgType type, bool enable) */ /*! - Returns the category \c "default" that is used e.g. by qDebug(), qWarning(), - qCritical(), qFatal(). + Returns a pointer to the global category \c "default" that + is used e.g. by qDebug(), qWarning(), qCritical(), qFatal(). + + \note The returned pointer may be null during destruction of + static objects. + + \note Ownership of the category is not transferred, do not + \c delete the returned pointer. + */ -QLoggingCategory &QLoggingCategory::defaultCategory() +QLoggingCategory *QLoggingCategory::defaultCategory() { - return *qtDefaultCategory(); + return qtDefaultCategory(); } /*! diff --git a/src/corelib/io/qloggingcategory.h b/src/corelib/io/qloggingcategory.h index 35da04c8f2..6009226127 100644 --- a/src/corelib/io/qloggingcategory.h +++ b/src/corelib/io/qloggingcategory.h @@ -72,7 +72,7 @@ public: // allows usage of both factory method and variable in qCX macros QLoggingCategory &operator()() { return *this; } - static QLoggingCategory &defaultCategory(); + static QLoggingCategory *defaultCategory(); typedef void (*CategoryFilter)(QLoggingCategory*); static CategoryFilter installFilter(CategoryFilter); diff --git a/tests/auto/corelib/io/qloggingcategory/tst_qloggingcategory.cpp b/tests/auto/corelib/io/qloggingcategory/tst_qloggingcategory.cpp index df93262d93..a49793c3d4 100644 --- a/tests/auto/corelib/io/qloggingcategory/tst_qloggingcategory.cpp +++ b/tests/auto/corelib/io/qloggingcategory/tst_qloggingcategory.cpp @@ -226,7 +226,7 @@ private slots: void QLoggingCategory_categoryName() { logMessage.clear(); - QCOMPARE(QString::fromLatin1(QLoggingCategory::defaultCategory().categoryName()), + QCOMPARE(QString::fromLatin1(QLoggingCategory::defaultCategory()->categoryName()), QStringLiteral("default")); QLoggingCategory defaultCategory("default"); @@ -237,7 +237,7 @@ private slots: QCOMPARE(QByteArray(nullCategory.categoryName()), QByteArray("default")); // we rely on the same pointer for any "default" category - QCOMPARE(QLoggingCategory::defaultCategory().categoryName(), + QCOMPARE(QLoggingCategory::defaultCategory()->categoryName(), defaultCategory.categoryName()); QCOMPARE(defaultCategory.categoryName(), nullCategory.categoryName()); @@ -256,12 +256,12 @@ private slots: { logMessage.clear(); - QCOMPARE(QLoggingCategory::defaultCategory().isDebugEnabled(), true); - QCOMPARE(QLoggingCategory::defaultCategory().isEnabled(QtDebugMsg), true); - QCOMPARE(QLoggingCategory::defaultCategory().isWarningEnabled(), true); - QCOMPARE(QLoggingCategory::defaultCategory().isEnabled(QtWarningMsg), true); - QCOMPARE(QLoggingCategory::defaultCategory().isCriticalEnabled(), true); - QCOMPARE(QLoggingCategory::defaultCategory().isEnabled(QtCriticalMsg), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isDebugEnabled(), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isEnabled(QtDebugMsg), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isWarningEnabled(), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isEnabled(QtWarningMsg), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isCriticalEnabled(), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isEnabled(QtCriticalMsg), true); QLoggingCategory defaultCategory("default"); QCOMPARE(defaultCategory.isDebugEnabled(), true); @@ -287,11 +287,11 @@ private slots: { logMessage.clear(); - QCOMPARE(QLoggingCategory::defaultCategory().isDebugEnabled(), true); + QCOMPARE(QLoggingCategory::defaultCategory()->isDebugEnabled(), true); - QLoggingCategory::defaultCategory().setEnabled(QtDebugMsg, false); - QCOMPARE(QLoggingCategory::defaultCategory().isDebugEnabled(), false); - QLoggingCategory::defaultCategory().setEnabled(QtDebugMsg, true); + QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, false); + QCOMPARE(QLoggingCategory::defaultCategory()->isDebugEnabled(), false); + QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true); // make sure nothing has printed warnings QVERIFY(logMessage.isEmpty()); @@ -300,13 +300,13 @@ private slots: void QLoggingCategory_installFilter() { - QVERIFY(QLoggingCategory::defaultCategory().isDebugEnabled()); + QVERIFY(QLoggingCategory::defaultCategory()->isDebugEnabled()); QLoggingCategory::CategoryFilter defaultFilter = QLoggingCategory::installFilter(customCategoryFilter); QVERIFY(defaultFilter); customCategoryFilterArgs.clear(); - QVERIFY(!QLoggingCategory::defaultCategory().isDebugEnabled()); + QVERIFY(!QLoggingCategory::defaultCategory()->isDebugEnabled()); QLoggingCategory cat("custom"); QCOMPARE(customCategoryFilterArgs, QStringList() << "custom"); @@ -319,7 +319,7 @@ private slots: QCOMPARE((void*)currentFilter, (void*)customCategoryFilter); QCOMPARE(customCategoryFilterArgs.size(), 0); - QVERIFY(QLoggingCategory::defaultCategory().isDebugEnabled()); + QVERIFY(QLoggingCategory::defaultCategory()->isDebugEnabled()); QVERIFY(!cat.isDebugEnabled()); // install default filter @@ -328,7 +328,7 @@ private slots: QCOMPARE((void*)defaultFilter, (void*)currentFilter); QCOMPARE(customCategoryFilterArgs.size(), 0); - QVERIFY(QLoggingCategory::defaultCategory().isDebugEnabled()); + QVERIFY(QLoggingCategory::defaultCategory()->isDebugEnabled()); QVERIFY(!cat.isDebugEnabled()); }