mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
524bca2e33
commit
6c272ca18b
|
@ -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{};
|
||||
|
|
Loading…
Reference in New Issue