サニタイザのサポート

一般的な注意事項

Clang のサニタイザを使うときは当然 Clang (USECLANG=1) を使ったビルドが必要ですが、もう一つ注意事項があります: 大部分のサニタイザはホストコンパイラによって提供されるランタイムライブラリを利用しますが、Julia の JIT が生成する計測対象のコードもそのライブラリの機能を使います。これはホストコンパイラの LLVM バージョンと Julia が使う LLVM ライブラリのバージョンが一致しなければならないことを意味します。

簡単な解決法は、バージョンが一致するツールチェインが含まれる専用のフォルダを作ることです。BUILD_LLVM_CLANG=1 と設定するとこれを行えます。変数 CC, CXX を上書きしてから USECLANG=1 とすれば、このツールチェインを他のビルドフォルダから参照できます。

アドレスサニタイザ (ASAN)

メモリバグの検出とデバッグには Clang の アドレスサニタイザ (ASAN) を利用できます。SANITIZE=1 としてコンパイルすると Julia コンパイラと生成されるコードで ASAN が有効になります。加えて LLVM_SANITIZE=1 とすれば LLVM ライブラリのサニタイザも可能です。これらのオプションは性能とメモリを大きく犠牲にすることに注意してください。例えば Julia と LLVM に対して ASAN を使うと testall1 は 8 倍から 10 倍遅くなり、メモリ使用量は 20 倍になります (後述のオプションを使えばどちらも 3 倍から 4 倍程度に抑えられます)。

デフォルトで Julia は allow_user_segv_handler=1 というシグナルの伝達を正しく行うために必要な ASAN のフラグを設定します。他のオプションは環境変数 ASAN_OPTIONS で定義できますが、この環境変数を使うときはデフォルトの allow_user_segv_handler=1 フラグを書く必要があります。例えば fast_unwind_on_malloc=0malloc_context_size=2 を指定すれば、バックトレースの正確さを犠牲にしてメモリ使用量を抑えられます。現在の Julia は detect_leaks=0 も設定しますが、これは将来削除されるはずです。

メモリサニタイザ (MSAN)

Clang の メモリサニタイザ (MSAN) を使うと未初期化のメモリが使われたことを検出できます。使用するには SANITIZE_MEMORY=1 としてコンパイルしてください。

広告