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

您不能启用任何功能来执行此操作。根据定义,如果您的板条箱外有公共物品,则进口您板条箱的板条箱可能会使用该物品;编译器实际上无法判断。这是拥有公共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)的可见性修饰符。二进制板条箱基本上不应该有从板条箱出口的物品标记。


在工作区的特定情况下,从来没有一个编译器调用知道";一切";。例如,如果您的库导出fn a()fn b(),并且一个二进制文件使用a,另一个二进制程序使用b,则该库或任一二进制文件的编译都无法看到全貌。";最好的";这个病例会得到大量的假阳性。

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

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

有些相关:锈蚀问题#74970要求将pub作为pub(crate)处理在板条箱中,以便即使不使用更细粒度的pub(...)说明符,也能像未使用的代码一样进行诊断。

最新更新