Skip to content

[Bug]: UnitTests fail on arm64 in "Release" mode (gcc-15) #1578

@umlaeute

Description

@umlaeute

Detailed steps on how to reproduce the bug

we are experiencing consistent failures of the UnitTestRunner on Linux/arm64, when building with CONFIG=Release.

-----------------------------------------------------------------
Starting tests in: IntersectingRangedValues / IntersectingRangedValuesTests - iterating over multiple RangedValues...
Completed tests in IntersectingRangedValues / IntersectingRangedValuesTests - iterating over multiple RangedValues
-----------------------------------------------------------------
Starting tests in: SimpleShapedText / getTextRange: LTR Latin text without ligatures - no soft breaks...
Segmentation fault

it appears to work nicely when building with CONFIG=Debug (which i think is the default).

of course, the Release builds are built without -g:

JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)

so I've manually changed that line to:

  JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH)  -g -O3 $(CFLAGS)

What is the expected behaviour?

i expect that the unit-tests succeed, regardless of whether i use a Debug or a Release build.

Operating systems

Linux

What versions of the operating systems?

Debian/GNU linux (sid)

the tests are run on a headless build machine without audio hardware.

Architectures

Arm64/aarch64

Stacktrace

Starting tests in: SimpleShapedText / getTextRange: LTR Latin text without ligatures - no soft breaks...

Thread 1 "UnitTestRunner" received signal SIGSEGV, Segmentation fault.
std::_Rb_tree_rebalance_for_erase (__z=0xfffffffffffffffd, __header=...) at ../../../../../src/libstdc++-v3/src/c++98/tree.cc:296
warning: 296    ../../../../../src/libstdc++-v3/src/c++98/tree.cc: No such file or directory
(gdb) bt
#0  std::_Rb_tree_rebalance_for_erase (__z=0xfffffffffffffffd, __header=...) at ../../../../../src/libstdc++-v3/src/c++98/tree.cc:296
#1  0x0000aaaaab1d2a70 in std::__rb_tree::_Node_traits<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair>, std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair>*>::_S_rebalance_for_erase (__z=<optimized out>, __header=...) at /usr/include/c++/15/bits/stl_tree.h:698
#2  std::_Rb_tree<juce::String, std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair>, std::_Select1st<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> >, std::less<juce::String>, std::allocator<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> > >::_M_erase_aux (this=<optimized out>, __position=...) at /usr/include/c++/15/bits/stl_tree.h:3115
#3  std::_Rb_tree<juce::String, std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair>, std::_Select1st<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> >, std::less<juce::String>, std::allocator<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> > >::erase[abi:cxx11](std::_Rb_tree_const_iterator<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> >) (this=<optimized out>, __position=...) at /usr/include/c++/15/bits/stl_tree.h:1821
#4  std::map<juce::String, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair, std::less<juce::String>, std::allocator<std::pair<juce::String const, juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::Pair> > >::erase (this=<optimized out>, __position=...) at /usr/include/c++/15/bits/stl_map.h:1122
#5  juce::LruCache<juce::String, juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0>, 128ul>::get<juce::Array<juce::Unicode::Codepoint, juce::DummyCriticalSection, 0> (&)(juce::String const&)> (this=<optimized out>, 
    key=..., fn=<optimized out>) at ../../../../modules/juce_core/detail/juce_LruCache.h:56
#6  juce::Unicode::performAnalysis (string=...) at ../../../../modules/juce_graphics/unicode/juce_Unicode.cpp:86
#7  0x0000aaaaab132af8 in juce::detail::getLineRanges (data=...) at ../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp:1260
#8  juce::detail::SimpleShapedText::shape (this=0xffffffffee40, data=..., options=...) at ../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp:1288
#9  0x0000aaaaab1356a4 in juce::detail::SimpleShapedText::SimpleShapedText (this=0xffffffffee40, data=<optimized out>, options=...) at ../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp:119
#10 0x0000aaaaab1d608c in juce::detail::SimpleShapedTextTests::runTest (this=this@entry=0xaaaaab9dc5b8 <juce::detail::simpleShapedTextTests>, text=text@entry=0xaaaaab68d5e8 "Some trivial text", maxWidth=maxWidth@entry=100000)
    at ../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp:1564
#11 0x0000aaaaab1d6434 in juce::detail::SimpleShapedTextTests::runTest (this=0xaaaaab9dc5b8 <juce::detail::simpleShapedTextTests>) at ../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp:1585
#12 0x0000aaaaaaf3b8d8 in juce::UnitTest::performTest (this=0xaaaaab9dc5b8 <juce::detail::simpleShapedTextTests>, newRunner=0xfffffffff128) at ../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp:103
#13 juce::UnitTestRunner::runTests (this=0xfffffffff128, tests=..., randomSeed=<optimized out>) at ../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp:191
#14 0x0000aaaaaab9aca8 in main (argc=<optimized out>, argv=<optimized out>) at ../../Source/Main.cpp:122
(gdb)

Plug-in formats (if applicable)

No response

Plug-in host applications (DAWs) (if applicable)

No response

Testing on the develop branch

I have not tested against the develop branch

Code of Conduct

  • I agree to follow the Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions