]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Make debug sequence members mutable [PR116369]
authorJonathan Wakely <jwakely@redhat.com>
Wed, 21 Aug 2024 11:29:32 +0000 (12:29 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 23 Aug 2024 12:18:20 +0000 (13:18 +0100)
commita35dd276cbf6236e08bcf6e56e62c2be41cf6e3c
tree80d2faa9ee52dc53e49ae174312438608a493403
parent9115593d8517d210ffe7da2c8ec786342381e471
libstdc++: Make debug sequence members mutable [PR116369]

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