unsafe-scan
一个零依赖的 Rust 命令行工具,用来统计和定位 Rust 项目中的 unsafe 代码。
A zero-dependency CLI that counts and locates unsafe code in Rust projects.
功能
- 递归扫描目录下所有
.rs文件(自动跳过target/和隐藏目录) - 按类型统计:
unsafe块、unsafe fn、unsafe impl、unsafe trait、unsafe extern块 - 先剔除注释、字符串和字符字面量,文档或字符串里提到的
unsafe不会被误计 - 支持表格、逐条列表和 JSON 三种输出
--deny模式:发现unsafe即返回退出码 1,可直接用于 CI
安装
bash
git clone <本仓库地址>
cd unsafe-scan
cargo install --path .
使用
bash
unsafe-scan # 扫描当前目录
unsafe-scan path/to/crate # 扫描指定目录或单个 .rs 文件
unsafe-scan --list # 列出每一处 unsafe 的位置
unsafe-scan --json # 输出 JSON
unsafe-scan --deny # 有 unsafe 时以退出码 1 结束
示例输出:
text
FILE block fn impl trait extern total
./src/main.rs 1 1 0 0 0 2
./src/main.rs:4 unsafe block
./src/main.rs:6 unsafe fn
Scanned 1 files (6 lines): 2 unsafe item(s) in 1 file(s) [block=1, fn=1, impl=0, trait=0, extern=0]
实现说明
工具基于轻量的词法扫描,而非完整的语法分析:先用状态机把注释(含嵌套块注释)、普通/原始字符串、字符字面量替换为空格并保留换行,再根据 unsafe 关键字后面的 token 判断类型。#[unsafe(no_mangle)] 这类 2024 edition 的 unsafe 属性不计入统计。
宏展开生成的 unsafe 代码不会被统计。
测试
bash
cargo test
