Rustで
struct A { i: i32 }
fn main() {
let mut a = A { i: 0 };
let ptr = &mut a as *mut A;
let ai = &a.i;
unsafe {
(*ptr).i = 10;
}
print!("{} {}", a.i, ai);
}
とするとリリースビルドでも10 10が出力されるんだけど、Rustはimmutable borrowを証拠にした参照の最適化はしないと思っていいのかな(ナイーブにはaiがimmutable borrowであることを利用して*aiを0に置き換えるような最適化が起きてもおかしくない気がする)
unsafeがどれくらいunsafeなのか知りたいんだけどそういうことを書いてあるドキュメントが見つからない
@osa_k Ralf Jung氏のブログとRustBelt論文を読むのが近道だと思います! 手軽にやるならMIRIを動かす
@osa_k unsafeとは単にUB(unsoundともいう)の可能性があるコードを許容するかどうかというだけなわけですが、UBかどうかはかなり繊細なセマンティックスになってしまうので、一般向けドキュメントにあることを期待せずにはじめからこのへんの専門家が整備したものを見るのがいいと思ってます
@qnighy なるほど一理ある……。時間があったら読んでみます。とはいえ本当にやりたいのはView typesがないことによるエラーの迂回なのでそっちが一段落してからにします