[PATCH][_GLIBCXX_DEBUG] Improve valid_range check
Jonathan Wakely
jwakely@redhat.com
Tue Nov 26 12:21:00 GMT 2019
On 26/11/19 12:33 +0100, Stephan Bergmann wrote:
>On 22/11/2019 18:59, Jonathan Wakely wrote:
>>On 22/11/19 18:38 +0100, François Dumont wrote:
>>> I noticed that we are not checking that iterators are not
>>>singular in valid_range. Moreover __check_singular signature for
>>>pointers is not intercepting all kind of pointers in terms of
>>>qualification.
>>>
>>> I'd like to commit it next week but considering we are in
>>>stage 3 I need proper acceptance.
>>>
>>> * include/debug/functions.h: Remove <bits/move.h> include.
>>> (__check_singular_aux, __check_singular): Move...
>>> * include/debug/helper_functions.h:
>>> (__check_singular_aux, __check_singular): ...here.
>>> (__valid_range_aux): Adapt to use latter.
>>> * testsuite/25_algorithms/copy/debug/2_neg.cc: New.
>>>
>>>Tested under Linux x86_64 normal and debug modes.
>>
>>OK for trunk, thanks.
>
>The curly braces...
>
>>diff --git a/libstdc++-v3/include/debug/helper_functions.h b/libstdc++-v3/include/debug/helper_functions.h
>>index c3e7478f649..5a858754875 100644
>>--- a/libstdc++-v3/include/debug/helper_functions.h
>>+++ b/libstdc++-v3/include/debug/helper_functions.h
>[...]
>>@@ -138,14 +156,23 @@ namespace __gnu_debug
>> inline bool
>> __valid_range_aux(_InputIterator __first, _InputIterator __last,
>> std::input_iterator_tag)
>>- { return true; }
>>+ {
>>+ if (__first != __last)
>>+ return !__check_singular(__first) && !__check_singular(__last);
>>+
>>+ return true;
>>+ }
>> template<typename _InputIterator>
>> _GLIBCXX_CONSTEXPR
>> inline bool
>> __valid_range_aux(_InputIterator __first, _InputIterator __last,
>> std::random_access_iterator_tag)
>>- { return __first <= __last; }
>>+ {
>>+ return
>>+ __valid_range_aux(__first, __last, std::input_iterator_tag{})
>
>...^^^ here...
>
>>+ && __first <= __last;
>>+ }
>> /** We have iterators, so figure out what kind of iterators they are
>> * to see if we can check the range ahead of time.
>>@@ -167,6 +194,9 @@ namespace __gnu_debug
>> typename _Distance_traits<_InputIterator>::__type& __dist,
>> std::__false_type)
>> {
>>+ if (!__valid_range_aux(__first, __last, std::input_iterator_tag{}))
>
>...and ^^^ here are not allowed pre C++11. Replacing those with
>
> std::input_iterator_tag()
>
>should fix it.
Indeed. We should also have tests that use "-std=gnu++98
-D_GLIBCXX_DEBUG" so they'd catch this.
François, can you take care of the fix please?
More information about the Libstdc++
mailing list