Skip to content

Commit b6824f1

Browse files
committed
Add some basic fuzzing
1 parent 9a595c6 commit b6824f1

File tree

5 files changed

+201
-0
lines changed

5 files changed

+201
-0
lines changed

fuzz/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
target
2+
corpus
3+
artifacts
4+
coverage

fuzz/Cargo.lock

Lines changed: 110 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fuzz/Cargo.toml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
[package]
2+
name = "sap-fuzz"
3+
version = "0.0.0"
4+
publish = false
5+
edition = "2024"
6+
7+
[package.metadata]
8+
cargo-fuzz = true
9+
10+
[dependencies]
11+
libfuzzer-sys = "0.4"
12+
13+
[dependencies.sap]
14+
path = ".."
15+
16+
[[bin]]
17+
name = "parser_garbage"
18+
path = "fuzz_targets/parser_garbage.rs"
19+
test = false
20+
doc = false
21+
bench = false
22+
23+
[[bin]]
24+
name = "raw_bytes"
25+
path = "fuzz_targets/raw_bytes.rs"
26+
test = false
27+
doc = false
28+
bench = false
29+
30+
[[bin]]
31+
name = "from_env"
32+
path = "fuzz_targets/from_env.rs"
33+
test = false
34+
doc = false
35+
bench = false
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#![no_main]
2+
3+
use libfuzzer_sys::fuzz_target;
4+
use sap::Parser;
5+
6+
fuzz_target!(|data: &[u8]| {
7+
let byte_args: Vec<String> = data.iter().map(|&b| format!("{}", b as char)).collect();
8+
let mut args = vec!["fuzz"];
9+
args.extend(byte_args.iter().map(|s| s.as_str()));
10+
11+
if let Ok(mut parser) = Parser::from_arbitrary(args) {
12+
while let Ok(Some(_)) = parser.forward() {
13+
let _ = parser.value();
14+
}
15+
}
16+
17+
let null_string = String::from_utf8_lossy(data);
18+
let null_split: Vec<&str> = null_string.split('\0').collect();
19+
let mut args = vec!["fuzz"];
20+
args.extend(null_split);
21+
22+
if let Ok(mut parser) = Parser::from_arbitrary(args) {
23+
while let Ok(Some(_)) = parser.forward() {
24+
let _ = parser.value();
25+
}
26+
}
27+
});

fuzz/fuzz_targets/raw_bytes.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#![no_main]
2+
3+
use libfuzzer_sys::fuzz_target;
4+
use sap::Parser;
5+
6+
fuzz_target!(|data: &[u8]| {
7+
let mut args: Vec<String> = vec!["fuzz".to_string()];
8+
9+
for &byte in data {
10+
args.push(format!("{}", byte));
11+
args.push(format!("{:x}", byte));
12+
args.push(format!("{:b}", byte));
13+
args.push(format!("{}", byte as char));
14+
args.push(format!("-{}", byte as char));
15+
args.push(format!("--{}", byte as char));
16+
args.push(format!("--{}={}", byte as char, byte));
17+
args.push(format!("--{}={:x}", byte, byte));
18+
}
19+
20+
if let Ok(mut parser) = Parser::from_arbitrary(args) {
21+
while let Ok(Some(_)) = parser.forward() {
22+
let _ = parser.value();
23+
}
24+
}
25+
});

0 commit comments

Comments
 (0)