libstdc++: Remove invalid entry from the end of std::stacktrace

The backtrace_simple function seems to consistently invoke the callback
with an invalid -1UL value as the last entry, which seems to come from
_Unwind_Backtrace. The glibc backtrace(3) function has a special case to
not include that final invalid address, but libbacktrace doesn't seem to
handle it. Do so in std::stacktrace::current() instead.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::current): Call
	_M_trim before returning.
	(basic_stacktrace::_M_trim): New member function.
This commit is contained in:
Jonathan Wakely 2025-10-15 14:59:20 +01:00 committed by Jonathan Wakely
parent 524bca2e33
commit 6c272ca18b
No known key found for this signature in database
1 changed files with 14 additions and 0 deletions

View File

@ -208,6 +208,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
if (_S_current(__cb, std::__addressof(__ret)))
__ret._M_clear();
else
__ret._M_trim();
}
return __ret;
}
@ -224,6 +226,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
if (_S_current(__cb, std::__addressof(__ret), __skip))
__ret._M_clear();
else
__ret._M_trim();
}
return __ret;
@ -260,6 +264,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
}
}
else
__ret._M_trim();
}
return __ret;
}
@ -651,6 +657,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
};
void
_M_trim() noexcept
{
// libbacktrace adds an invalid -1UL entry at the end, remove it.
if (!empty() && !end()[-1])
_M_impl._M_resize(size() - 1, _M_alloc);
}
[[no_unique_address]] allocator_type _M_alloc{};
_Impl _M_impl{};