Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-58851

Race condition in QMetaType::typeName

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P3: Somewhat important
    • 5.6.3
    • 5.8.0
    • Core: Object Model
    • None
    • OpenSuSE Leap 42.2, clang 3.9.1, libc++, thread sanitizer
    • fb376e0, ad1b3a49807cdb456698991142da0244c0612a1c

    Description

      clang's tsan detects that QMetaType::typeName() is racy, and indeed I see no locking in that code.

      WARNING: ThreadSanitizer: data race (pid=2303)
        Read of size 8 at 0x7fd0db177640 by thread T3:
          #0 QMetaType::typeName(int) /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetatype.cpp:843:60 (libQt5Core.so.5+0x0000005d1e91)
          #1 typeNameFromTypeInfo(QMetaObject const*, unsigned int) /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:170:25 (libQt5Core.so.5+0x0000005c1c7c)
          #2 QMetaMethodPrivate::parameterTypes() const /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:1737:17 (libQt5Core.so.5+0x0000005cfd0a)
          #3 QMetaMethod::parameterTypes() const /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:1878:43 (libQt5Core.so.5+0x0000005c60fe)
          #4 qDBusParametersForMethod(QMetaMethod const&, QVector<int>&, QString&) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusmisc.cpp:140:40 (libQt5DBus.so.5+0x000000099054)
          #5 QDBusConnectionPrivate::findSlot(QObject*, QByteArray const&, QVector<int>&) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:1314:22 (libQt5DBus.so.5+0x0000000363a7)
          #6 QDBusConnectionPrivate::prepareHook(QDBusConnectionPrivate::SignalHook&, QString&, QString const&, QString const&, QString const&, QString const&, QStringList const&, QObject*, char const*, int, bool) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:1329:17 (libQt5DBus.so.5+0x000000036575)
          #7 QDBusConnectionPrivate::connectSignal(QString const&, QString const&, QString const&, QString const&, QStringList const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:2205:10 (libQt5DBus.so.5+0x00000003d891)
          #8 QDBusConnection::connect(QString const&, QString const&, QString const&, QString const&, QStringList const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusconnection.cpp:806:15 (libQt5DBus.so.5+0x00000001bd00)
          #9 QDBusConnection::connect(QString const&, QString const&, QString const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusconnection.cpp:728:12 (libQt5DBus.so.5+0x00000001b95f)
      
        Previous write of size 8 at 0x7fd0db177640 by thread T6:
          #0 QMetaType::typeName(int) /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetatype.cpp:867:22 (libQt5Core.so.5+0x0000005d28dc)
          #1 typeNameFromTypeInfo(QMetaObject const*, unsigned int) /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:170:25 (libQt5Core.so.5+0x0000005c1c7c)
          #2 QMetaMethodPrivate::parameterTypes() const /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:1737:17 (libQt5Core.so.5+0x0000005cfd0a)
          #3 QMetaMethod::parameterTypes() const /d/qt/5/kdab/qtbase-dev/src/corelib/kernel/qmetaobject.cpp:1878:43 (libQt5Core.so.5+0x0000005c60fe)
          #4 qDBusParametersForMethod(QMetaMethod const&, QVector<int>&, QString&) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusmisc.cpp:140:40 (libQt5DBus.so.5+0x000000099054)
          #5 QDBusConnectionPrivate::findSlot(QObject*, QByteArray const&, QVector<int>&) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:1314:22 (libQt5DBus.so.5+0x0000000363a7)
          #6 QDBusConnectionPrivate::prepareHook(QDBusConnectionPrivate::SignalHook&, QString&, QString const&, QString const&, QString const&, QString const&, QStringList const&, QObject*, char const*, int, bool) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:1329:17 (libQt5DBus.so.5+0x000000036575)
          #7 QDBusConnectionPrivate::connectSignal(QString const&, QString const&, QString const&, QString const&, QStringList const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusintegrator.cpp:2205:10 (libQt5DBus.so.5+0x00000003d891)
          #8 QDBusConnection::connect(QString const&, QString const&, QString const&, QString const&, QStringList const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusconnection.cpp:806:15 (libQt5DBus.so.5+0x00000001bd00)
          #9 QDBusConnection::connect(QString const&, QString const&, QString const&, QString const&, QObject*, char const*) /d/qt/5/kdab/qtbase-dev/src/dbus/qdbusconnection.cpp:728:12 (libQt5DBus.so.5+0x00000001b95f)
      

      Attachments

        For Gerrit Dashboard: QTBUG-58851
        # Subject Branch Project Status CR V

        Activity

          People

            thiago Thiago Macieira
            dfaure_kdab David Faure
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes