- Alloc/dealloc の不一致および new/delete 型の不一致
- ヒープに対して大きすぎる割り当て
- calloc オーバーフローおよび alloca オーバーフロー
- Double free と use after free
- グローバル変数のオーバーフロー
- ヒープ バッファー オーバーフロー
- アラインされた値の不正なアラインメント
- memcpy と strncat のパラメーター オーバーラップ
- スタック バッファー オーバーフローおよびアンダーフロー
- Stack use after return と use after scope
- ポイズニング後のメモリ使用
コンパイラーで ASan を有効にする
Address Sanitizer は Visual Studio プロジェクト システム、CMake ビルド システム、および IDE と統合されています。プロジェクトでは、追加のコンパイラー オプション/fsanitize=address を使用するか、Visual Studio でプロジェクト プロパティを設定することで AddressSanitizer を有効にできます。
このオプションは、x64 のすべての最適化レベルと構成に対応しています。ただし
edit-and-continue、incremental linking、および /RTC とは互換性がありません。これらは ASan でコンパイルする前に無効にする必要があります。$(VC_LibraryPath_VC_x64) の値が一覧の最後にあることを確認してください。
ASan ランタイム要件
ゲームを ASan 有効でビルドすると、機能を有効化するために、実行時に追加の DLL が存在する必要があります。既定では、コンパイラーで ASan が有効になっていると、その DLL がプロジェクトの出力ディレクトリにコピーされ、実行可能ファイルと共にコンソールにデプロイされます。 必要に応じて、DLL は Visual Studio の$(VC_ExecutablePath_x64) ディレクトリ内で手動で見つけることができます。ビルド バージョンに応じて、XBOX では次のいずれかが必要です。
ランタイム デバッガー サポート
ASan を有効にしたゲームをデバッガーをアタッチした状態で実行すると、エラーが見つかった場合はデバッガーで中断し、エラーが発生した場所を特定できる詳細なレポートが表示されます。 一方、自動テスト フレームワークなどでデバッガーをアタッチせずに実行している場合、エラー情報は標準出力に表示され、ゲームは終了します。これは有用ですが、クラッシュの根本原因を特定するにはより多くの状態情報が必要な場合があります。そこで役立つのがクラッシュ ダンプ サポートです。デバッガーをアタッチせずに実行し、その時点でシンボル解決が必要な場合、
llvm-symbolizer.exe ファイルをゲーム EXE と一緒にデプロイする必要があります。このファイルは上記の ASan ランタイム DLL と同じ場所にあります。ランタイム クラッシュ ダンプ サポート
Visual Studio 16.9.8 または 16.10.2 以降、ASan はエラーに関連付けられたメタデータを含むクラッシュ ダンプ ファイルを保存するように構成できます。Visual Studio のデバッガーは、ダンプ ファイルに保存されたメタデータを解析し、クラッシュの追加コンテキストを提供します。ビルドごとにこのクラッシュ ダンプ保存を構成し、これらのバイナリ アーティファクトを保存して、適切なソース インデックスを備えた IDE で表示できます。 クラッシュ ダンプのドキュメントはこちらにあります: クラッシュ ダンプの構成 (Microsoft Docs) ただし、上記でリンクされているアプローチには環境変数の設定が必要で、これは XBOX ではサポートされていないため、代替方法が実装されました。XBOX タイトルにクラッシュ ダンプ サポートを追加するには、以下の 3 つの例のように、必要なクラッシュ ダンプ ファイル名情報を ASan に提供する関数コールバックを定義するだけで済みます。ファイル名は通常、Visual Studio IDE の慣習に従って .dmp サフィックスを付けます。
前の関数と同様に、このオーバーライドは XBOX では任意ですが、デバッガーをアタッチせずに ASan 情報を収集するためにクラッシュ ダンプを使用したい場合は強く推奨します。ダンプ ファイル名を提供したが、ダンプ タイプのオーバーライドを提供しなかった場合、XBOX で有効なクラッシュ ダンプを生成できません。
ASan コードの例
このコードは、これらの関数を既存のコードベースに簡単に追加し、必要に応じて調整する方法を示します。既知の問題
- Visual Studio 2019 (16.11) の ASan は Game OS と互換性がありません。
- ASan DLL は Game OS と互換性がなく、17.12 および 17.13 の初期リリースでは読み込みに失敗します。これは 17.12.6 および 17.13.3 で修正されています。
- Visual Studio 2022 で Game OS の ASan サポートに関する起動時クラッシュを引き起こす回帰は、17.14.29 および Visual Studio 2026 の 18.4.1 で修正されました。
- XBOX 上でデバッガー配下で実行しているとき、以下の例外メッセージが一定の間隔で発せられますが、無視して問題ありません。
