首页 > 解决方案 > 如何让编译器警告我标记为 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,所以我对正在使用的代码有充分的了解。

标签: rustcompiler-warnings

解决方案


你不能启用任何东西来做到这一点。根据定义,如果某些东西在你的 crate 之外是公开的,它可能会被导入你的 crate 的 crate 使用;编译器实际上无法分辨。这是拥有公共 API的一部分。从公共 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

相反,不要一开始就将事情标记为公开。相反,要么pub完全停止,要么使用可见性修饰符,如pub(crate). 二进制 crate 基本上应该没有标记为从 crate 中导出的项目。


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

在类似的情况下,我求助于从 API 中删除所有公共内容并编译以查看错误/使用的函数。

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


推荐阅读