rust-fuzz/arbitrary
GitHub: rust-fuzz/arbitrary
Rust 库,用于将模糊测试器生成的原始字节流转换为类型安全的结构化数据,支持 derive 宏自动实现和字段级自定义。
Stars: 855 | Forks: 93
Arbitrary
用于从任意非结构化输入生成结构化数据的 trait。
## 关于
`Arbitrary` crate 允许你构造一个类型的任意实例。
此 crate 主要旨在与 [libFuzzer
和 `cargo-fuzz`](https://github.com/rust-fuzz/cargo-fuzz) 或
[AFL](https://github.com/rust-fuzz/afl.rs) 等fuzzer结合使用,
帮助你将它们生成的原始、无类型字节缓冲区转换为具有良好类型、有效的结构化值。这使你能够将结构感知的测试用例生成与覆盖引导、基于变异的fuzzer结合起来。
## 文档
[**在 `docs.rs` 上阅读 API 文档!**](https://docs.rs/arbitrary)
## 示例
假设你正在编写一个颜色转换库,并且有一个 `Rgb` 结构体来表示 RGB 颜色。你可能想要为 `Rgb` 实现 `Arbitrary`,这样你就可以在测试函数中获取任意的 `Rgb` 实例,以断言某些属性(例如,断言 RGB 转换为 HSL 后再转换回 RGB 最终总是与起始值完全一致)。
### 自动派生 `Arbitrary`
自动派生 `Arbitrary` trait 是为你的类型实现 `Arbitrary` 的推荐方式。
自动派生 `Arbitrary` 需要你启用 `"derive"` cargo feature:
```
# Cargo.toml
[dependencies]
arbitrary = { version = "1", features = ["derive"] }
```
然后你可以简单地为你的类型添加 `#[derive(Arbitrary)]` 注解:
```
// rgb.rs
use arbitrary::Arbitrary;
#[derive(Arbitrary)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
```
#### 自定义单个字段
如果你的结构体使用了一个未实现 `Arbitrary` 的类型,或者你想对特定字段进行更多自定义,这会特别有用。
```
#[derive(Arbitrary)]
pub struct Rgba {
// set `r` to Default::default()
#[arbitrary(default)]
pub r: u8,
// set `g` to 255
#[arbitrary(value = 255)]
pub g: u8,
// Generate `b` with a custom function of type
//
// fn(&mut Unstructured) -> arbitrary::Result
//
// where `T` is the field's type.
#[arbitrary(with = arbitrary_b)]
pub b: u8,
// Generate `a` with a custom closure (shortcut to avoid a custom function)
#[arbitrary(with = |u: &mut Unstructured| u.int_in_range(0..=64))]
pub a: u8,
}
fn arbitrary_b(u: &mut Unstructured) -> arbitrary::Result {
u.int_in_range(64..=128)
}
```
### 手动实现 `Arbitrary`
或者,你可以手动编写 `Arbitrary` 实现:
```
// rgb.rs
use arbitrary::{Arbitrary, Result, Unstructured};
#[derive(Copy, Clone, Debug)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl<'a> Arbitrary<'a> for Rgb {
fn arbitrary(u: &mut Unstructured<'a>) -> Result {
let r = u8::arbitrary(u)?;
let g = u8::arbitrary(u)?;
let b = u8::arbitrary(u)?;
Ok(Rgb { r, g, b })
}
}
```
## 最低支持的 Rust 版本 (MSRV)
此 crate 保证在稳定的 Rust **1.63.0** 及更高版本上编译。它可能在旧版本上编译,但这可能会在任何新的补丁版本中更改。
我们保留在次要版本中增加 MSRV 的权利,但我们将努力仅在经过深思熟虑且有充分理由的情况下这样做。
## 许可证
根据你的选择,在 MIT 或 Apache-2.0 双重许可下授权。
除非你明确声明,否则你故意提交以包含在此项目中的任何贡献,如 Apache-2.0 许可证中所定义,均应按上述方式双重许可,无需任何额外条款或条件。标签:AFL, API密钥检测, API文档, Cargo, DNS解析, Fuzzing, libFuzzer, Rust, 可视化界面, 字节处理, 属性测试, 库, 应急响应, 开源项目, 数据类型转换, 测试辅助工具, 结构化数据生成, 结构感知测试, 网络流量审计, 覆盖率引导, 软件开发, 输入验证, 通知系统