AddressSanitizer の既知の問題

Note

今後のリリースで期待する内容に関するフィードバックをお送りください。また、問題にぶつかった場合はバグを報告してください。

互換性のないオプションと機能

これらのオプションと機能は /fsanitize=address と互換性がないため、無効にするか回避してくだい。

標準ライブラリのサポート

MSVC 標準ライブラリ (STL) は、AddressSanitizer を理解し、他のチェックを提供するために部分的に対応されています。 詳細については、コンテナー オーバーフロー エラーを参照してください

注釈が無効になっているか、サポートされていないバージョンの場合、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\System32C:\Windows\SysWOW64 には置かれません。

カスタム プロパティ シートのサポート

Visual Studio IDE の [プロパティ マネージャー] ウィンドウでは、カスタム .props ファイルをプロジェクトに追加できます。 [アドレスサニタイザー有効にする] プロパティ (<EnableASAN>) が表示されている場合でも、ビルドではこのプロパティが優先されません。 その理由は、カスタム .props ファイルは Microsoft.cpp.props の後に追加されて、そこでは <EnableASAN> 値を使用して他のプロパティが設定されるからです。

回避策として、プロジェクトのルートにファイルを Directory.Build.props 作成して、<EnableASAN> プロパティを定義できます。 詳細については、「C++ ビルドのカスタマイズ」を参照してください。

関連項目

AddressSanitizer の概要
AddressSanitizer のビルドと言語リファレンス
AddressSanitizer ランタイム リファレンス
AddressSanitizer シャドウ バイト
AddressSanitizer クラウドまたは分散テスト
AddressSanitizer デバッガーの統合
AddressSanitizer エラーの例