如何禁用Rust宏产生的「未使用返回值必须被使用」警告?
问题
我尝试给结构体添加#[allow(dead_code)]和#[allow(unused_must_use)]属性,来禁用宏产生的「未使用返回值必须被使用」警告:
#[allow(dead_code)] #[allow(unused_must_use)] #[implement(MyStruct)] pub struct MyStructList(pub Rc<Vec<MyStruct>>);
但还是收到了警告,我刚接触Rust,想搞懂提示里“调用drop”的意思,警告信息如下:
warning: unused return value of
Box::<T>::from_rawthat must be used
--> test.rs
|
#[implement(MyStruct)] ^^^^^^^^^^^^^^^^^^^^^^ = note: call
drop(from_raw(ptr))if you intend to drop theBox
= note: this warning originates in the attribute macroimplement(in Nightly builds, run with -Z macro-backtrace for more info)
解答
为什么你加的属性没生效?
你把#[allow(unused_must_use)]加在了结构体上,但这个警告来自#[implement]宏内部生成的代码,结构体的属性无法作用于宏展开后的代码,所以完全没起到效果。
关于“调用drop”的含义
Box::from_raw的本质:这个不安全函数负责把原始指针转换成Box<T>,一旦转换完成,Rust就会接管这块内存的所有权,后续Box被销毁时会自动释放对应内存。- 警告的触发逻辑:宏里调用了
Box::from_raw却没有处理它的返回值。这类返回值被标记了#[must_use],Rust会强制要求你明确处理——要么用它执行操作,要么主动告知编译器你要丢弃它。 drop(from_raw(ptr))的意义:如果你确实不需要这个Box,把它传给drop()函数是明确告诉编译器:我清楚自己在丢弃这个Box,它的内存会被正常释放,不是疏忽导致的未使用。
解决警告的可行方案
- 修改宏代码(如果有权限):找到宏内部调用
Box::from_raw的位置,要么使用返回的Box实例做业务逻辑,要么显式调用drop()处理返回值。 - 模块级别添加允许属性:如果没法修改宏,可以在结构体所在的模块上添加
#[allow(unused_must_use)],这样能覆盖模块内所有代码(包括宏生成的),但会禁用整个模块的这类警告,需谨慎使用:#[allow(unused_must_use)] mod your_module { #[allow(dead_code)] #[implement(MyStruct)] pub struct MyStructList(pub Rc<Vec<MyStruct>>); }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

