はのは、エラーを再現する最小限のコードから始めましょう:clangでコンパイルするとregex segfault、コンパイラのバグはありますか?
#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++ -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 version 5.0.0 (trunk 296300)
私はclang 3.8のリリース版で最適化されたビルドでこの問題にぶつかります。 –
スタックオーバーフローのために大きな入力文字列を持つlibstdC++バグのようです。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61582 –