libc++ patch for LWG Issue 2232 - dangling reference for regex_iterators

Marshall Clow mclow.lists at gmail.com
Wed Feb 19 09:17:23 PST 2014


On Feb 14, 2014, at 4:31 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Fri, Feb 14, 2014 at 4:21 PM, Marshall Clow <mclow.lists at gmail.com> wrote:
> Users can write
>         for(sregex_iterator i(s.begin(), s.end(), regex("meow")), end; i != end; ++i)
> 
> binding a temporary regex to const regex& and storing a pointer to it.
> This will compile silently, triggering undefined behavior at runtime.
> 
> Fixing this involves defining constructors for the various regex iterator types from rvalue regexes, and then marking them as “deleted”.
> And tests.
> 
> Would this break (what I assume is) correct code doing things like:
> 
> std::find(sregex_iterator(s.begin(), s.end(), regex("meow")), end, "foo”);  ?

(Recapping a discussion on IRC)

Yes, it would.
And though that code is "technically correct” it (a) is dangerous, and (b) doesn’t do anything useful.

The return result from std::find is an interator into a destroyed object, so you can’t really do anything with that.

The “fix” for this code is simple:

	regex re{“meow”}
	std::find(sregex_iterator(s.begin(), s.end(), re), end, "foo”); 

and now the return value of std::find is valid (until the end of the lifetime of “re”).

See 
	http://cplusplus.github.io/LWG/lwg-active.html#2329
and	http://cplusplus.github.io/LWG/lwg-active.html#2332

for the changes to the (C++14) standard.

— Marshall

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140219/a6ff58c0/attachment.html>


More information about the cfe-commits mailing list