Unreal Build Tool (UBT) では、Linux および Android 用の Clang の サニタイザー をサポートしています。このページでは、サポートされているサニタイザーと、ビルドでのサニタイザーの使用方法について説明します。
概要
通常コンパイル時には検出されない多くのタイプのプログラミング エラーがあります。これは、コンパイラがそういったエラーを C++ 構文の有効な使用方法として認識するためです。構文が正しい場合でも、ロジックに不備があると、次をはじめとする望ましくない動作につながることがあります。
- メモリリーク
- 競合状態
- 初期化されていないメモリ
- 配列での範囲外アクセス
- 整数オーバーフロー
通常、これらはランタイム時に試行錯誤によるデバッグを行うことでしか診断することができません。Clang のサニタイザーを有効にしてアプリケーションをビルドすると、これらのエラーを直接報告するログ出力によって、より迅速に検出することができます。
Clang のサニタイザーおよびそのメリットの詳細については、『Clang のドキュメント』を参照してください。
サニタイザーを使用してビルド ツールを実行する
ビルドにサニタイザーを備えるには、目的のサニタイザーの UBT 引数を指定して UnrealBuildTool を実行します。これにより、最終的な実行可能ファイルに目的のサニタイザーがリンクされます。たとえば、次のコマンド ラインでは、アドレス サニタイザー (ASan) をビルドにリンクさせてプロジェクトをビルドします。
Build\BatchFiles\Build.bat MyGame Linux Development -WaitMutex -FromMsBuild -EnableASan
アプリケーションを実行すると、サニタイザーによるエラー検出出力がログに記録されます。これらのビルドは、コマンド ラインから直接実行することができます。または、Visual Studio でプロジェクトの [Properties (プロパティ)] を開いてから、[NMake] > [Build Command Line (ビルド コマンド ライン)] にサニタイザーのコマンドを追加することもできます。
Clang のサニタイザーにより、通常、メモリの消費量が増加するため、サニタイザーによっては、2 分の 1、場合によっては 15 分の 1 までリンクされているプログラムの速度が低下します。詳細については、各サニタイザーの Clang の仕様書をご確認ください。
サポートされているサニタイザー
UBT では、以下のサニタイザーをサポートしています。
サニタイザー | UBT コマンド | 説明 |
---|---|---|
Address Sanitizer (ASan:アドレス サニタイザー) | -EnableASan | 範囲外アクセスやメモリ リークなど、メモリ アクセスに関するさまざまな問題を検出します。 |
HWASan (Android のみ) | -EnableHWASan | Android 向けの ASan のハードウェア アクセラレーション バージョンです。使用メモリが 20 ~ 30% 削減されます。 |
Thread Sanitizer (TSan:スレッド サニタイザー) (Android には未対応) | -EnableTSan | 競合状態など、スレッドに関する問題を検出します。 |
Undefined Behavior Sanitizer (UBSan:未定義動作サニタイザー) | -EnableUBSan | 範囲外エラーや整数オーバーフロー、または未初期化メモリなど、C++ で未定義の動作として認識されるものを検出します。 |
MinUBSan (Android のみ) | -EnableMinUBSan | Android 向けの UBSan の最小バージョンです。 |
Memory Sanitizer (MSan:メモリ サニタイザー) (Linux のみ) | -EnableMSan | 未初期化メモリを読み取ろうとする試みを検出します。 |