You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Rust会对仅在测试中使用的函数报未使用警告?如何解决?

原因说明

Rust 的dead_code代码检查默认开启,判断逻辑基于当前编译目标下的代码调用关系:

  • 标注了#[cfg(test)]的测试模块,仅在执行测试编译(cargo test)时会被纳入编译流程。常规的cargo build、cargo check等非测试编译操作,会完全忽略测试模块内的所有代码。
  • 示例中的greet函数没有对外公开(无pub修饰),编译器默认仅检查当前 crate 内的调用情况。非测试编译时测试模块被排除,编译器看不到greet被调用的逻辑,因此判定为死代码触发警告。
解决方法

根据函数的实际用途选择对应方案即可:

  • 若该函数仅用于测试场景:给函数也添加#[cfg(test)]标注,让它只在测试编译时存在,自然不会在常规编译时触发警告。
    代码示例:
    #[cfg(test)]
    fn greet() {
        println!("Hello!")
    }
    
    #[cfg(test)]
    mod tests {
        use super::*;
    
        #[test]
        fn test_greet() {
            greet();
        }
    }
    
  • 若该函数是待后续实现调用的业务函数,暂时不需要对外暴露:给函数添加#[allow(dead_code)]标注,手动关闭该函数的死代码检查。
    代码示例:
    #[allow(dead_code)]
    fn greet() {
        println!("Hello!")
    }
    
  • 若该函数是设计为对外提供的库接口:给函数添加pub修饰符将其公开。Rust不会对公开导出的函数做死代码检查,因为编译器无法判断外部 crate 是否会调用该函数。
    代码示例:
    pub fn greet() {
        println!("Hello!")
    }
    
  • 若仅需要临时做代码检查不想修改代码:执行cargo check --tests命令,该命令会将测试模块纳入编译范围,编译器可以检测到测试中的函数调用,不会触发死代码警告。

内容的提问来源于stack exchange,提问作者Andrey Bienkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:15:02