2017-11-15 8 views
1

はのは、エラーを再現する最小限のコードから始めましょう: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*を渡さずにrealnamestd::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 version 5.0.0 (trunk 296300)

答えて

0

謝罪で、上に掲載され、当社のシステム上で提供さclang5が実際にリリースバージョンではないことに気づいた後、私はリリースとclang3.9でそれを試してみましたが、それが動作。

は、ノイズのために申し訳ありませんが、...開発中に再び

回帰されている必要があります!

+0

私はclang 3.8のリリース版で最適化されたビルドでこの問題にぶつかります。 –

+0

スタックオーバーフローのために大きな入力文字列を持つlibstdC++バグのようです。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61582 –