AddressSanitizer の既知の問題
互換性のないオプションと機能
これらのオプションと機能は /fsanitize=address
と互換性がないため、無効にするか回避してくだい。
-
/RTC
オプションは AddressSanitizer と互換性がないため、無効にする必要があります。 - インクリメンタル リンクはサポートされていないため、無効にする必要があります。
- エディットコンティニュ はサポートされていないため、無効にする必要があります。
- コルーチンは AddressSanitizer と互換性がなく、再開可能な関数がインストルメンテーションから除外されています。
- OpenMP はサポートされていないため、無効にする必要があります。
- マネージド C++ はサポートされていないため、無効にする必要があります。
- C++ AMP はサポートされていないため、無効にする必要があります。
- ユニバーサル Windows プラットフォーム (UWP) アプリケーションはサポートされていません。
- 特別なケース リスト ファイルはサポートされていません。
標準ライブラリのサポート
MSVC 標準ライブラリ (STL) は、AddressSanitizer を理解し、他のチェックを提供するために部分的に対応されています。 詳細については、 container-overflow エラーを参照してください。
注釈が無効になっているか、サポートされていないバージョンの場合、STL コードで発生した AddressSanitizer 例外によって、真のバグが引き続き識別されます。 ただし、これらは正確ではありません。
この例では、精度の欠如と注釈を有効にする利点を示します。
// Compile with: cl /fsanitize=address /Zi
#include <vector>
int main() {
// Create a vector of size 10, but with a capacity of 20.
std::vector<int> v(10);
v.reserve(20);
// In versions prior to 17.2, MSVC ASan does NOT raise an exception here.
// While this is an out-of-bounds write to 'v', MSVC ASan
// ensures the write is within the heap allocation size (20).
// With 17.2 and later, MSVC ASan will raise a 'container-overflow' exception:
// ==18364==ERROR: AddressSanitizer: container-overflow on address 0x1263cb8a0048 at pc 0x7ff6466411ab bp 0x005cf81ef7b0 sp 0x005cf81ef7b8
v[10] = 1;
// Regardless of version, MSVC ASan DOES raise an exception here, as this write
// is out of bounds from the heap allocation.
v[20] = 1;
}
演算子 new と delete のオーバーライド
AddressSanitizer (ASAN) には、operator new
のカスタム バージョンと、alloc_dealloc_mismatch
などの割り当てエラーを見つけるために使用する operator delete
があります。
/INFERASANLIBS
を使用してリンカーを実行すると、ASAN の new
/delete
オーバーライドの優先順位が低くなります。これにより、リンカーは ASAN のカスタム バージョンよりも他のライブラリの operator new
または operator delete
オーバーライドを選択できます。 このような場合、ASAN はカスタム operator new
と operator delete
に依存するいくつかのエラーをキャッチできない可能性があります。
MFC には、operator new
と operator delete
のカスタム オーバーライドが含まれているため、alloc_dealloc_mismatch
などのエラーが見逃される可能性があります。
Windows バージョン
特定の Windows バージョンとの依存関係があるため、サポートを Windows 10 に焦点を合わせています。 MSVC AddressSanitizer は、10.0.14393 (RS1)、および 10.0.21323 (プレリリース Insider ビルド) でテストされました。 問題にぶつかった場合は、バグを報告してください。
メモリ使用量
AddressSanitizer ランタイムは、実行中にメモリを OS に対して解放しません。 OS の視点から見ると、メモリ リークが発生しているように見えるかもしれません。 この設計上の決定は意図したもので、必要なすべてのメモリを事前に割り当てないようにするためのです。
AddressSanitizer ランタイム DLL の場所
clang_rt.asan*.dll
ランタイム ファイルは、コンパイラの横の %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\
にインストールされます。 これらの場所は、パスのデバッグ セッションと、Visual Studio 開発者コマンド プロンプトで確認できます。 これらのファイルは、C:\Windows\System32
や C:\Windows\SysWOW64
には置かれません。
カスタム プロパティ シートのサポート
Visual Studio IDE の [プロパティ マネージャー] ウィンドウでは、カスタム .props
ファイルをプロジェクトに追加できます。
Enable Address Sanitizer プロパティ (<EnableASAN>
) が表示されていても、ビルドではこのプロパティは使用されません。 その理由は、カスタム .props
ファイルは Microsoft.cpp.props
の後に追加されて、そこでは <EnableASAN>
値を使用して他のプロパティが設定されるからです。
回避策として、プロジェクトのルートにファイルを Directory.Build.props
作成して、<EnableASAN>
プロパティを定義できます。 詳細については、「C++ ビルドのカスタマイズ」を参照してください。
関連項目
AddressSanitizer の概要
AddressSanitizer のビルドと言語リファレンス
AddressSanitizer ランタイム リファレンス
AddressSanitizer シャドウ バイト
AddressSanitizer クラウドまたは分散テスト
AddressSanitizer デバッガーの統合
AddressSanitizer エラーの例