• kf6-ktexttemplate FTBFS on arm64 with -O2 (build-time testsuite segfaul

    From =?ISO-8859-1?Q?Aur=E9lien?= COUDERC@21:1/5 to All on Wed Aug 14 00:10:02 2024
    Dear ARM porters,

    I recently uploaded KDE Frameworks 6 packages (version 6.5.0) to unstable, paving the way for Plasma 6 and Qt6 based KDE applications.

    All 72 source packages builds fine, including 51 of them running their upstream testsuite, but kf6-ktexttemplate fails its testsuite on arm64. [1]
    2 tests are segfaulting:
    The following tests FAILED:
    2 - testbuiltins (SEGFAULT)
    3 - testloadertags (SEGFAULT)
    Errors while running CTest

    See the full build logs at [2] and the stack traces below. Both tests crash deep inside the stack in an internal copy in the QVariant object.
    Reverting the optimization level to -O1 makes the issue disappear, so this looks like a compiler bug.

    As an additional data point, version 6.4.0 which in fact has exactly the same upstream code built successfully in experimental a couple of days ago. [3]


    For now I’ll be setting -O1 for building the package on arm64, but if you’re interested in analysing and fixing the issue I’d prefer to be able to drop that and use the standard optimisation level.


    [1] https://deb.li/kf6builds
    [2] https://buildd.debian.org/status/fetch.php?pkg=kf6-ktexttemplate&arch=arm64&ver=6.5.0-1&stamp=1723536095&raw=0
    [3] https://buildd.debian.org/status/fetch.php?pkg=kf6-ktexttemplate&arch=arm64&ver=6.4.0-1&stamp=1721388797&raw=0


    Happy hacking,
    --
    Aurélien


    ########## testbuiltins SEGV ##########
    2: [New LWP 2592652]
    2: [Thread debugging using libthread_db enabled]
    2: Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1". 2: 0x0000ffffa95525f0 in wait4 () from /lib/aarch64-linux-gnu/libc.so.6
    2:
    2: Thread 2 (Thread 0xffffa4a45d00 (LWP 2592652) "QtTest Watchdog"):
    2: #0 0x0000ffffa94fc414 in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    2: #1 0x0000ffffa94ff6c4 in pthread_cond_clockwait () from /lib/aarch64-linux-gnu/libc.so.6
    2: #2 0x0000ffffa9ea2294 in std::__condvar::wait_until (this=<optimized out>, __m=..., __clock=1, __abs_time=...) at /usr/include/c++/14/bits/std_mutex.h:185
    2: #3 std::condition_variable::__wait_until_impl<std::chrono::duration<long, std::ratio<1l, 1000000000l> > > (__lock=..., this=<optimized out>, __atime=...) at /usr/include/c++/14/condition_variable:203
    2: #4 std::condition_variable::wait_until<std::chrono::duration<long, std::ratio<1l, 1000000000l> > > (this=<optimized out>, __lock=..., __atime=...) at /usr/include/c++/14/condition_variable:113
    2: #5 std::condition_variable::wait_until<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> >, QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::WatchDog::Expectation)::{lambda()#1}>(std::unique_lock<
    std::mutex>&, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&, QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::WatchDog::Expectation)::{lambda()#1}) (this=<
    optimized out>, __lock=..., __atime=..., __p=...) at /usr/include/c++/14/condition_variable:154
    2: #6 std::condition_variable::wait_for<long, std::ratio<1l, 1000l>, QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::WatchDog::Expectation)::{lambda()#1}>(std::unique_lock<std::mutex>&, std::chrono::duration<long, std::ratio<1l, 1000l> >
    const&, QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::WatchDog::Expectation)::{lambda()#1}) (this=<optimized out>, __lock=..., __rtime=..., __p=...) at /usr/include/c++/14/condition_variable:177
    2: #7 QTest::WatchDog::waitFor (this=<optimized out>, m=..., e=454) at ./src/testlib/qtestcase.cpp:1241
    2: #8 QTest::WatchDog::run (this=<optimized out>) at ./src/testlib/qtestcase.cpp:1305
    2: #9 0x0000ffffa9b9ec74 in operator() (__closure=<optimized out>) at ./src/corelib/thread/qthread_unix.cpp:324
    2: #10 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=...) at ./src/corelib/thread/qthread_unix.cpp:260
    2: #11 QThreadPrivate::start (arg=0xaaaad5a49570) at ./src/corelib/thread/qthread_unix.cpp:283
    2: #12 0x0000ffffa94ffe84 in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    2: #13 0x0000ffffa956678c in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    2:
    2: Thread 1 (Thread 0xffffa9ef1020 (LWP 2592644) "testbuiltins_ex"):
    2: #0 0x0000ffffa95525f0 in wait4 () from /lib/aarch64-linux-gnu/libc.so.6
    2: #1 0x0000ffffa9ea8d40 in generateStackTrace() [clone .part.0] [clone .lto_priv.0] () at ./src/testlib/qtestcase.cpp:411
    2: #2 0x0000ffffa9ea2590 in generateStackTrace () at ./src/testlib/qtestcase.cpp:375
    2: #3 (anonymous namespace)::FatalSignalHandler::actionHandler (signum=11, info=<optimized out>) at ./src/testlib/qtestcase.cpp:2179
    2: #4 <signal handler called>
    2: #5 (anonymous namespace)::clonePrivate (other=...) at ./src/corelib/kernel/qvariant.cpp:304
    2: #6 QVariant::operator= (this=0xffffed46d648, variant=...) at ./src/corelib/kernel/qvariant.cpp:1067
    2: #7 QVariant::operator= (this=0xffffed46d648, variant=...) at ./src/corelib/kernel/qvariant.cpp:1061
    2: #8 0x0000ffffa9aa4154 in operator() (__closure=<synthetic pointer>, dataPtr=<optimized out>) at ./src/corelib/kernel/qsequentialiterable.cpp:203
    2: #9 QIterablePrivate::retrieveElement<QSequentialConstIterator::operator*() const::<lambda(void*)> > (type=..., callback=...) at ./src/corelib/kernel/qiterable_p.h:34
    2: #10 QSequentialConstIterator::operator* (this=this@entry=0xffffed46d548) at ./src/corelib/kernel/qsequentialiterable.cpp:204
    2: #11 0x0000ffffa41e7504 in ForNode::render (this=0xaaaad5a971d0, stream=<optimized out>, c=<optimized out>) at ./src/defaulttags/for.cpp:159
    2: #12 0x0000ffffa9f37550 in KTextTemplate::NodeList::render (this=this@entry=0xaaaad5a9e278, stream=stream@entry=0xffffed46d808, c=c@entry=0xffffed46d890) at ./src/lib/node.cpp:184
    2: #13 0x0000ffffa9f4d044 in KTextTemplate::TemplateImpl::render (this=this@entry=0xaaaad5a99d80, stream=stream@entry=0xffffed46d808, c=c@entry=0xffffed46d890) at ./src/lib/template.cpp:84
    2: #14 0x0000ffffa9f4d858 in KTextTemplate::TemplateImpl::render (this=0xaaaad5a99d80, c=c@entry=0xffffed46d890) at ./src/lib/template.cpp:71
    2: #15 0x0000aaaabda17aec in TestBuiltinSyntax::doTest (this=<optimized out>) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qsharedpointer_impl.h:271
    2: #16 0x0000ffffa9a64e50 in QMetaMethodInvoker::invokeImpl (self=..., target=0xffffed46e280, connectionType=connectionType@entry=Qt::DirectConnection, paramCount=paramCount@entry=1, parameters=parameters@entry=0xffffed46dcf0, typeNames=typeNames@entry=
    0xffffed46dcf8, metaTypes=metaTypes@entry=0xffffed46dd00) at ./src/corelib/kernel/qmetaobject.cpp:2713
    2: #17 0x0000ffffa9a6568c in QMetaMethod::invokeImpl (self=..., target=<optimized out>, connectionType=connectionType@entry=Qt::DirectConnection, paramCount=paramCount@entry=1, parameters=parameters@entry=0xffffed46dcf0, typeNames=typeNames@entry=
    0xffffed46dcf8, metaTypes=metaTypes@entry=0xffffed46dd00) at ./src/corelib/kernel/qmetaobject.cpp:2552
    2: #18 0x0000ffffa9ec8418 in QMetaMethod::invoke<>(QObject*, Qt::ConnectionType, QMetaMethodReturnArgument) const (c=Qt::DirectConnection, this=<optimized out>, obj=<optimized out>, r=...) at ./src/corelib/kernel/qmetaobject.h:148
    2: #19 QMetaMethod::invoke<>(QObject*, Qt::ConnectionType) const (c=Qt::DirectConnection, this=<optimized out>, obj=<optimized out>) at ./src/corelib/kernel/qmetaobject.h:160
    2: #20 QTest::TestMethods::invokeTestOnData (this=<optimized out>, index=-1444447928) at ./src/testlib/qtestcase.cpp:1136
    2: #21 QTest::TestMethods::invokeTest(int, QLatin1String, QTest::WatchDog*) const [clone .isra.0] (this=this@entry=0xffffed46e060, index=index@entry=4, tag=..., watchDog=watchDog@entry=0xaaaad5a49570) at ./src/testlib/qtestcase.cpp:1429
    2: #22 0x0000ffffa9ea5f30 in QTest::TestMethods::invokeTests (this=0xffffed46e060, testObject=0xffffed46e280) at ./src/testlib/qtestcase.cpp:1767
    2: #23 QTest::qRun () at ./src/testlib/qtestcase.cpp:2401
    2: #24 0x0000ffffa9ea67b8 in QTest::qExec (testObject=testObject@entry=0xffffed46e280, argc=<optimized out>, argv=argv@entry=0xffffed46e458) at ./src/testlib/qtestcase.cpp:2287
    2: #25 0x0000aaaabda160a0 in main (argc=<optimized out>, argv=0xffffed46e458) at ./autotests/testbuiltins.cpp:1952
    2: [Inferior 1 (process 2592644) detached]
    2: === End of stack trace ===
    #######################################


    ########## testloadertags SEGV ##########
    3: [New LWP 2592653]
    3: [Thread debugging using libthread_db enabled]
    3: Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1". 3: 0x0000ffffba7125f0 in wait4 () from /lib/aarch64-linux-gnu/libc.so.6
    3:
    3: Thread 2 (Thread 0xffffb5c05d00 (LWP 2592653) "QtTest Watchdog"):
    3: #0 0x0000ffffba6bc414 in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    3: #1 0x0000ffffba6bf0dc in pthread_cond_wait () from /lib/aarch64-linux-gnu/libc.so.6
    3: #2 0x0000ffffbb06220c in std::condition_variable::wait<QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::WatchDog::Expectation)::{lambda()#1}>(std::unique_lock<std::mutex>&, QTest::WatchDog::waitFor(std::unique_lock<std::mutex>&, QTest::
    WatchDog::Expectation)::{lambda()#1}) (this=<optimized out>, __lock=..., __p=...) at /usr/include/c++/14/condition_variable:105
    3: #3 QTest::WatchDog::waitFor (this=<optimized out>, m=..., e=33) at ./src/testlib/qtestcase.cpp:1245
    3: #4 QTest::WatchDog::run (this=<optimized out>) at ./src/testlib/qtestcase.cpp:1305
    3: #5 0x0000ffffbad5ec74 in operator() (__closure=<optimized out>) at ./src/corelib/thread/qthread_unix.cpp:324
    3: #6 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=...) at ./src/corelib/thread/qthread_unix.cpp:260
    3: #7 QThreadPrivate::start (arg=0xaaaaef843570) at ./src/corelib/thread/qthread_unix.cpp:283
    3: #8 0x0000ffffba6bfe84 in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    3: #9 0x0000ffffba72678c in ?? () from /lib/aarch64-linux-gnu/libc.so.6
    3:
    3: Thread 1 (Thread 0xffffbb0b3020 (LWP 2592645) "testloadertags_"):
    3: #0 0x0000ffffba7125f0 in wait4 () from /lib/aarch64-linux-gnu/libc.so.6
    3: #1 0x0000ffffbb068d40 in generateStackTrace() [clone .part.0] [clone .lto_priv.0] () at ./src/testlib/qtestcase.cpp:411
    3: #2 0x0000ffffbb062590 in generateStackTrace () at ./src/testlib/qtestcase.cpp:375
    3: #3 (anonymous namespace)::FatalSignalHandler::actionHandler (signum=11, info=<optimized out>) at ./src/testlib/qtestcase.cpp:2179
    3: #4 <signal handler called>
    3: #5 (anonymous namespace)::clonePrivate (other=...) at ./src/corelib/kernel/qvariant.cpp:304
    3: #6 QVariant::QVariant (this=<optimized out>, p=..., this=<optimized out>, p=...) at ./src/corelib/kernel/qvariant.cpp:542
    3: #7 0x0000ffffb535c92c in QtPrivate::QGenericArrayOps<QVariant>::copyAppend (this=0xffffcc1e4f60, b=0x0, e=0x20) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qarraydataops.h:341
    3: #8 QArrayDataPointer<QVariant>::reallocateAndGrow (this=0xffffcc1e5050, where=<optimized out>, n=<optimized out>, old=0x0) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qarraydatapointer.h:235
    3: #9 0x0000ffffb535abac in QArrayDataPointer<QVariant>::detach (this=0xffffcc1e5050, old=0x0) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qarraydatapointer.h:139
    3: #10 QArrayDataPointer<QVariant>::detach (this=0xffffcc1e5050, old=0x0) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qarraydatapointer.h:136
    3: #11 QList<QVariant>::detach (this=0xffffcc1e5050) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qlist.h:409
    3: #12 QList<QVariant>::begin (this=0xffffcc1e5050) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qlist.h:608
    3: #13 BlockNodeFactory::getNode (this=<optimized out>, tagContent=..., p=0xffffcc1e5448) at ./src/loadertags/block.cpp:43
    3: #14 0x0000ffffbb0fd994 in KTextTemplate::ParserPrivate::parse (this=0xaaaaef8ac050, parent=0xaaaaef8ab7c0, stopAt=...) at ./src/lib/parser.cpp:227
    3: #15 0x0000ffffbb0febd4 in KTextTemplate::Parser::parse(KTextTemplate::TemplateImpl*, QList<QString> const&) () at ./src/lib/parser.cpp:154
    3: #16 0x0000ffffbb10d354 in KTextTemplate::TemplatePrivate::compileString (this=this@entry=0xaaaaef8ad6b0, str=...) at ./src/lib/template.cpp:31
    3: #17 0x0000ffffbb10d59c in KTextTemplate::TemplateImpl::setContent (this=<optimized out>, templateString=...) at ./src/lib/template.cpp:58
    3: #18 0x0000ffffbb0e2df8 in KTextTemplate::Engine::newTemplate (this=0xaaaaef84d3c0, content=..., name=...) at /usr/include/aarch64-linux-gnu/qt6/QtCore/qsharedpointer_impl.h:271
    3: #19 0x0000aaaadaee840c in TestLoaderTags::testExtendsTag_data (this=<optimized out>) at ./autotests/testloadertags.cpp:365
    3: #20 0x0000ffffbac24e50 in QMetaMethodInvoker::invokeImpl (self=..., target=target@entry=0xffffcc1e6290, connectionType=connectionType@entry=Qt::DirectConnection, paramCount=paramCount@entry=1, parameters=parameters@entry=0xffffcc1e5b30, typeNames=
    typeNames@entry=0xffffcc1e5b38, metaTypes=metaTypes@entry=0xffffcc1e5b40) at ./src/corelib/kernel/qmetaobject.cpp:2713
    3: #21 0x0000ffffbac2568c in QMetaMethod::invokeImpl (self=..., target=target@entry=0xffffcc1e6290, connectionType=connectionType@entry=Qt::DirectConnection, paramCount=paramCount@entry=1, parameters=parameters@entry=0xffffcc1e5b30, typeNames=typeNames@
    entry=0xffffcc1e5b38, metaTypes=metaTypes@entry=0xffffcc1e5b40) at ./src/corelib/kernel/qmetaobject.cpp:2552
    3: #22 0x0000ffffbb05f91c in QMetaMethod::invoke<>(QObject*, Qt::ConnectionType, QMetaMethodReturnArgument) const (c=Qt::DirectConnection, this=<synthetic pointer>, obj=0xffffcc1e6290, r=...) at ./src/corelib/kernel/qmetaobject.h:148
    3: #23 QMetaMethod::invoke<>(QObject*, Qt::ConnectionType) const (c=Qt::DirectConnection, this=<synthetic pointer>, obj=0xffffcc1e6290) at ./src/corelib/kernel/qmetaobject.h:160
    3: #24 QTest::invokeMethod (obj=0xffffcc1e6290, methodName=<optimized out>) at ./src/testlib/qtestcase.cpp:548
    3: #25 0x0000ffffbb087c2c in QTest::TestMethods::invokeTest(int, QLatin1String, QTest::WatchDog*) const [clone .isra.0] (this=this@entry=0xffffcc1e6070, index=index@entry=2, tag=..., watchDog=watchDog@entry=0xaaaaef843570) at ./src/testlib/qtestcase.cpp:
    1402
    3: #26 0x0000ffffbb065f30 in QTest::TestMethods::invokeTests (this=0xffffcc1e6070, testObject=0xffffcc1e6290) at ./src/testlib/qtestcase.cpp:1767
    3: #27 QTest::qRun () at ./src/testlib/qtestcase.cpp:2401
    3: #28 0x0000ffffbb0667b8 in QTest::qExec (testObject=testObject@entry=0xffffcc1e6290, argc=<optimized out>, argv=argv@entry=0xffffcc1e6468) at ./src/testlib/qtestcase.cpp:2287
    3: #29 0x0000aaaadaee3ba0 in main (argc=<optimized out>, argv=0xffffcc1e6468) at ./autotests/testloadertags.cpp:535
    3: [Inferior 1 (process 2592645) detached]
    3: === End of stack trace ===
    #########################################

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Emanuele Rocca@21:1/5 to All on Fri Sep 6 16:50:01 2024
    On 2024-08-13 11:46, Aurélien COUDERC wrote:
    2 tests are segfaulting:
    The following tests FAILED:
    2 - testbuiltins (SEGFAULT)
    3 - testloadertags (SEGFAULT)
    Errors while running CTest

    This looks like a GCC 14 regression, see the initial analysis on https://bugs.debian.org/1080974.

    As an additional data point, version 6.4.0 which in fact has exactly
    the same upstream code built successfully in experimental a couple of
    days ago. [3]

    [...]

    [3] https://buildd.debian.org/status/fetch.php?pkg=kf6-ktexttemplate&arch=arm64&ver=6.4.0-1&stamp=1721388797&raw=0

    From the logs:

    -- The CXX compiler identification is GNU 13.3.0

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)