我怎样才能让编译器警告我标记为 pub 的未使用代码?

How can I get the compiler to warn me of unused code that is marked pub?

Rust 对未使用的私有项发出警告:

warning: function is never used: `hmm`
   --> src/example.rs:357:1
    |
357 | fn hmm() {
    | ^^^^^^^^
    |
    = note: #[warn(dead_code)] on by default

我有一些标记为 pub 的代码,我知道这些代码没有被使用。我怎样才能让编译器警告我这个?

这是在一个库和一系列二进制文件的上下文中,它们都在同一个工作区中。该库仅供那些二进制文件使用;该库未被其他任何人使用,我不会上传到 crates.io,因此我完全了解正在使用的代码。

您无法启用任何功能来执行此操作。根据定义,如果某些东西 public 在你的箱子之外,它可能会被导入你的箱子的箱子使用;编译器无法真正分辨。这是 public API 的一部分。从 public API 中删除某些内容是一项重大更改。

如果您有未从箱子中导出的物品,那么它 pub 的事实并不重要:

mod foo {
    pub fn bar() {}
}

fn main() {}
warning: function is never used: `bar`
 --> src/main.rs:2:5
  |
2 |     pub fn bar() {}
  |     ^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

相反,不要将事物标记为 public。相反,要么完全放弃 pub,要么使用像 pub(crate) 这样的可见性修饰符。 Binary crates 应该基本上没有标记为从 crate 中导出的项目。


在工作区的特定情况下,从来没有一个编译器调用知道“一切”的时候。例如,如果您的库导出 fn a()fn b() 并且一个二进制文件使用 a 而另一个二进制文件使用 b,那么库或任何一个二进制文件的编译都不会看到全貌。 “最好”的情况是得到大量的误报。

在类似的情况下,我采取了从 API 中删除 一切 public 并编译以查看错误/使用的函数。

一个名为 warnalyzer 的工具可能 在这种情况下有所帮助。它使用一些不稳定的编译器功能来保存来自中间编译器调用的文件,然后聚合它们以识别未使用的代码。目前它有一些误报,但它可能作为指南很有用。

有点相关:rust issue #74970 要求在 bin crate 中将 pub 视为 pub(crate),这样即使更细粒度的 pub(...) 不使用说明符。