]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Remove invalid entry from the end of std::stacktrace
authorJonathan Wakely <jwakely@redhat.com>
Wed, 15 Oct 2025 13:59:20 +0000 (14:59 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 15 Oct 2025 20:54:56 +0000 (21:54 +0100)
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.

libstdc++-v3/include/std/stacktrace

index 01e18ba171c0e5c2c4e8f46ef67d65d16b480d86..b9e260e19f898ae4412838242b6cf360d04b009d 100644 (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{};