2017-11-13 2 views
16

によっては、これはポインタがぶら下がっています。 アドレスサニタイザーでこのようなエラーをキャッチすることは可能ですか?のstd :: string_view一時的な文字列にキャッチ牙山

UPD。このバグ報告

+0

のみスタックアドレスの検出によって返され、どちらか何かを見つけるcouldntの、一時的な戻り値を破壊ません。 – Laurijssen

答えて

3

私の推測では、(あなたがコンパイラのバージョンを提供していない)牙山がそれをサニタイズすることはできませんのでoperator <<が外部に実装されていることで、エラーを検出します(asanでlibstdC++を再構築しない限り)。ここで私は私のGCC 6.2(私はc++1zへのアクセスを持っていないとして、私は少し変更しREPRO)で得るものです:

call operator delete(void*) 
.L17: 
    movq %rbx, %rsi 
    movl std::cout, %edi 
    call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) 
    call std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) 
+0

'std :: cout << bar'を例えば' std :: string bar2 = bar; 'に置き換えてください。 – vladon

+2

@vladonこれは非常に異なる状況です。文字列が16文字より長い場合、私のために動作します(つまり、ヒープ使用後のレポート)。短い文字列の場合、SSOを取得します。つまり、データがスタックに保持され、Asanはヒープエラーを検出できなくなります。 – yugr

関連する問題