[review] gdb_vecs.h: Avoid self move assign

Simon Marchi simark@simark.ca
Thu Nov 14 02:57:00 GMT 2019


On 2019-11-12 9:38 a.m., Tom de Vries wrote:
> On 09-11-2019 01:36, Andrew Burgess (Code Review) wrote:
>> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/601
>> ......................................................................
>>
>> gdb_vecs.h: Avoid self move assign
>>
>> While working on another patch I ran into an issue with
>> unordered_remove (in gdb_vecs.h), where removing the last item of the
>> vector can cause a self move assign.
>>
>> When compiling the C++ standard library in debug mode (with
>> -D_GLIBCXX_DEBUG=1) this causes an error to trigger.
>>
>> I've fixed the issue in this patch and provided a unit test.
>>
>> The provided unit test includes an assignment operator which checks
>> for self move assign, this removes the need to compile with
>> -D_GLIBCXX_DEBUG=1 in order to spot the bug.  If you're keen to see
>> the error reported from the C++ standard library then remove operator=
>> from the unit test and recompile GDB with -D_GLIBCXX_DEBUG=1.
>>
>> gdb/ChangeLog:
>>
>> 	* Makefile.in (SUBDIR_UNITTESTS_SRCS): Add new file to the list.
>> 	* unittests/vec-utils-selftests.c: New file.
>> 	* gdbsupport/gdb_vecs.h (unordered_remove): Avoid self move assign.
>>
>> Change-Id: I80247b20cd5212038117db7412865f5e6a9257cd
>> ---
>> M gdb/ChangeLog
>> M gdb/Makefile.in
>> M gdb/gdbsupport/gdb_vecs.h
>> A gdb/unittests/vec-utils-selftests.c
>> 4 files changed, 75 insertions(+), 1 deletion(-)
> 
> Hi,
> 
> this breaks my build with gcc-9:
> ...
> In file included from
> /data/gdb_versions/devel/src/gdb/unittests/vec-utils-selftests.c:23:
> /data/gdb_versions/devel/src/gdb/gdbsupport/gdb_vecs.h: In instantiation
> of 'T unordered_remove(std::vector<T>&, \
> typename std::vector<T>::iterator) [with T =
> selftests::vector_utils_tests::unordered_remove_tests()::obj; typena\
> me std::vector<T>::iterator =
> __gnu_cxx::__normal_iterator<selftests::vector_utils_tests::unordered_remove_tests(\
> )::obj*,
> std::vector<selftests::vector_utils_tests::unordered_remove_tests()::obj> >]':
> /data/gdb_versions/devel/src/gdb/unittests/vec-utils-selftests.c:53:26:
>   required from here
> /data/gdb_versions/devel/src/gdb/gdbsupport/gdb_vecs.h:53:5: error:
> implicitly-declared 'selftests::vector_utils_\
> tests::unordered_remove_tests()::obj::obj(const
> selftests::vector_utils_tests::unordered_remove_tests()::obj&)' i\
> s deprecated [-Werror=deprecated-copy]
>    53 |   T removed = std::move (*it);
>       |     ^~~~~~~
> /data/gdb_versions/devel/src/gdb/unittests/vec-utils-selftests.c:41:10:
> note: because 'selftests::vector_utils_te\
> sts::unordered_remove_tests()::obj' has user-provided
> 'selftests::vector_utils_tests::unordered_remove_tests()::o\
> bj&
> selftests::vector_utils_tests::unordered_remove_tests()::obj::operator=(const
> selftests::vector_utils_tests::\
> unordered_remove_tests()::obj&)'
>    41 |     obj &operator= (const obj &other)
>       |          ^~~~~~~~
> In file included from
> /data/gdb_versions/devel/src/gdb/unittests/vec-utils-selftests.c:23:
> /data/gdb_versions/devel/src/gdb/gdbsupport/gdb_vecs.h:58:10: error:
> implicitly-declared 'selftests::vector_utils\
> _tests::unordered_remove_tests()::obj::obj(const
> selftests::vector_utils_tests::unordered_remove_tests()::obj&)' \
> is deprecated [-Werror=deprecated-copy]
>    58 |   return removed;
>       |          ^~~~~~~
> /data/gdb_versions/devel/src/gdb/unittests/vec-utils-selftests.c:41:10:
> note: because 'selftests::vector_utils_te\
> sts::unordered_remove_tests()::obj' has user-provided
> 'selftests::vector_utils_tests::unordered_remove_tests()::o\
> bj&
> selftests::vector_utils_tests::unordered_remove_tests()::obj::operator=(const
> selftests::vector_utils_tests::\
> unordered_remove_tests()::obj&)'
>    41 |     obj &operator= (const obj &other)
>       |          ^~~~~~~~
> cc1plus: all warnings being treated as errors
> make[1]: *** [Makefile:1647: unittests/vec-utils-selftests.o] Error 1
> ...
> 

I got that too with my recent-ish gcc.  Proposed patch here:

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/626

Simon



More information about the Gdb-patches mailing list