6 个版本
0.1.5 | 2024年5月3日 |
---|---|
0.1.4 | 2023年10月5日 |
0.1.3 | 2023年7月25日 |
0.1.2 | 2023年4月2日 |
0.1.1 | 2023年3月26日 |
#1388 在 Rust 模式
447 每月下载量
在 2 个crate中使用 (通过 cast_checks)
2KB
cast_checks
一个用于检查无效转换的过程宏
与 -C overflow-checks
类似,cast_checks
默认仅用于调试构建。要为发布构建启用 cast_checks
,请设置 crate 级别的 release
功能。
工作原理
cast_checks::enable
实质上重新编写了形式为的表达式
expr as T
到一个涉及 try_into
的表达式
<_ as TryInto::< T >>::try_into( expr ).expect("invalid cast")
因此,当发生无效转换时,会显示如下消息
thread 'checked_truncation' panicked at 'invalid cast: TryFromIntError(())', cast_checks/tests/basic.rs:30:13
我们说“本质上重新编写”,因为实际生成的代码稍微复杂一些。它使用 Nikolai Vazquez's impls
' 技巧 来确定是否存在适当的 TryInto
实现。
如何使用
使用稳定编译器
您必须将 cast_checks::enable
作为外部 属性 使用。示例
#[cast_checks::enable]
fn as_u16(x: u64) -> u16 {
x as u16
}
使用夜间编译器
我们建议启用 Rust 功能 custom_inner_attributes
和 proc_macro_hygiene
。
如果您启用了 custom_inner_attributes
和 proc_macro_hygiene
功能,则可以使用 cast_checks::enable
作为内部 属性。示例
#![feature(custom_inner_attributes, proc_macro_hygiene)]
mod m {
#![cast_checks::enable]
/* items */
}
CAST_CHECKS_LOG
如果您担心某些类型转换没有被检查,尝试设置 CAST_CHECKS_LOG
并在编译时传递配置标志 procmacro2_semver_exempt
,例如:
CAST_CHECKS_LOG=1 RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build
这将导致 cast_checks
将所有重写位置输出到标准输出
- 所有未遍历的模块,因为这些模块没有被内联
- 所有内容未被访问的模块
示例
cast_checks rewriting `x as u16` at src/lib.rs:0:0
cast_checks not descending into `mod c ;` at src/lib.rs:0:0
请注意,CAST_CHECKS_LOG
需要传递 --cfg procmacro2_semver_exempt
给 rustc。