使用clang编译时regex-segfault,可能存在编译器错误

regex segfault when compiling with clang, possible compiler bug?

本文关键字:存在 编译器 错误 clang 编译 regex-segfault 使用      更新时间:2023-10-16

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

#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部分崩溃了。更准确地说,在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进行了尝试,它确实有效。

一定是发展过程中的倒退。。。

再说一遍,对噪音感到抱歉!