Compare iterators, not values, in filtered_iterator::operator{==,!=}
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 4 Dec 2019 18:27:21 +0000 (13:27 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 4 Dec 2019 18:27:56 +0000 (13:27 -0500)
commit610cfd618e4ea43a106d2b24ae4fe52af72de1f5
treefb08ac03e354e45224e97542cf1693c030baef3e
parentf47674be8e90a84edae49ec2b781201ea2f050bd
Compare iterators, not values, in filtered_iterator::operator{==,!=}

The == and != operators on filtered_iterator are not doing the
right thing, they compare values pointed by the wrapped iterators
instead of comparing the iterators themselves.

As a result, operator== will return true if the two iterators point to
two equal values at different positions.  operator!= will fail
similarly.

Also, this causes it to deference past-the-end iterators when doing.
For example, in

  for (iter = ...; iter != end_iter; ++iter)

the != comparison dereferences end_iter.  I don't think this should
happen.

I don't think it's a problem today, given that we only use
filtered_iterator to wrap linked lists of threads and inferiors.
Dereferencing past-the-end iterators of these types is not fatal, it
just returns NULL, which is not a value we otherwise find in the lists.
But in other contexts, it could become problematic.

I have added a simple self test that fails without the fix applied.

gdb/ChangeLog:

* filtered-iterator.h (filtered_iterator) <operator==,
operator!=>: Compare wrapped iterators, not wrapped pointers.
* Makefile.in (SUBDIR_UNITTESTS_SRCS): Add
unittests/filtered_iterator-selftests.c.
* unittests/filtered_iterator-selftests.c: New file.
gdb/ChangeLog
gdb/Makefile.in
gdb/gdbsupport/filtered-iterator.h
gdb/unittests/filtered_iterator-selftests.c [new file with mode: 0644]