[Patch, libstdc++/63497] Avoid dereferencing invalid iterator in regex_executor
Jonathan Wakely
jwakely@redhat.com
Tue Oct 21 10:25:00 GMT 2014
On 20/10/14 10:23 -0700, Tim Shen wrote:
>Bootstrapped and tested.
Did you manage to produce a testcase that crashed on trunk?
>@@ -407,25 +409,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> template<typename _BiIter, typename _Alloc, typename _TraitsT,
> bool __dfs_mode>
> bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
>- _M_word_boundary(_State<_TraitsT>) const
>+ _M_word_boundary(_State<_TraitsT>)
> {
>- // By definition.
>- bool __ans = false;
>- auto __pre = _M_current;
>- --__pre;
>- if (!(_M_at_begin() && _M_at_end()))
>+ bool __left_is_word = false;
>+ if (_M_current != _M_begin
>+ || (_M_flags & regex_constants::match_prev_avail))
> {
>- if (_M_at_begin())
>- __ans = _M_is_word(*_M_current)
>- && !(_M_flags & regex_constants::match_not_bow);
>- else if (_M_at_end())
>- __ans = _M_is_word(*__pre)
>- && !(_M_flags & regex_constants::match_not_eow);
>- else
>- __ans = _M_is_word(*_M_current)
>- != _M_is_word(*__pre);
>+ --_M_current;
>+ if (_M_is_word(*_M_current))
>+ __left_is_word = true;
>+ ++_M_current;
Is it really necessary to modify _M_current here?
Couldn't you do:
auto __pre = _M_current;
if (_M_is_word(*--__pre))
__left_is_word = true;
Then the function could remain const, couldn't it?
More information about the Libstdc++
mailing list