指针不是「带类型的整数」:用 LLVM IR 拆开 Rust 与 C++ 的 provenance
来源:sofiabelen.github.io — 2026-11-14
📋 概述
作者想「看见」指针 provenance 却找不到可打印的字段,因为它是纯编译器抽象,并不存在于地址旁边(CHERI 这类架构是例外)。于是他改读 LLVM IR:编译器为每个指针构造一张 DAG,记录它来自哪次分配、能碰哪些内存,若 root 不同就能断定两个指针不可能别名。C++ 一旦把指针转成整数,LLVM 必须假设任何人可能改过那块内存,优化全部作废;Rust 则提供 API 把「我只读地址、不转回指针」的意图讲清楚。
🔑 核心要点
- 经典例子:函数先比较指针再读,Clang 直接优化成返回 1,因为不同对象的指针比较没有意义。
- provenance 记录的是「这个指针属于哪次分配」,所以指针不是带类型的整数。
- 想观察它只能读 IR:DAG 的 root 不同,就是别名分析的确定结论。
- 指针转整数会让编译器放弃优化——哪怕你只是想读一下地址。
- Rust 的 provenance API 让这种意图可表达,而 C++ 除了整体投降没有别的说法。
💡 金句
for every pointer, the compiler keeps track of which allocation it belongs to and may, therefore, touch.
← 返回 Lobsters 首页
👍 0
👎 0