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 过程宏

Download history 302/week @ 2024-05-03 153/week @ 2024-05-10 35/week @ 2024-05-17 21/week @ 2024-05-24 34/week @ 2024-05-31 68/week @ 2024-06-07 187/week @ 2024-06-14 26/week @ 2024-06-21 45/week @ 2024-06-28 141/week @ 2024-07-05 81/week @ 2024-07-12 141/week @ 2024-07-19 44/week @ 2024-07-26 170/week @ 2024-08-02 30/week @ 2024-08-09 119/week @ 2024-08-16

418 每月下载次数
2 个包中使用(通过 cast_checks

MIT/Apache

6KB
128

cast_checks

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

类似于 -C overflow-checkscast_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 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