使用 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 -O2
和 char*
的版本。
我做了一些调试,它似乎在标准库正则表达式部分崩溃了。
更准确地说,在 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 上进行了尝试,并且可以正常工作。
一定是开发过程中的倒退...
再次抱歉,噪音太大了!
让我们从重现错误的最少代码开始:
#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 -O2
和 char*
的版本。
我做了一些调试,它似乎在标准库正则表达式部分崩溃了。
更准确地说,在 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 上进行了尝试,并且可以正常工作。
一定是开发过程中的倒退...
再次抱歉,噪音太大了!