使用clang编译时regex-segfault,可能存在编译器错误
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部分崩溃了。更准确地说,在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];
当遍历一个没有segfault的二进制文件时,它会按顺序执行这些检查,并在_M_end == __rhs._M_end
之后停止,然而,在崩溃的二进制文件中,我们会看到它首先检查_M_match[0] == __rhs._M_match[0]
,这会导致崩溃。
我很乐意得到一些意见,因为我不太确定我是否遗漏了什么。。。
但如果不是,我会认为这是clang优化器中的一个错误,不是吗?
编辑:clang版本为clang version 5.0.0 (trunk 296300)
对噪音表示歉意,在注意到我们系统上提供的clang5如上所述实际上不是发布版本后,我用发布版和clang3.9进行了尝试,它确实有效。
一定是发展过程中的倒退。。。
再说一遍,对噪音感到抱歉!
相关文章:
- 为什么我的编译器无法弄清楚这种转换,它何时存在?
- MSVC 中可能存在的编译器错误
- 我正在调试这个C++程序.编译器不再显示语法错误,但存在隐藏的逻辑错误
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 如果检查和内联条件之间是否存在编译器差异
- C 编译器未检查模板类中是否存在一种方法
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- 如何将我的控制台应用程序链接到使用 clang++ 作为编译器的 OSX 环境中的 /usr/local/lib 中存在
- C++编译器在封装行为上存在分歧 - 哪一个做对了?
- 哪个编译器(如果有的话)在参数包扩展中存在错误
- 使用clang编译时regex-segfault,可能存在编译器错误
- icc崩溃:编译器能在抽象机器中不存在的地方发明写入吗
- MSVC 编译器实例化函数模板的默认定义,即使存在专用化
- c4930可能存在编译器错误
- 我的iOS金属计算内核是否存在编译器错误,或者我遗漏了什么
- MSVC++中可能存在编译器错误
- VS2010 SP1的函数模板中存在编译器错误
- gcc(Linux/MinGW)是否存在编译器标志,以便在运行时引发除以零的错误
- 可能存在编译器错误,本地结构从模板参数(phew)访问函数中的静态变量
- 非活动的#ifdef块中存在编译器错误