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日

#646 in Rust 模式

Download history 1/week @ 2024-04-14 177/week @ 2024-04-28 253/week @ 2024-05-05 32/week @ 2024-05-12 35/week @ 2024-05-19 11/week @ 2024-05-26 52/week @ 2024-06-02 51/week @ 2024-06-09 176/week @ 2024-06-16 23/week @ 2024-06-23 42/week @ 2024-06-30 196/week @ 2024-07-07 31/week @ 2024-07-14 131/week @ 2024-07-21 68/week @ 2024-07-28

每月下载量 436
test-fuzz 中使用

MIT/Apache

8KB

cast_checks

用于检查无效类型转换的过程宏

类似于 -C overflow-checkscast_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 Vazquezimpls技巧 来确定是否存在适当的 TryInto 实现。

使用方法

使用稳定编译器

您必须将 cast_checks::enable 作为外部 属性 使用。示例

#[cast_checks::enable]
fn as_u16(x: u64) -> u16 {
    x as u16
}

使用夜间编译器

我们建议启用 Rust 功能 custom_inner_attributesproc_macro_hygiene

如果您启用了 custom_inner_attributesproc_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