#datalog #compiler #borrowck #define

bin+lib polonius

为 Rust 借用检查器提供核心定义

3 个版本 (破坏性更新)

0.3.0 2018年12月4日
0.2.0 2018年5月31日
0.1.0 2018年5月24日

#803 in 开发工具

Apache-2.0/MIT

4MB
3K SLoC

这是一个核心库,用于对借用检查进行建模。它实现了在这篇博客文章中描述的分析。

为什么叫“Polonius”呢?

这个名字来自莎士比亚的《哈姆雷特》中波洛尼厄斯角色的著名台词 "Neither borrower nor lender be"

想要运行代码吗?

这个存储库的目标之一是实验和比较相同算法的不同实现。您可以使用 cargo run 运行分析,您可以使用 -a 选择分析。例如,要运行对 clap 的示例提取的分析,您可能会这样做

> cargo +nightly run --release -- -a DatafrogOpt inputs/clap-rs/app-parser-{{impl}}-add_defaults/
    Finished release [optimized] target(s) in 0.05 secs
     Running `target/release/borrow-check 'inputs/clap-rs/app-parser-{{impl}}-add_defaults/'`
--------------------------------------------------
Directory: inputs/clap-rs/app-parser-{{impl}}-add_defaults/
Time: 3.856s

您还可以尝试 -a Naive 来获取原始规则(更易读,但较慢)——这些规则与 博客文章 中描述的规则完全一致。您还可以使用 - 来使用不区分位置的检查(更快,但可能产生虚假错误)。

默认情况下,cargo run 仅打印时间。如果您还想查看结果,请尝试 --show-tuples(将显示错误)和 -(以显示更多中间计算)。您可以通过提供 --help 获取更多文档。

如何生成自己的输入

要在输入上运行借用检查器,您首先需要生成输入事实。为此,您需要使用 rustc 的 --facts 选项运行

> rustc -Znll-facts inputs/issue-47680/issue-47680.rs

或者,使用 #![feature(nll)] 标志来生成 crate 的输入事实

> cargo rustc -- -Znll-facts

这将生成一个包含每个函数一个子目录的 nll-facts 目录

> ls -F nll-facts
{{impl}}-maybe_next/  main/

然后您可以在这些目录上运行

依赖项

约 6–15MB
约 192K SLoC