Since <https://cgit.freedesktop.org/libreoffice/core/commit/?id=fc29ace3438eea09afe3ddbb5118458cbb531b06> "better fix for memory leak around calc header-footer UNO objects": * ScHeaderFooterTextData::xContentObj has been changed to a WeakReference * ScHeaderFooterTextObj::getString is checking that xContentObj is still alive: > uno::Reference<css::sheet::XHeaderFooterContent> xContentObj = aTextData.GetContentObj(); > if (!xContentObj.is()) > throw css::uno::RuntimeException(""); I assume that throw is meant to be of the "this cannot happen" kind (like an assert)---as otherwise that commit would apparently not be a sound change. However, at least JunitTest_sc_unoapi_4 sporadically triggers that throw (see e.g., <https://cgit.freedesktop.org/libreoffice/core/commit/?id=8bd3d06d974fbd301665630e3c5396db9c9e30d9> "Throw RuntimeException with message"). I've found that running that test with env var SAL_LOG=+WARN+INFO (which changes timing by producing lots of info log output) makes the failure more likely. When locally changing ScHeaderFooterTextData::xContentObj to be a raw pointer (so that dead deref in ScHeaderFooterTextObj::getString can be observed with memory checkers) and running the test with ASan, I get: > ==9225==ERROR: AddressSanitizer: heap-use-after-free on address 0x60800077cb48 at pc 0x7f523b2aca49 bp 0x7f52497e09f0 sp 0x7f52497e09e8 > READ of size 8 at 0x60800077cb48 thread T116 (cppu_threadpool) > info:sal.file:9225:90:sal/osl/unx/file.cxx:1032: osl_openFile(/home/sbergman/lo-clang/core/workdir/JunitTest/sc_unoapi_4/user/user/CqlwmE, writeable) => 68 > info:sal.file:9225:90:sal/osl/unx/file.cxx:1074: osl_closeFile(/home/sbergman/lo-clang/core/workdir/JunitTest/sc_unoapi_4/user/user/CqlwmE:68) > info:sal.osl.condition:9225:90:sal/osl/unx/conditn.cxx:85: osl_destroyCondition(0x6080002c7e20) > #0 0x7f523b2aca48 in com::sun::star::uno::Reference<com::sun::star::sheet::XHeaderFooterContent>::Reference(com::sun::star::sheet::XHeaderFooterContent*) include/com/sun/star/uno/Reference.hxx:152:22 > #1 0x7f523e013502 in ScHeaderFooterTextData::GetContentObj() const sc/inc/textuno.hxx:133:96 > #2 0x7f523e108370 in ScHeaderFooterTextObj::getString() sc/source/ui/unoobj/textuno.cxx:333:78 > #3 0x7f523e108a9c in non-virtual thunk to ScHeaderFooterTextObj::getString() sc/source/ui/unoobj/textuno.cxx > #4 0x7f525ff6371a in gcc3::callVirtualMethod(void*, unsigned int, void*, _typelib_TypeDescriptionReference*, bool, unsigned long*, unsigned int, unsigned long*, double*) bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx:77:5 > #5 0x7f525ff6019f in cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, _typelib_TypeDescriptionReference*, int, _typelib_MethodParameter*, void*, void**, _uno_Any**) bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:233:13 > #6 0x7f525ff5ea48 in bridges::cpp_uno::shared::unoInterfaceProxyDispatch(_uno_Interface*, _typelib_TypeDescription const*, void*, void**, _uno_Any**) bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:420:13 > #7 0x7f525ae5a865 in binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny> >*) const binaryurp/source/incomingrequest.cxx:239:13 > #8 0x7f525ae5888c in binaryurp::IncomingRequest::execute() const binaryurp/source/incomingrequest.cxx:78:26 > #9 0x7f525aebc79b in request binaryurp/source/reader.cxx:85:9 > #10 0x7f52c6ca3303 in cppu_threadpool::JobQueue::enter(long, bool) cppu/source/threadpool/jobqueue.cxx:107:17 > #11 0x7f52c6ccd4a9 in cppu_threadpool::ORequestThread::run() cppu/source/threadpool/thread.cxx:165:31 > #12 0x7f52c6cd9742 in threadFunc include/osl/thread.hxx:185:15 > #13 0x7f52cfcf537f in osl_thread_start_Impl(void*) sal/osl/unx/thread.cxx:240:9 > #14 0x7f52ce2915c9 in start_thread (/lib64/libpthread.so.0+0x75c9) > #15 0x7f52cd9a80ec in __clone (/lib64/libc.so.6+0x1030ec) > > 0x60800077cb48 is located 40 bytes inside of 88-byte region [0x60800077cb20,0x60800077cb78) > freed by thread T118 (cppu_threadpool) here: > #0 0x4cf730 in __interceptor_cfree.localalias.1 /home/sbergman/clang/git/src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:54 > #1 0x7f52cfafc2e0 in rtl_freeMemory_SYSTEM(void*) sal/rtl/alloc_global.cxx:279:5 > #2 0x7f52cfafcf50 in rtl_freeMemory sal/rtl/alloc_global.cxx:355:5 > #3 0x7f525ff6aa68 in bridges::cpp_uno::shared::freeUnoInterfaceProxy(_uno_ExtEnvironment*, void*) bridges/source/cpp_uno/shared/unointerfaceproxy.cxx:42:19 > #4 0x7f52c6ee2976 in (anonymous namespace)::s_stub_defenv_revokeInterface(__va_list_tag (*) [1]) cppu/source/uno/lbenv.cxx:372:17 > #5 0x7f52c6e9dbc7 in s_environment_invoke_v(_uno_Environment*, _uno_Environment*, void (*)(__va_list_tag (*) [1]), __va_list_tag (*) [1]) cppu/source/uno/EnvStack.cxx:293:9 > #6 0x7f52c6e9d8f2 in uno_Environment_invoke_v cppu/source/uno/EnvStack.cxx:312:5 > #7 0x7f52c6e9e0a2 in uno_Environment_invoke cppu/source/uno/EnvStack.cxx:321:5 > #8 0x7f525ae09d59 in com::sun::star::uno::UnoInterfaceReference::~UnoInterfaceReference() include/uno/dispatcher.hxx:103:9 > #9 0x7f525ae59dae in binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny> >*) const binaryurp/source/incomingrequest.cxx:137:18 > #10 0x7f525ae5888c in binaryurp::IncomingRequest::execute() const binaryurp/source/incomingrequest.cxx:78:26 > #11 0x7f525aebc79b in request binaryurp/source/reader.cxx:85:9 > #12 0x7f52c6ca3303 in cppu_threadpool::JobQueue::enter(long, bool) cppu/source/threadpool/jobqueue.cxx:107:17 > #13 0x7f52c6ccd4a9 in cppu_threadpool::ORequestThread::run() cppu/source/threadpool/thread.cxx:165:31 > #14 0x7f52c6cd9742 in threadFunc include/osl/thread.hxx:185:15 > #15 0x7f52cfcf537f in osl_thread_start_Impl(void*) sal/osl/unx/thread.cxx:240:9 > #16 0x7f52ce2915c9 in start_thread (/lib64/libpthread.so.0+0x75c9) > > previously allocated by thread T116 (cppu_threadpool) here: > #0 0x4cf8e8 in malloc /home/sbergman/clang/git/src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:64 > #1 0x7f52cfafc2b0 in rtl_allocateMemory_SYSTEM(unsigned long) sal/rtl/alloc_global.cxx:272:12 > #2 0x7f52cfafc88a in rtl_allocateMemory sal/rtl/alloc_global.cxx:310:12 > #3 0x7f523b2a009f in ScPageHFItem::QueryValue(com::sun::star::uno::Any&, unsigned char) const sc/source/core/data/attrib.cxx:575:9 > #4 0x7f52bb04b9c2 in SfxItemPropertySet::getPropertyValue(SfxItemPropertySimpleEntry const&, SfxItemSet const&, com::sun::star::uno::Any&) const svl/source/items/itemprop.cxx:188:16 > #5 0x7f523e0f56c0 in ScStyleObj::getPropertyValue_Impl(rtl::OUString const&) sc/source/ui/unoobj/styleuno.cxx:1948:39 > #6 0x7f523e0f81dd in ScStyleObj::getPropertyValue(rtl::OUString const&) sc/source/ui/unoobj/styleuno.cxx:1984:12 > #7 0x7f523e0f832c in non-virtual thunk to ScStyleObj::getPropertyValue(rtl::OUString const&) sc/source/ui/unoobj/styleuno.cxx > #8 0x7f525ff6019f in cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, _typelib_TypeDescriptionReference*, int, _typelib_MethodParameter*, void*, void**, _uno_Any**) bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:233:13 > #9 0x7f525ff5ea48 in bridges::cpp_uno::shared::unoInterfaceProxyDispatch(_uno_Interface*, _typelib_TypeDescription const*, void*, void**, _uno_Any**) bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:420:13 > #10 0x7f525ae5a865 in binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny> >*) const binaryurp/source/incomingrequest.cxx:239:13 > #11 0x7f525ae5888c in binaryurp::IncomingRequest::execute() const binaryurp/source/incomingrequest.cxx:78:26 > #12 0x7f525aebc79b in request binaryurp/source/reader.cxx:85:9 > #13 0x7f52c6ca3303 in cppu_threadpool::JobQueue::enter(long, bool) cppu/source/threadpool/jobqueue.cxx:107:17 > #14 0x7f52c6ccd4a9 in cppu_threadpool::ORequestThread::run() cppu/source/threadpool/thread.cxx:165:31 > #15 0x7f52c6cd9742 in threadFunc include/osl/thread.hxx:185:15 > #16 0x7f52cfcf537f in osl_thread_start_Impl(void*) sal/osl/unx/thread.cxx:240:9 > #17 0x7f52ce2915c9 in start_thread (/lib64/libpthread.so.0+0x75c9) (with a Clang trunk -Og build that likely inlines some calls, so their frames would be missing).