This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Iterate by index in auto_load_safe_path_vec_update


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6e22e10d63addd60f39114cef81ade290b15b2c8

commit 6e22e10d63addd60f39114cef81ade290b15b2c8
Author: Simon Marchi <simon.marchi@ericsson.com>
Date:   Tue Apr 10 16:50:59 2018 -0400

    Iterate by index in auto_load_safe_path_vec_update
    
    As reported by Jan, we get this error when building with -D_GLIBCXX_DEBUG:
    
    /usr/include/c++/7/debug/safe_iterator.h:297:
    Error: attempt to increment a singular iterator.
    Objects involved in the operation:
        iterator "this" @ 0x0x7fffffffd140 {
          type = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<char, gdb::xfree_deleter<char> >*, std::__cxx1998::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > > >, std::__debug::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > > > (mutable iterator);
          state = singular;
          references sequence with type 'std::__debug::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > >' @ 0x0x265db40
        }
    
    The bug was introduced by commit
    
    commit e80aaf6183c6692ecc167bf26cbdc53f8f1a55f0
    Author: Simon Marchi <simon.marchi@polymtl.ca>
    Date:   Fri Mar 2 23:22:06 2018 -0500
    Make delim_string_to_char_ptr_vec return an std::vector
    
    The problem is that we iterate using a range-based for on a vector to
    which we push in the loop.  Pushing to the vector invalidates the
    iterator used in the loop.  Instead, change the code to iterate by index
    as was done in the previous code.
    
    gdb/ChangeLog:
    
    	* auto-load.c (auto_load_safe_path_vec_update): Iterate by
    	index.

Diff:
---
 gdb/ChangeLog   | 5 +++++
 gdb/auto-load.c | 7 +++----
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d46ecdd..6ed9d6c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2018-04-10  Simon Marchi  <simon.marchi@ericsson.com>
+
+	* auto-load.c (auto_load_safe_path_vec_update): Iterate by
+	index.
+
 2018-04-10  Pedro Alves  <palves@redhat.com>
 
 	* gdbthread.h (finish_thread_state_cleanup): Delete declaration.
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index e426468..33d282a 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -197,20 +197,19 @@ auto_load_expand_dir_vars (const char *string)
 static void
 auto_load_safe_path_vec_update (void)
 {
-  unsigned len;
-  int ix;
-
   if (debug_auto_load)
     fprintf_unfiltered (gdb_stdlog,
 			_("auto-load: Updating directories of \"%s\".\n"),
 			auto_load_safe_path);
 
   auto_load_safe_path_vec = auto_load_expand_dir_vars (auto_load_safe_path);
+  size_t len = auto_load_safe_path_vec.size ();
 
   /* Apply tilde_expand and gdb_realpath to each AUTO_LOAD_SAFE_PATH_VEC
      element.  */
-  for (gdb::unique_xmalloc_ptr<char> &in_vec : auto_load_safe_path_vec)
+  for (size_t i = 0; i < len; i++)
     {
+      gdb::unique_xmalloc_ptr<char> &in_vec = auto_load_safe_path_vec[i];
       gdb::unique_xmalloc_ptr<char> expanded (tilde_expand (in_vec.get ()));
       gdb::unique_xmalloc_ptr<char> real_path = gdb_realpath (expanded.get ());


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]