AddressSanitizerとは?
あどれすさにたいざー
AddressSanitizerとはメモリの不正アクセスをプログラムの実行中に検出するデバッグツールで、C/C++開発に広く使われます。
AddressSanitizer(ASan)は、メモリに関するバグをランタイムに検出するためのツールです。Googleが開発し、2011年にLLVMプロジェクトへ取り込まれました。現在はClang・GCCに標準で組み込まれており、コンパイル時にオプションを追加するだけで利用できます。
仕組みとしては、コンパイル時にコードへ検査コードを自動挿入(インストルメンテーション)し、実際のメモリアクセスのたびに有効性を確認します。不正アクセスを検出すると、プログラムを即座に停止して詳細なエラーレポートを出力します。
検出できる主なバグの種類は以下のとおりです。
- バッファオーバーフロー(ヒープ・スタック・グローバル)
- 解放済みメモリへのアクセス(use-after-free)
- スコープ外ローカル変数へのアクセス(stack-use-after-scope)
- 二重解放(double-free)
通常のValgrindと比べて実行速度の低下が2倍程度に抑えられているため、大規模プロジェクトでの継続的テストにも実用的です。セキュリティの観点でも、バッファオーバーフローは重大な脆弱性の温床であり、開発段階でASanを有効にして定常的にテストする習慣がOSS・商用ソフト問わず広まっています。
使い方・例文
C++で書いたコードを-fsanitize=addressオプション付きでコンパイルしてテストを実行すると、解放済みメモリへのアクセスが発生した行と呼び出しスタックが即座にレポートされ、デバッグ時間を大幅に短縮できます。
この用語をシェア
最終更新: