Name |
Date |
Size |
#Lines |
LOC |
||
---|---|---|---|---|---|---|
.. | - | - | ||||
.github/workflows/ | 03-May-2024 | - | 36 | 33 | ||
examples/ | 03-May-2024 | - | 24 | 14 | ||
patches/ | 03-May-2024 | - | 21 | 19 | ||
src/ | 03-May-2024 | - | 1,976 | 1,178 | ||
tests/ | 03-May-2024 | - | 219 | 172 | ||
.cargo_vcs_info.json | D | 03-May-2024 | 74 | 6 | 5 | |
.gitignore | D | 03-May-2024 | 30 | 4 | 3 | |
Android.bp | D | 03-May-2024 | 2 KiB | 58 | 53 | |
CHANGELOG.md | D | 03-May-2024 | 8.5 KiB | 284 | 167 | |
Cargo.toml | D | 03-May-2024 | 1.4 KiB | 42 | 36 | |
Cargo.toml.orig | D | 03-May-2024 | 1.1 KiB | 40 | 33 | |
LICENSE | D | 03-May-2024 | 10.6 KiB | 202 | 169 | |
LICENSE-APACHE | D | 03-May-2024 | 10.6 KiB | 202 | 169 | |
LICENSE-MIT | D | 03-May-2024 | 1 KiB | 28 | 23 | |
METADATA | D | 03-May-2024 | 406 | 20 | 19 | |
MODULE_LICENSE_APACHE2 | D | 03-May-2024 | 0 | |||
NOTICE | D | 03-May-2024 | 10.6 KiB | 202 | 169 | |
OWNERS | D | 03-May-2024 | 62 | 3 | 2 | |
README.md | D | 03-May-2024 | 2.5 KiB | 97 | 67 | |
publish.sh | D | 03-May-2024 | 182 | 15 | 6 |
README.md
1<div align="center"> 2 3 <h1><code>Arbitrary</code></h1> 4 5 <p><strong>The trait for generating structured data from arbitrary, unstructured input.</strong></p> 6 7 <img alt="GitHub Actions Status" src="https://github.com/rust-fuzz/rust_arbitrary/workflows/Rust/badge.svg"/> 8 9</div> 10 11## About 12 13The `Arbitrary` crate lets you construct arbitrary instance of a type. 14 15This crate is primarily intended to be combined with a fuzzer like [libFuzzer 16and `cargo-fuzz`](https://github.com/rust-fuzz/cargo-fuzz) or 17[AFL](https://github.com/rust-fuzz/afl.rs), and to help you turn the raw, 18untyped byte buffers that they produce into well-typed, valid, structured 19values. This allows you to combine structure-aware test case generation with 20coverage-guided, mutation-based fuzzers. 21 22## Documentation 23 24[**Read the API documentation on `docs.rs`!**](https://docs.rs/arbitrary) 25 26## Example 27 28Say you're writing a color conversion library, and you have an `Rgb` struct to 29represent RGB colors. You might want to implement `Arbitrary` for `Rgb` so that 30you could take arbitrary `Rgb` instances in a test function that asserts some 31property (for example, asserting that RGB converted to HSL and converted back to 32RGB always ends up exactly where we started). 33 34### Automatically Deriving `Arbitrary` 35 36Automatically deriving the `Arbitrary` trait is the recommended way to implement 37`Arbitrary` for your types. 38 39Automatically deriving `Arbitrary` requires you to enable the `"derive"` cargo 40feature: 41 42```toml 43# Cargo.toml 44 45[dependencies] 46arbitrary = { version = "1", features = ["derive"] } 47``` 48 49And then you can simply add `#[derive(Arbitrary)]` annotations to your types: 50 51```rust 52// rgb.rs 53 54use arbitrary::Arbitrary; 55 56#[derive(Arbitrary)] 57pub struct Rgb { 58 pub r: u8, 59 pub g: u8, 60 pub b: u8, 61} 62``` 63 64### Implementing `Arbitrary` By Hand 65 66Alternatively, you can write an `Arbitrary` implementation by hand: 67 68```rust 69// rgb.rs 70 71use arbitrary::{Arbitrary, Result, Unstructured}; 72 73#[derive(Copy, Clone, Debug)] 74pub struct Rgb { 75 pub r: u8, 76 pub g: u8, 77 pub b: u8, 78} 79 80impl<'a> Arbitrary<'a> for Rgb { 81 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> { 82 let r = u8::arbitrary(u)?; 83 let g = u8::arbitrary(u)?; 84 let b = u8::arbitrary(u)?; 85 Ok(Rgb { r, g, b }) 86 } 87} 88``` 89 90## License 91 92Licensed under dual MIT or Apache-2.0 at your choice. 93 94Unless you explicitly state otherwise, any contribution intentionally submitted 95for inclusion in this project by you, as defined in the Apache-2.0 license, 96shall be dual licensed as above, without any additional terms or conditions. 97