ポインタはただの整数ではない — Rustのprovenanceがコンパイラの最適化を左右する
Pointer Provenance in Rust vs. C++: Pointers Are Not Just Glorified Ints

ポインタの出自(provenance)とは何かを、LLVM IRを覗きながらC++とRustで比較した記事。C++でアドレスをuintptr_tにキャストするとprovenanceが露出し、コンパイラは最適化を諦める。Rustのaddr()やwith_addr()、without_provenance()を使えば意図を明示でき、Miriが不正な使い方を検出してくれる。ただし現状の最適化結果は両者とも同じだったという。
provenanceとはつまり、ポインタが「どのアロケーション」に由来するかを追跡する隠れた情報であり、LLVMはこれを最適化に利用している。
HNでの議論
12- afdbcreid
Rustのメモリモデルを支える著名な開発者の一人であり、RustBeltの作者でもあるRalf Jung氏のポインタに関する連載は非常に参考になります:
https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html
https://www.ralfj.de/blog/2020/12/14/provenance.html
https://www.ralfj.de/blog/2022/04/11/provenance-exposed.html
- uecker
私の知る限り、provenanceはLLVMでもGCCでもまだ混沌としています。
- jayd16
C++のポインタ演算はこの記事の内容を無効にするのでしょうか、それとも何か別の魔法があるのでしょうか?