binutils-gdb/gdb/python
Andrew Burgess e7fce05fcf gdb/python: fix use of frame_info_ptr within pending_frame_object
The previous commit added a type trait which identifies types that
should not be used within Python objects, that is, types that are not
trivially default constructible.  As a result of this, it was
discovered that pending_frame_object includes a frame_info_ptr field.

The problem with frame_info_ptr is that its constructor registers the
new frame_info_ptr with the global frame_list.  It is by this
registration that invalidation of frame_info_ptr objects is performed.

As Python is written in C, C++ constructors are not called, so when a
pending_frame_object is created the constructor for the nested
frame_info_ptr field is never run, and the frame_info_ptr is never
registered with the global frame_list.  As a result the frame_info_ptr
will never be invalidated if the frame cache is flushed, this can then
lead to problems where we make use of the 'frame_info *' within the
frame_info_ptr, even though it is no longer valid.

In this commit I change the frame_info_ptr within pending_frame_object
to a 'frame_info_ptr *' and allocate the frame_info_ptr object on the
heap, releasing the object, and resetting the point to NULL, when we
are done with it.  As the pending_frame_object only needs to remain
valid for the duration of frame_unwind_python::sniff, the 'new' and
'delete' both performed within the function.

We can now check that a pending_frame_object is valid by checking if
the 'frame_info_ptr *' is NULL or not.  As the frame_info_ptr is
created in a valid state, and the point is set back to NULL when we
are done with it, we no longer need to compare the frame_info_ptr
object itself against NULL.

The remaining changes in this patch are to dereference the
'frame_info_ptr *' in places where we need the actual object.  In some
cases I need to move the dereference later within a function, after a
validity check, in order to avoid dereferencing a NULL pointer.

Finally, I can add the static_assert that guarantees that
pending_frame_object is now safe for allocation by Python.

I discovered this bug while looking at PR gdb/32120.  That bug is
about a user's custom frame unwinder that triggers a flush of the
frame cache during the sniffer phase (the
RemoteTargetConnection.send_packet call switches thread, which
triggers the frame cache flush).  While looking at that bug I noticed
that the frame_info_ptr within the pending_frame_object wasn't being
reset when the frame cache was flushed.  Fixing this does not resolve
the user's issue, but I thought it was still worth tagging this commit
with the bug link.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32120

Approved-By: Tom Tromey <tom@tromey.com>
2026-05-16 13:16:07 +01:00
..
lib/gdb gdb/dap: add support for opening core files 2026-04-23 09:58:02 +01:00
py-all-events.def gdb/python: new events.corefile_changed event 2026-04-20 22:15:26 +01:00
py-arch.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-auto-load.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-block.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-bpevent.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-breakpoint.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-cmd.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-color.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-color.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-connection.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-continueevent.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-corefile.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-dap.c Rewrite output redirection and logging 2026-02-09 08:15:44 -07:00
py-disasm.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-event-types.def gdb/python: new events.corefile_changed event 2026-04-20 22:15:26 +01:00
py-event.c gdb/python: add accessor helpers for __dict__ in Python extension objects 2026-03-14 13:21:06 +00:00
py-event.h gdb: new setters and getters for __dict__, and attributes 2026-01-29 16:46:14 +00:00
py-events.h gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-evtregistry.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-evts.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-exitedevent.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-finishbreakpoint.c [gdb/python] Use py_{none,notimplemented} more often 2026-05-15 21:38:12 +02:00
py-frame.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-framefilter.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-function.c gdb: switch tuple object helpers to Python limited API equivalents 2026-03-04 15:38:11 +00:00
py-gdb-readline.c Python limited API: migrate Py_CompileStringExFlags and PyRun_SimpleString 2026-01-28 09:41:25 +00:00
py-inferior.c [gdb/python] Use py_{none,false} more often 2026-05-15 21:38:12 +02:00
py-infevents.c Return gdbpy_ref<> from frame_info_to_frame_object 2026-02-23 05:29:12 -07:00
py-infthread.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-instruction.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-instruction.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-lazy-string.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-linetable.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-membuf.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-mi.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-micmd.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-newobjfileevent.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-obj-type.c gdb: add new helpers for retrieving a type's fully qualified name 2026-04-08 11:49:30 +01:00
py-obj-type.h gdb: add new helpers for retrieving a type's fully qualified name 2026-04-08 11:49:30 +01:00
py-objfile.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-param.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-prettyprint.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-progspace.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
py-record-btrace.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-record-btrace.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-record-full.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-record-full.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-record.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-record.h gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-ref.h gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-registers.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-signalevent.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-stopevent.c Return gdbpy_ref<> from value_to_value_object 2026-02-23 05:29:11 -07:00
py-stopevent.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-style.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-symbol.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-symtab.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-threadevent.c [gdb/python] Use py_{none,false} more often 2026-05-15 21:38:12 +02:00
py-tui.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-type.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-uiout.h Remove m_applied_style from ui_file 2026-02-09 08:15:29 -07:00
py-unwind.c gdb/python: fix use of frame_info_ptr within pending_frame_object 2026-05-16 13:16:07 +01:00
py-utils.c gdb: add new helpers for retrieving a type's fully qualified name 2026-04-08 11:49:30 +01:00
py-value.c gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
py-varobj.c Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00
py-xmethods.c [gdb/python] Remove Py_RETURN_{NONE,TRUE,FALSE,NOTIMPLEMENTED} 2026-05-15 21:38:12 +02:00
python-config.py Run isort 2024-04-02 11:21:39 -06:00
python-internal.h gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
python-limited-api-missing.h [gdb/python] Fix check-include-guards check in python-limited-api-missing.h 2026-05-15 14:15:22 +02:00
python-traits.h gdb/python: add type traits check for all PyObject sub-classes 2026-05-16 12:44:37 +01:00
python.c [gdb/python] Use py_{none,false} more often 2026-05-15 21:38:12 +02:00
python.h Update copyright dates to include 2026 2026-01-05 13:16:46 -07:00