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日 |
#1318 in 过程宏
418 每月下载次数
在 2 个包中使用(通过 cast_checks)
6KB
128 行
cast_checks
一个用于检查无效类型转换的过程宏
类似于 -C overflow-checks
,cast_checks
默认情况下仅对调试构建启用。要启用 cast_checks
以进行发布构建,请设置包级别的 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 的 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。
依赖项
~255–700KB
~17K SLoC