forked from Imagelibrary/binutils-gdb
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 e80aaf6183
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.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 ());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user