指针很复杂 II,或者:我们需要更好的语言规范

主要观点:编译器中间表示(IR)需有精确语义,以确保优化正确;指针除地址外还有来源(provenance),不同优化组合可能导致错误;LLVM存在相关 bug 需明确指针和整数的 provenance 情况来修复。
关键信息:

  • 以计算n * (i+j)的 C 代码为例,说明编译器优化需单独正确,不同优化组合可能导致意外结果,如整数溢出问题,而在 LLVM IR 中情况不同。
  • 对一段 C 代码进行一系列看似合理的优化,最终结果与原程序行为不同,表明这些优化组合不正确,揭示了指针的 provenance 等问题。
  • 指出要解决此问题,需明确指针有 provenance 而整数没有,如 LLVM bug #34548 所提议,这也对应了一些标准提案。
    重要细节:
  • 介绍了暖身示例,强调编译器优化要单独正确,避免引入未定义行为(UB)。
  • 详细分析三个优化步骤及其中涉及的指针和整数的 provenance 问题,如最后一个优化中对q[0]的替换,以及前两个优化中对指针和整数的处理。
  • 讨论了不同选项来修复问题,如认为指针和整数都有 provenance 等,认为指针有 provenance 而整数没有更合理。
  • 提到 Rust 的 Miri 解释器和 LLVM 的 Alive 工具在规范制定方面的进展,以及相关规范工作的缓慢和困难。
阅读 8
0 条评论