diff mbox series

[committed] libstdc++: Make debug sequence members mutable [PR116369]

Message ID 20240823122120.959471-1-jwakely@redhat.com
State New
Headers show
Series [committed] libstdc++: Make debug sequence members mutable [PR116369] | expand

Commit Message

Jonathan Wakely Aug. 23, 2024, 12:21 p.m. UTC
Tested x86_64-linux. Pushed to trunk.

-- >8 --

We need to be able to attach debug mode iterators to const containers,
so the safe iterator constructor uses const_cast to get a modifiable
pointer to the container. If the container was defined as const, that
const_cast to access its members results in undefined behaviour.  PR
116369 shows a case where it results in a segfault because the container
is in a rodata section (which shouldn't have happened, but the undefined
behaviour in the library still exists in any case).

This makes the _M_iterators and _M_const_iterators data members mutable,
so that it's safe to modify them even if the declared type of the
container is a const type.

Ideally we would not need the const_cast at all. Instead, the _M_attach
member (and everything it calls) should be const-qualified. That would
work fine now, because the members that it ends up modifying are
mutable. Making that change would require a number of new exports from
the shared library, and would require retaining the old non-const member
functions (maybe as symbol aliases) for backwards compatibility. That
might be worth changing at some point, but isn't done here.

libstdc++-v3/ChangeLog:

	PR c++/116369
	* include/debug/safe_base.h (_Safe_sequence_base::_M_iterators):
	Add mutable specifier.
	(_Safe_sequence_base::_M_const_iterators): Likewise.
---
 libstdc++-v3/include/debug/safe_base.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/libstdc++-v3/include/debug/safe_base.h b/libstdc++-v3/include/debug/safe_base.h
index d5fbe4b1320..88d7f0b05c8 100644
--- a/libstdc++-v3/include/debug/safe_base.h
+++ b/libstdc++-v3/include/debug/safe_base.h
@@ -205,10 +205,10 @@  namespace __gnu_debug
 
   public:
     /// The list of mutable iterators that reference this container
-    _Safe_iterator_base* _M_iterators;
+    mutable _Safe_iterator_base* _M_iterators;
 
     /// The list of constant iterators that reference this container
-    _Safe_iterator_base* _M_const_iterators;
+    mutable _Safe_iterator_base* _M_const_iterators;
 
     /// The container version number. This number may never be 0.
     mutable unsigned int _M_version;