Here is updated information if you are interested.  I realize the
recommendation is probably to move to libc++.

This is using clang++-6.0.  Updated test case regex.

clang++-6.0 -std=c++14 -O3 -g test.cpp

--
#include <regex>
#include <string>
#include <iostream>

int main() {
    const std::string& output = regex_replace("test test", std::regex("^test"), 
"hi");
    std::cout << output << "\n";
    return 0;
}
--

Crash:

* thread #1: tid = 7900, 0x0000000000418d9b a.out`std::__cxx11::sub_match<char 
const*>::compare(std::__cxx11::sub_match<char const*> const&) const [inlined] 
std::__cxx11::sub_match<char const*>::str(this=<unavailable>) const at 
regex.h:867, name = 'a.out', stop reason = signal SIGSEGV: invalid address 
(fault address: 0xffffffffffffffc8)
    frame #0: 0x0000000000418d9b a.out`std::__cxx11::sub_match<char 
const*>::compare(std::__cxx11::sub_match<char const*> const&) const [inlined] 
std::__cxx11::sub_match<char const*>::str(this=<unavailable>) const at 
regex.h:867
   864        string_type
   865        str() const
   866        {
-> 867          return this->matched
   868            ? string_type(this->first, this->second)
   869            : string_type();
   870        }


Backtrace:

* thread #1: tid = 7900, 0x0000000000418d9b a.out`std::__cxx11::sub_match<char 
const*>::compare(std::__cxx11::sub_match<char const*> const&) const [inlined] 
std::__cxx11::sub_match<char const*>::str(this=<unavailable>) const at 
regex.h:867, name = 'a.out', stop reason = signal SIGSEGV: invalid address 
(fault address: 0xffffffffffffffc8)
  * frame #0: 0x0000000000418d9b a.out`std::__cxx11::sub_match<char 
const*>::compare(std::__cxx11::sub_match<char const*> const&) const [inlined] 
std::__cxx11::sub_match<char const*>::str(this=<unavailable>) const at 
regex.h:867
    frame #1: 0x0000000000418d9b a.out`std::__cxx11::sub_match<char 
const*>::compare(this=<unavailable>, __s=0xffffffffffffffb8) const + 203 at 
regex.h:883
    frame #2: 0x000000000041633a 
a.out`std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > 
std::regex_replace<std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, char const*, 
std::__cxx11::regex_traits<char>, 
char>(std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, char const*, char const*, 
std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> > const&, char 
const*, std::regex_constants::match_flag_type) [inlined] bool 
std::__cxx11::operator==<char const*>(__lhs=<unavailable>, __rhs=<unavailable>) 
+ 12 at regex.h:938
    frame #3: 0x000000000041632e 
a.out`std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > 
std::regex_replace<std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, char const*, 
std::__cxx11::regex_traits<char>, 
char>(std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, char const*, char const*, 
std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> > const&, char 
const*, std::regex_constants::match_flag_type) [inlined] 
std::__cxx11::regex_iterator<char const*, char, 
std::__cxx11::regex_traits<char> >::operator==(this=0x0000000000419538) const + 
32 at regex.tcc:517
    frame #4: 0x000000000041630e 
a.out`std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > 
std::regex_replace<std::back_insert_iterator<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, char const*, 
std::__cxx11::regex_traits<char>, char>(__out=(container = "�����), 
__first="test test", __last="", __e=<unavailable>, __fmt="hi", __flags=0) + 46 
at regex.tcc:480
    frame #5: 0x0000000000401e3b a.out`main [inlined] 
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > 
std::regex_replace<std::__cxx11::regex_traits<char>, char>(__s=<unavailable>, 
__e=<unavailable>, __fmt=<unavailable>, __flags=0) + 91 at regex.h:2418
    frame #6: 0x0000000000401e03 a.out`main + 35 at test.cpp:7
    frame #7: 0x00007ffff718c830 libc.so.6`__libc_start_main(main=(a.out`main 
at test.cpp:6), argc=1, argv=0x00007fffffffd9f8, init=<unavailable>, 
fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fffffffd9e8) + 
240 at libc-start.c:291
    frame #8: 0x0000000000401d09 a.out`_start + 41

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1748344

Title:
  clang++ regex_replace always segfaults with -O3

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1748344/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to