https://gcc.gnu.org/g:aa0bee77b6d3f82b8c76703515767e79adac2738

commit r13-9125-gaa0bee77b6d3f82b8c76703515767e79adac2738
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed Aug 21 12:29:32 2024 +0100

    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.
    
    (cherry picked from commit a35dd276cbf6236e08bcf6e56e62c2be41cf6e3c)

Diff:
---
 libstdc++-v3/include/debug/safe_base.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/debug/safe_base.h 
b/libstdc++-v3/include/debug/safe_base.h
index 1dfa9f68b65b..7169bb8ff376 100644
--- a/libstdc++-v3/include/debug/safe_base.h
+++ b/libstdc++-v3/include/debug/safe_base.h
@@ -191,10 +191,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;

Reply via email to