[PATCH] Use _GLIBCXX_ASSERTIONS as _GLIBCXX_DEBUG light

François Dumont frs.dumont@gmail.com
Sun Aug 8 19:34:35 GMT 2021


After further testing here a fixed version which imply less changes.

Moreover I already commit the fixes unrelated with this patch.

     libstdc++: [_GLIBCXX_ASSERTIONS] Activate basic debug checks

     libstdc++-v3/ChangeLog:

             * include/bits/stl_algobase.h (equal): Use runtime-only 
_GLIBCXX_DEBUG check.
             * include/bits/stl_iterator.h [_GLIBCXX_ASSERTIONS]: 
Include <debug/stl_iterator.h>.
             * include/debug/debug.h [_GLIBCXX_ASSERTIONS]: Define debug 
macros non-empty. Most of
             the time do a simple valid_range check.
             * include/debug/helper_functions.h: Cleanup comment about 
removed _Iter_base.
             (__gnu_debug::__valid_range): Add __skip_if_constexpr 
parameter and skip check when true
             and in a constexpr context.
             * include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY): Define as 
__glibcxx_assert when only
             _GLIBCXX_ASSERTIONS is defined.
             (__glibcxx_check_valid_range): Add _SkipIfConstexpr parameter.
             (__glibcxx_check_can_increment_range): Likewise.
             * include/debug/safe_iterator.h (__valid_range): Adapt.
             * include/debug/safe_local_iterator.h (__valid_range): Adapt.
             * testsuite/24_iterators/istream_iterator/1.cc (test01): 
Skip iterator increment when
             _GLIBCXX_ASSERTIONS is defined.
             * testsuite/25_algorithms/copy/constexpr_neg.cc: New test.
             * testsuite/25_algorithms/heap/1.cc: Skip operation 
complexity checks when _GLIBCXX_ASSERTIONS
             is defined.

Ok to commit ?

François


On 06/08/21 4:52 pm, François Dumont wrote:
> On 07/06/21 6:25 am, François Dumont wrote:
>> On 03/06/21 2:31 pm, Jonathan Wakely wrote:
>>>
>>>> +  }
>>>> +
>>>>   /* Checks that [first, last) is a valid range, and then returns
>>>>    * __first. This routine is useful when we can't use a separate
>>>>    * assertion statement because, e.g., we are in a constructor.
>>>> @@ -260,8 +279,9 @@ namespace __gnu_debug
>>>>     inline bool
>>>>     __check_sorted(const _InputIterator& __first, const 
>>>> _InputIterator& __last)
>>>>     {
>>>> -      return __check_sorted_aux(__first, __last,
>>>> -                std::__iterator_category(__first));
>>>> +      return __skip_debug_runtime_check()
>>>> +    || __check_sorted_aux(__first, __last,
>>>> +                  std::__iterator_category(__first));
>>>
>>> Currently this function is never called at all ifndef _GLIBCXX_DEBUG.
>>> With this change, it's going to be present for _GLIBCXX_ASSERTIONS,
>>> and if it isn't inlined it's going to explode the code size.
>>>
>>> Some linux distros are already building the entire distro with
>>> _GLIBCXX_ASSERTIONS so I think we need to be quite careful about this
>>> kind of large change affecting every algo.
>>>
>>> So maybe we shouldn't enable these checks via _GLIBCXX_ASSERTIONS, but
>>> a new macro.
>>>
>> _GLIBCXX_DEBUG is already rarely used, so will be yet another mode.
>>
>> So let's forget about all this, thanks.
>>
> I eventually wonder if your feedback was limited to the use of 
> __check_sorted and some other codes perhaps.
>
> So here is another proposal which activate a small subset of the 
> _GLIBCXX_DEBUG checks in _GLIBCXX_ASSERTIONS but with far less code.
>
> First, the _Error_formatter is not used, the injected checks are 
> simply using __glibcxx_assert.
>
> Second I reduced the number of accitaved checks, mostly the 
> __valid_range.
>
> I also enhance the valid_range check for constexpr because sometimes 
> the normal implementation is good enough to let the compiler diagnose 
> a potential issue in this context. This is for example the case of the 
> std::equal implementation whereas the std::copy implementation is too 
> defensive.
>
>     libstdc++: [_GLIBCXX_ASSERTIONS] Activate basic debug checks
>
>     libstdc++-v3/ChangeLog:
>
>             * include/bits/stl_algobase.h (equal): Use runtime-only 
> _GLIBCXX_DEBUG check.
>             * include/bits/stl_iterator.h [_GLIBCXX_ASSERTIONS]: 
> Include <debug/stl_iterator.h>.
>             * include/debug/debug.h [_GLIBCXX_ASSERTIONS]: Define 
> debug macros non-empty. Most of
>             the time do a simple valid_range check.
>             * include/debug/helper_functions.h: Cleanup comment about 
> removed _Iter_base.
>             (__valid_range): Add __skip_if_constexpr parameter and 
> skip check when in a constexpr
>             context.
>             * include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY): Define 
> as __glibcxx_assert when only
>             _GLIBCXX_ASSERTIONS is defined.
>             (__glibcxx_check_valid_range): Add _SkipIfConstexpr 
> parameter.
>             (__glibcxx_check_can_increment_range): Likewise.
>             * testsuite/24_iterators/istream_iterator/1.cc (test01): 
> Skip iterator increment when
>             _GLIBCXX_ASSERTIONS is defined.
>             * testsuite/25_algorithms/copy/constexpr_neg.cc: New test.
>             * testsuite/25_algorithms/heap/1.cc: Skip operation 
> complexity checks when _GLIBCXX_ASSERTIONS
>             is defined.
>             * 
> testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_neg.cc: 
> Fix dg-prune-output reason.
>             * 
> testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_pred_neg.cc: 
> Likewise.
>             * 
> testsuite/25_algorithms/lower_bound/debug/constexpr_valid_range_neg.cc: 
> Likewise.
>             * 
> testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_neg.cc: 
> Likewise.
>             * 
> testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_pred_neg.cc: 
> Likewise.
>             * 
> testsuite/25_algorithms/upper_bound/debug/constexpr_valid_range_neg.cc: 
> Likewise.
>
> The last fixes below are due to the recent changes to the 
> __glibcxx_assert macro but it is close to the code I am changing so I 
> prefer to fix those here.
>
> Tested under Linux x86_64 w/o _GLIBCXX_ASSERTIONS.
>
> Ok to commit ?
>
> François
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: assertion_mode.patch
Type: text/x-patch
Size: 15915 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20210808/f64389f9/attachment-0001.bin>


More information about the Gcc-patches mailing list