error: Undefined Behavior: attempting a write access using <288> at alloc124[0x0], but that tag does not exist in the borrow stack for this location

MIRI においてスタックのアイテムが削除済だった場合のエラー。

検出方法

概要

まず、ポインタ (参照や生ポインタ) の作成時にその参照先と参照元とを紐づける。そして、ポインタの利用時にはその紐づけが残っている事を確認する。ただし、各ポインタはその利用時に競合する紐づけがあると勝手にそれらを外してしまう。そのため、紐づけが外されたポインタを使うと UB となる。

構造

上記の実現のために、メモリや変数には以下のメタ情報が付加される。

ここで、スタックのアイテムには現在の参照元の情報が、タグを含め保管される仕組となる。なお、参照用のタグではそれぞれに固有のものを使うが、生ポインタ用のタグでは個々を区別しないため共通のタグ (記号⊥) を使う。

スタックのアイテムには以下の種類がある (t はタグ)。

動作

上記の構造を利用して、以下のアルゴリズムが適用される。

サンプル

変数 var を生ポインタ var_mtp と可変参照 var_mut から参照する。

この場合、メモリの各アドレスの値、そしてスタックは以下のようになる。