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

qDebug() is not thread safe if using junitxml output format in test framework.

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 6.5.0
    • Testing: qtestlib
    • None
    • All

    Description

      qDebug() is supposed to be thread safe but it is not when using junitxml output format and using threads in tests.

      Attached is a minimal test application.

      The printout from AddressSanitizer:

      ==45600==ERROR: AddressSanitizer: negative-size-param: (size=-25769801320)
          #0 0x7ff9c2a49593 in __asan_wrap_memmove D:\a_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\sanitizer_common\sanitizer_common_interceptors.inc:813
          #1 0x7ff9f577b7ba in std::_Copy_memmove<class QTestElement **, class QTestElement **>(class QTestElement **, class QTestElement **, class QTestElement **) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\xutility:4066
          #2 0x7ff9f577c3db in std::_Uninitialized_move<class QTestElement **, class std::allocator<class QTestElement *>>(class QTestElement **const, class QTestElement **const, class QTestElement **, class std::allocator<class QTestElement *> &) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\xmemory:1711
          #3 0x7ff9f577e0b9 in std::vector<class QTestElement *, class std::allocator<class QTestElement *>>::_Umove(class QTestElement **, class QTestElement **, class QTestElement **) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:1646
          #4 0x7ff9f577be5d in std::vector<class QTestElement *, class std::allocator<class QTestElement *>>::_Emplace_reallocate<class QTestElement *const &>(class QTestElement **const, class QTestElement *const &) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:782
          #5 0x7ff9f577c872 in ??$emplace_back@AEBQEAVQTestElement@@@?$vector@PEAVQTestElement@@V?$allocator@PEAVQTestElement@@@std@@@std@@QEAA?A_TAEBQEAVQTestElement@@@Z c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:734
          #6 0x7ff9f577ea5d in std::vector<class QTestElement *, class std::allocator<class QTestElement *>>::push_back(class QTestElement *const &) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:743
          #7 0x7ff9f57baa16 in QTestElement::addChild(class QTestElement *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestelement.cpp:25
          #8 0x7ff9f577a1e2 in QJUnitTestLogger::addMessage(enum QAbstractTestLogger::MessageTypes, class QString const &, char const *, int) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qjunittestlogger.cpp:289
          #9 0x7ff9f576f445 in QAbstractTestLogger::addMessage(enum QtMsgType, class QMessageLogContext const &, class QString const &) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qabstracttestlogger.cpp:369
          #10 0x7ff9f57becef in QTest::messageHandler C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestlog.cpp:238
          #11 0x7ff9c96d8cb5 in qt_message_print C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\global\qlogging.cpp:2006
          #12 0x7ff9c96d77d5 in qt_message_output(enum QtMsgType, class QMessageLogContext const &, class QString const &) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\global\qlogging.cpp:2057
          #13 0x7ff9c96fce06 in QDebug::~QDebug(void) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\io\qdebug.cpp:167
          #14 0x7ff70cce3e87 in Worker::run(void) C:\temp\testJunitLogger\testObject.cpp:11
          #15 0x7ff9c9c1919f in QThreadPrivate::start(void *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\thread\qthread_win.cpp:290
          #16 0x7ff9c2a648fe in __asan::AsanThread::ThreadStart(unsigned __int64) D:\a_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_thread.cpp:299
          #17 0x7ffa5738257c  (C:\Windows\System32\KERNEL32.DLL+0x18001257c)
          #18 0x7ffa57eeaf27  (C:\Windows\SYSTEM32\ntdll.dll+0x18005af27)

      0x11c7ef4a2260 is located 0 bytes inside of 152-byte region [0x11c7ef4a2260,0x11c7ef4a22f8)
      allocated by thread T0 here:
          #0 0x7ff9c2a58038 in malloc D:\a_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win.cpp:252
          #1 0x7ff9f5803de2 in operator new(unsigned __int64) D:\a_work\1\s\src\vctools\crt\vcstartup\src\heap\new_scalar.cpp:35
          #2 0x7ff9f577d4a3 in std::_Default_allocate_traits::_Allocate(unsigned __int64) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\xmemory:79
          #3 0x7ff9f577b552 in std::_Allocate<16, struct std::_Default_allocate_traits, 0>(unsigned __int64) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\xmemory:235
          #4 0x7ff9f577e500 in std::allocator<class QTestElement *>::allocate(unsigned __int64) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\xmemory:801
          #5 0x7ff9f577bd88 in std::vector<class QTestElement *, class std::allocator<class QTestElement *>>::_Emplace_reallocate<class QTestElement *const &>(class QTestElement **const, class QTestElement *const &) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:771
          #6 0x7ff9f577c872 in ??$emplace_back@AEBQEAVQTestElement@@@?$vector@PEAVQTestElement@@V?$allocator@PEAVQTestElement@@@std@@@std@@QEAA?A_TAEBQEAVQTestElement@@@Z c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:734
          #7 0x7ff9f577ea5d in std::vector<class QTestElement *, class std::allocator<class QTestElement *>>::push_back(class QTestElement *const &) c:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include\vector:743
          #8 0x7ff9f57baa16 in QTestElement::addChild(class QTestElement *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestelement.cpp:25
          #9 0x7ff9f577a1e2 in QJUnitTestLogger::addMessage(enum QAbstractTestLogger::MessageTypes, class QString const &, char const *, int) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qjunittestlogger.cpp:289
          #10 0x7ff9f576f445 in QAbstractTestLogger::addMessage(enum QtMsgType, class QMessageLogContext const &, class QString const &) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qabstracttestlogger.cpp:369
          #11 0x7ff9f57becef in QTest::messageHandler C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestlog.cpp:238
          #12 0x7ff9c96d8cb5 in qt_message_print C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\global\qlogging.cpp:2006
          #13 0x7ff9c96d77d5 in qt_message_output(enum QtMsgType, class QMessageLogContext const &, class QString const &) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\global\qlogging.cpp:2057
          #14 0x7ff9c96fce06 in QDebug::~QDebug(void) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\io\qdebug.cpp:167
          #15 0x7ff70cce3ad3 in TestObject::test(void) C:\temp\testJunitLogger\testObject.cpp:26
          #16 0x7ff70cce15d6 in TestObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void **) C:\temp\testJunitLogger\build\6_5_0_msvc2022_64bit-Debug\testJunitLogger_autogen\EWIEGA46WW\moc_testObject.cpp:112
          #17 0x7ff9c97f66ed in QMetaMethodInvoker::invokeImpl(class QMetaMethod, void *, enum Qt::ConnectionType, __int64, void const *const *, char const *const *, class QtPrivate::QMetaTypeInterface const *const *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.cpp:2704
          #18 0x7ff9c97f2cb2 in QMetaMethod::invokeImpl(class QMetaMethod, void *, enum Qt::ConnectionType, __int64, void const *const *, char const *const *, class QtPrivate::QMetaTypeInterface const *const *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.cpp:2542
          #19 0x7ff9f57ad556 in QMetaMethod::invoke<>(class QObject *, enum Qt::ConnectionType, struct QMetaMethodReturnArgument) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.h:148
          #20 0x7ff9f57ad39e in QMetaMethod::invoke<>(class QObject *, enum Qt::ConnectionType) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.h:160
          #21 0x7ff9f579d686 in QTest::TestMethods::invokeTestOnData(int) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1134
          #22 0x7ff9f579d141 in QTest::TestMethods::invokeTest(int, class QLatin1String, class QTest::WatchDog *) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1426
          #23 0x7ff9f579ca33 in QTest::TestMethods::invokeTests(class QObject *) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1752
          #24 0x7ff9f5797928 in QTest::qRun(void) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:2365
          #25 0x7ff9f5797a4a in QTest::qExec(class QObject *, int, char **) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:2251
          #26 0x7ff70cce3209 in `main'::`2'::<lambda_1>::operator() C:\temp\testJunitLogger\main.cpp:18
          #27 0x7ff70cce2c34 in main C:\temp\testJunitLogger\main.cpp:21

      Thread T2 created by T0 here:
          #0 0x7ff9c2a66607 in __asan_wrap_CreateThread D:\a_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_win.cpp:167
          #1 0x7ff9c9c1881e in QThread::start(enum QThread::Priority) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\thread\qthread_win.cpp:427
          #2 0x7ff70cce39d6 in TestObject::test(void) C:\temp\testJunitLogger\testObject.cpp:24
          #3 0x7ff70cce15d6 in TestObject::qt_static_metacall(class QObject *, enum QMetaObject::Call, int, void **) C:\temp\testJunitLogger\build\6_5_0_msvc2022_64bit-Debug\testJunitLogger_autogen\EWIEGA46WW\moc_testObject.cpp:112
          #4 0x7ff9c97f66ed in QMetaMethodInvoker::invokeImpl(class QMetaMethod, void *, enum Qt::ConnectionType, __int64, void const *const *, char const *const *, class QtPrivate::QMetaTypeInterface const *const *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.cpp:2704
          #5 0x7ff9c97f2cb2 in QMetaMethod::invokeImpl(class QMetaMethod, void *, enum Qt::ConnectionType, __int64, void const *const *, char const *const *, class QtPrivate::QMetaTypeInterface const *const *) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.cpp:2542
          #6 0x7ff9f57ad556 in QMetaMethod::invoke<>(class QObject *, enum Qt::ConnectionType, struct QMetaMethodReturnArgument) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.h:148
          #7 0x7ff9f57ad39e in QMetaMethod::invoke<>(class QObject *, enum Qt::ConnectionType) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\corelib\kernel\qmetaobject.h:160
          #8 0x7ff9f579d686 in QTest::TestMethods::invokeTestOnData(int) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1134
          #9 0x7ff9f579d141 in QTest::TestMethods::invokeTest(int, class QLatin1String, class QTest::WatchDog *) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1426
          #10 0x7ff9f579ca33 in QTest::TestMethods::invokeTests(class QObject *) const C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:1752
          #11 0x7ff9f5797928 in QTest::qRun(void) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:2365
          #12 0x7ff9f5797a4a in QTest::qExec(class QObject *, int, char **) C:\Qt-src\qt-everywhere-src-6.5.0\qtbase\src\testlib\qtestcase.cpp:2251
          #13 0x7ff70cce3209 in `main'::`2'::<lambda_1>::operator() C:\temp\testJunitLogger\main.cpp:18
          #14 0x7ff70cce2c34 in main C:\temp\testJunitLogger\main.cpp:21
          #15 0x7ff70cce5758 in invoke_main D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
          #16 0x7ff70cce56a1 in __scrt_common_main_seh D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
          #17 0x7ff70cce555d in __scrt_common_main D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:330
          #18 0x7ff70cce57cd in mainCRTStartup D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp:16
          #19 0x7ffa5738257c  (C:\Windows\System32\KERNEL32.DLL+0x18001257c)
          #20 0x7ffa57eeaf27  (C:\Windows\SYSTEM32\ntdll.dll+0x18005af27)

      SUMMARY: AddressSanitizer: negative-size-param D:\a_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\sanitizer_common\sanitizer_common_interceptors.inc:813 in __asan_wrap_memmove
      ==45600==ABORTING

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            macadder Jason McDonald
            creepov creepov
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes