Skip to content

Commit e616f59

Browse files
authored
Merge pull request #53 from fitzgen/update-arbitrary
Update arbitrary
2 parents 0c45075 + 1ccd891 commit e616f59

File tree

8 files changed

+96
-21
lines changed

8 files changed

+96
-21
lines changed

.travis.yml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ env:
1010
- ARCH=x86_64
1111
notifications:
1212
email: false
13-
script:
14-
- cd example
15-
- cargo rustc --release -- -Cpasses='sancov' -Cllvm-args=-sanitizer-coverage-level=4 -Cllvm-args=-sanitizer-coverage-trace-compares -Cllvm-args=-sanitizer-coverage-inline-8bit-counters -Cllvm-args=-sanitizer-coverage-stack-depth -Cllvm-args=-sanitizer-coverage-trace-geps -Cllvm-args=-sanitizer-coverage-prune-blocks=0 -Zsanitizer=address
16-
- (! ./target/release/example -runs=100000)
17-
- cd ../example_arbitrary
18-
- cargo rustc --release -- -Cpasses='sancov' -Cllvm-args=-sanitizer-coverage-level=4 -Cllvm-args=-sanitizer-coverage-trace-compares -Cllvm-args=-sanitizer-coverage-inline-8bit-counters -Cllvm-args=-sanitizer-coverage-stack-depth -Cllvm-args=-sanitizer-coverage-trace-geps -Cllvm-args=-sanitizer-coverage-prune-blocks=0 -Zsanitizer=address
19-
- (! ./target/release/example -runs=10000000)
13+
script: ./ci/script.sh

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ edition = "2018"
1313
members = ["."]
1414

1515
[dependencies]
16-
arbitrary = "0.2"
16+
# arbitrary = "0.3"
17+
arbitrary = { git = "https://github.com/rust-fuzz/arbitrary.git", rev = "8fa099d" }
1718

1819
[build-dependencies]
1920
cc = "1.0"
21+
22+
[features]
23+
arbitrary-derive = ["arbitrary/derive"]

ci/script.sh

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env bash
2+
3+
set -eux
4+
cd $(dirname $0)/..
5+
6+
export CARGO_TARGET_DIR=$(pwd)/target
7+
8+
pushd ./example
9+
cargo rustc \
10+
--release \
11+
-- \
12+
-Cpasses='sancov' \
13+
-Cllvm-args=-sanitizer-coverage-level=4 \
14+
-Cllvm-args=-sanitizer-coverage-trace-compares \
15+
-Cllvm-args=-sanitizer-coverage-inline-8bit-counters \
16+
-Cllvm-args=-sanitizer-coverage-stack-depth \
17+
-Cllvm-args=-sanitizer-coverage-trace-geps \
18+
-Cllvm-args=-sanitizer-coverage-prune-blocks=0 \
19+
-Zsanitizer=address
20+
(! $CARGO_TARGET_DIR/release/example -runs=100000)
21+
popd
22+
23+
pushd ./example_arbitrary
24+
cargo rustc \
25+
--release \
26+
-- \
27+
-Cpasses='sancov' \
28+
-Cllvm-args=-sanitizer-coverage-level=4 \
29+
-Cllvm-args=-sanitizer-coverage-trace-compares \
30+
-Cllvm-args=-sanitizer-coverage-inline-8bit-counters \
31+
-Cllvm-args=-sanitizer-coverage-stack-depth \
32+
-Cllvm-args=-sanitizer-coverage-trace-geps \
33+
-Cllvm-args=-sanitizer-coverage-prune-blocks=0 \
34+
-Zsanitizer=address
35+
(! $CARGO_TARGET_DIR/release/example_arbitrary -runs=10000000)
36+
RUST_LIBFUZZER_DEBUG_PATH=$(pwd)/debug_output \
37+
$CARGO_TARGET_DIR/release/example_arbitrary \
38+
$(ls ./crash-* | head -n 1)
39+
cat $(pwd)/debug_output
40+
grep -q Rgb $(pwd)/debug_output
41+
popd

example/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
crash-*

example_arbitrary/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
crash-*
2+
debug_output

example_arbitrary/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "example"
2+
name = "example_arbitrary"
33
version = "0.1.0"
44
authors = ["Simonas Kazlauskas <[email protected]>"]
55
edition = "2018"
@@ -8,5 +8,4 @@ edition = "2018"
88
members = ["."]
99

1010
[dependencies]
11-
libfuzzer-sys = { path = ".." }
12-
arbitrary = "0.2"
11+
libfuzzer-sys = { path = "..", features = ["arbitrary-derive"] }

example_arbitrary/src/main.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
#![no_main]
22

3-
use libfuzzer_sys::fuzz_target;
3+
use libfuzzer_sys::{arbitrary, fuzz_target};
44

5-
fuzz_target!(|data: u16| {
6-
if data == 0xba7 { // ba[nana]
7-
panic!("success!");
5+
#[derive(arbitrary::Arbitrary, Debug)]
6+
struct Rgb {
7+
r: u8,
8+
g: u8,
9+
b: u8,
10+
}
11+
12+
fuzz_target!(|rgb: Rgb| {
13+
if rgb.r < rgb.g {
14+
if rgb.g < rgb.b {
15+
panic!("success: r < g < b!");
16+
}
817
}
918
});

src/lib.rs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ macro_rules! fuzz_target {
118118
(|$bytes:ident| $body:block) => {
119119
#[no_mangle]
120120
pub extern "C" fn rust_fuzzer_test_input($bytes: &[u8]) {
121+
// When `RUST_LIBFUZZER_DEBUG_PATH` is set, write the debug
122+
// formatting of the input to that file. This is only intended for
123+
// `cargo fuzz`'s use!
124+
if let Ok(path) = std::env::var("RUST_LIBFUZZER_DEBUG_PATH") {
125+
use std::io::Write;
126+
let mut file = std::fs::File::create(path)
127+
.expect("failed to create `RUST_LIBFUZZER_DEBUG_PATH` file");
128+
writeln!(&mut file, "{:?}", $bytes)
129+
.expect("failed to write to `RUST_LIBFUZZER_DEBUG_PATH` file");
130+
return;
131+
}
132+
121133
$body
122134
}
123135
};
@@ -129,14 +141,27 @@ macro_rules! fuzz_target {
129141
(|$data:ident: $dty: ty| $body:block) => {
130142
#[no_mangle]
131143
pub extern "C" fn rust_fuzzer_test_input(bytes: &[u8]) {
132-
use libfuzzer_sys::arbitrary::{Arbitrary, RingBuffer};
144+
use libfuzzer_sys::arbitrary::{Arbitrary, Unstructured};
133145

134-
let mut buf = match RingBuffer::new(bytes, bytes.len()) {
135-
Ok(b) => b,
136-
Err(_) => return,
137-
};
146+
let mut u = Unstructured::new(bytes);
147+
let data = <$dty as Arbitrary>::arbitrary_take_rest(u);
148+
149+
// When `RUST_LIBFUZZER_DEBUG_PATH` is set, write the debug
150+
// formatting of the input to that file. This is only intended for
151+
// `cargo fuzz`'s use!
152+
if let Ok(path) = std::env::var("RUST_LIBFUZZER_DEBUG_PATH") {
153+
use std::io::Write;
154+
let mut file = std::fs::File::create(path)
155+
.expect("failed to create `RUST_LIBFUZZER_DEBUG_PATH` file");
156+
(match data {
157+
Ok(data) => writeln!(&mut file, "{:#?}", data),
158+
Err(err) => writeln!(&mut file, "Arbitrary Error: {}", err),
159+
})
160+
.expect("failed to write to `RUST_LIBFUZZER_DEBUG_PATH` file");
161+
return;
162+
}
138163

139-
let $data: $dty = match Arbitrary::arbitrary(&mut buf) {
164+
let $data = match data {
140165
Ok(d) => d,
141166
Err(_) => return,
142167
};

0 commit comments

Comments
 (0)