rust-fuzz/arbitrary

GitHub: rust-fuzz/arbitrary

Rust 库,用于将模糊测试器生成的原始字节流转换为类型安全的结构化数据,支持 derive 宏自动实现和字段级自定义。

Stars: 855 | Forks: 93

Arbitrary

用于从任意非结构化输入生成结构化数据的 trait。

GitHub Actions Status
## 关于 `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, 可视化界面, 字节处理, 属性测试, 库, 应急响应, 开源项目, 数据类型转换, 测试辅助工具, 结构化数据生成, 结构感知测试, 网络流量审计, 覆盖率引导, 软件开发, 输入验证, 通知系统