Miri は未定義動作 (UB: Undefined Behavior) の検出ツールである。
unsafe を含むコードの検証やその健全性の確認に使われる。
、Miri はまだ実験段階のため、ナイトリー版でのみ動作する。
とはいえ、unsafe なコードを扱う場合、筆者はこのツールはほぼ必須だと考えている。
なぜなら、未定義動作にはエラーの発生有無が偶然に左右される物があり、見逃されやすい。また、Rust のバージョンアップなどで最適化方法が変更されると、その影響を受ける可能性もある。Miri はこれらの問題の対策となる。
それぞれ以下のコマンドから実行できる。
> rustup +nightly component add miri
> cargo +nightly miri run
> cargo +nightly miri test
エラーがあればそれは何らかの未定義動作がある事を示している。
ただし、の重要な点として、後述のモデルによる差異がある。
ツールの性質上、偽陰性は避けられない。
なぜなら、UB になるパターンがテストされていないだけの可能性は常にある。
、Rust のエイリアシングルールは unsafe まわりにまだ曖昧さがある。
これに対して、Miri は二つのモデル Stacked Borrows と Tree Borrows を用意している。どちらでもメモリ安全性は守られるが、後者は制限がより少ない。現在の既定は前者だが、将来的には後者が有力である。後者に切り替える場合、環境変数 MIRIFLAGS に -Zmiri-tree-borrows を指定するとよい。
ちなみに、将来的に Stacked Borrows より Tree Borrows が有力とする根拠は、前者が現状の多くのクレートの実情にそぐわないからである (参考: arraydeque での実例)。