TL;DR

Rust の未定義動作を検出するツール。バイナリや cargo のテストを実行し、unsafe なコードが安全性の要件を破っていないかを調べる。

なぜ必要か

unsafe を使ったコードでは、コンパイラが検出できないエラーが起きうる。Effective Rust によると、Miri はコンパイラが出力する中間表現を解釈するので、コンパイラが見つけられないさまざまなエラーを検出できる。

仕組み

Miri の README によると、次のような未定義動作を検出できる。

  • 範囲外へのアクセスと、解放後の使用(use-after-free)
  • 未初期化のデータの使用
  • アラインメントが足りないメモリアクセスや参照
  • 0 でも 1 でもない bool のような、基本的な型の不変条件の違反
  • データ競合
  • Stacked Borrows や Tree Borrows によるエイリアシング規則の違反(実験的な機能)

プログラムの終了時に、グローバルな static から到達できないまま確保されているメモリ(メモリリーク)も報告する。

例

nightly のツールチェインに追加して使う。テストは cargo miri test、バイナリは cargo miri run で実行する。

rustup +nightly component add miri
cargo +nightly miri test

注意点

README によると、Miri は Rust の仕様違反をすべて検出するわけではなく、検出しなかったことは健全性の証明にならない。1 回の実行で調べるのは 1 つの実行経路だけである。実行は遅く、プラットフォーム固有の API や FFI、ネットワークにはほとんど対応していない。

関連

出典