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日

#1388Rust 模式

Download history 5/week @ 2024-04-14 4/week @ 2024-04-21 179/week @ 2024-04-28 254/week @ 2024-05-05 33/week @ 2024-05-12 38/week @ 2024-05-19 15/week @ 2024-05-26 57/week @ 2024-06-02 53/week @ 2024-06-09 181/week @ 2024-06-16 26/week @ 2024-06-23 46/week @ 2024-06-30 199/week @ 2024-07-07 34/week @ 2024-07-14 134/week @ 2024-07-21 70/week @ 2024-07-28

447 每月下载量
2 个crate中使用 (通过 cast_checks)

MIT/Apache

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_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。

无运行时依赖