使用 clang 编译时出现正则表达式段错误,可能是编译器错误?

regex segfault when compiling with clang, possible compiler bug?

让我们从重现错误的最少代码开始:

#include <cxxabi.h>
#include <iostream>
#include <regex>

int main()
{

  std::string realname("My amazing string with trailing whitespace ");

  std::string ret = std::regex_replace(
      realname.data(), std::regex{"My amazing string with trailing whitespace ?"},
      "std::string" );

  std::cout << ret << std::endl;
}

如果你用 clang 编译:
clang++ -O2 -g -std=c++14 test.cpp -o crash

这会产生分段错误。
使用 -O1 或更少会起作用,使用 gcc 在所有情况下都起作用,并且不传递 char* 而只是传递 realname 因为 std::string 也可以起作用。

但是原始代码只有 char* 所以我必须执行复制才能获得 std::string.

所以让我们关注带有 clang -O2char* 的版本。

我做了一些调试,它似乎在标准库正则表达式部分崩溃了。 更准确地说,在 regex.tcc 行 501 中读取:

return _M_pregex == __rhs._M_pregex
      && _M_begin == __rhs._M_begin
      && _M_end == __rhs._M_end
      && _M_flags == __rhs._M_flags
      && _M_match[0] == __rhs._M_match[0];

当逐步执行一个没有段错误的二进制文件时,它将按顺序执行这些检查并在 _M_end == __rhs._M_end 之后停止,但是,在崩溃的二进制文件中,我们将看到它首先检查 _M_match[0] == __rhs._M_match[0] 结果在崩溃中。

我很乐意就此获得一些意见,因为我不太确定我是否遗漏了什么...

但如果不是,我会认为这是 clang 优化器中的错误,不是吗?

编辑:clang 版本为 clang version 5.0.0 (trunk 296300)

对噪音表示歉意,在注意到我们系统上提供的 clang5 与上面发布的实际上不是发行版后,我在发行版和 clang3.9 上进行了尝试,并且可以正常工作。

一定是开发过程中的倒退...

再次抱歉,噪音太大了!