2017-04-13 22 views
3

次のコードスニペットでは簡単なエラーはありませんが、私はAddressSanitizerのようなツールでそれをキャッチすることが予想されます。 std :: vectorの手動中毒

#include <vector> 
#include <iostream> 

int main() 
{ 
std::vector<int> toto; 
toto.push_back(2); 
int const& titi = toto[0]; 
toto.pop_back(); 
std::cout << titi << std::endl; 
return 1; 
} 

範囲外エラーが利用ヒープ後にフリースローされたキャッチ参照ベクトルと印刷をscopping

スコープが存在しない場合、std :: vector実装はおそらくpop_backの後にメモリを解放しないため、参照はまだ有効なのメモリを指しています。

私の周りの検索持っていると私は、これはSTLライブラリで実装されている場合は、私は手動で毒メモリを思っていたことが判明。これは、クランのlibcの++とのlibstdc Googleの支店++(に実装されている(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning

+0

おそらく、ランタイムライブラリの1つがデバッグビルドでこれを行います。しかし、私は、あなたが必要とするものだけを支払うという原則に反しているので、リリースビルドでこれを期待しません。 –

答えて

3

詳細はAsan wikiを参照してください)。

この機能の1つの問題は、別の消毒機能、つまりアプリの一部だけをサニタイズする機能(例:実行可能で、libではなく)のみを破ることです。問題は、ベクタがunsanitizedでプッシュされ、サニタイズされたコードでポップされた場合、プッシャーはバッファを呼び出す必要がないことを認識しません。

関連する問題