Polonius学习笔记

写于2022年1月21日。

Polonius是一个推理引擎,基于MIR层输入的控制流图、变量信息、借用信息、生存期约束信息,推导出程序中是否有语句违反Rust对于借用的约定规则,以便编译器报告语法错误,并尽可能向用户提供有帮助的改进建议。

基本概念

Polonius的输入信息,通过「原子式(Atom)」与「输入事实(AllFacts)」两个概念来表达。原子式是输入信息的概念分类,而输入事实是一系列给定的真命题。

Polonius引擎则基于这些真命题,按照一系列的分析规则,推导出矛盾(即错误)信息,再返回给编译器以报告编译错误。(无矛盾信息生成时,视为借用检查通过,将不会产生编译错误。)

分析流程

  1. 初始化分析:计算MIR各个位置(Point)处变量(Variable)的初始化、逆初始化(被移动)的状态,与该处发生「移动后访问」错误的路径(Path)(若有)。
  2. 存活性分析:计算MIR各个位置(Point)处,分别有哪些借用源(Origin)存活。
  3. 借债分析:计算MIR各个位置(Point)处,存在矛盾(存活且失效)的借债(Loan);并计算在哪些位置(Point)处,产生了与外部定义的生存期约束(SubOrigin, Origin)相矛盾的约束。前者用于报告违反借用规则的错误,后者用于报告可能存在悬垂引用的错误。