AddressSanitizer の既知の問題
互換性のないオプションと機能
これらのオプションと機能は /fsanitize=address
と互換性がないため、無効にするか回避してくだい。
/RTC
オプションは AddressSanitizer と互換性がないため、無効にする必要があります。- インクリメンタル リンクはサポートされていないため、無効にする必要があります。
- エディットコンティニュ はサポートされていないため、無効にする必要があります。
- コルーチンは AddressSanitizer と互換性がなく、再開可能な関数がインストルメンテーションから除外されています。
- OpenMP はサポートされていないため、無効にする必要があります。
- マネージド C++ はサポートされていないため、無効にする必要があります。
- C++ AMP はサポートされていないため、無効にする必要があります。
- ユニバーサル Windows プラットフォーム (UWP) アプリケーションはサポートされていません。
- 特別なケース リスト ファイルはサポートされていません。
- MFC 省略可能な
alloc_dealloc_mismatch
ランタイム オプションの使用はサポートされていません。
標準ライブラリのサポート
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;
}
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 エラーの例