Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 1438f1a

Browse files
viniulVincent Ulitzschbkchr
authored
Add fuzzer for the compact custom codec implementation from PR #6720 (#7091)
* Add fuzzer for the compact custom codec implementation introduced in PR #6720. This commit adds a fuzzing harness for the custom compact encoding/decoding introduced in PR #6720. * Update primitives/npos-elections/fuzzer/src/compact.rs Co-authored-by: Bastian Köcher <[email protected]> * Update Cargo.lock: Add changes in elections-fuzzer * Change indentation from spaces to tabs Co-authored-by: Vincent Ulitzsch <[email protected]> Co-authored-by: Bastian Köcher <[email protected]>
1 parent 86c8ee6 commit 1438f1a

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

Cargo.lock

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

primitives/npos-elections/fuzzer/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ sp-std = { version = "2.0.0-rc6", path = "../../std" }
1919
sp-runtime = { version = "2.0.0-rc6", path = "../../runtime" }
2020
honggfuzz = "0.5"
2121
rand = { version = "0.7.3", features = ["std", "small_rng"] }
22+
codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] }
2223

2324
[[bin]]
2425
name = "reduce"
@@ -27,3 +28,7 @@ path = "src/reduce.rs"
2728
[[bin]]
2829
name = "balance_solution"
2930
path = "src/balance_solution.rs"
31+
32+
[[bin]]
33+
name = "compact"
34+
path = "src/compact.rs"
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use honggfuzz::fuzz;
2+
use sp_npos_elections::generate_solution_type;
3+
use sp_npos_elections::sp_arithmetic::Percent;
4+
use sp_runtime::codec::{Encode, Error};
5+
6+
fn main() {
7+
generate_solution_type!(#[compact] pub struct InnerTestSolutionCompact::<u32, u32, Percent>(16));
8+
loop {
9+
fuzz!(|fuzzer_data: &[u8]| {
10+
let result_decoded: Result<InnerTestSolutionCompact, Error> =
11+
<InnerTestSolutionCompact as codec::Decode>::decode(&mut &fuzzer_data[..]);
12+
// Ignore errors as not every random sequence of bytes can be decoded as InnerTestSolutionCompact
13+
if let Ok(decoded) = result_decoded {
14+
// Decoding works, let's re-encode it and compare results.
15+
let reencoded: std::vec::Vec<u8> = decoded.encode();
16+
// The reencoded value may or may not be equal to the original fuzzer output. However, the
17+
// original decoder should be optimal (in the sense that there is no shorter encoding of
18+
// the same object). So let's see if the fuzzer can find something shorter:
19+
if fuzzer_data.len() < reencoded.len() {
20+
panic!("fuzzer_data.len() < reencoded.len()");
21+
}
22+
// The reencoded value should definitely be decodable (if unwrap() fails that is a valid
23+
// panic/finding for the fuzzer):
24+
let decoded2: InnerTestSolutionCompact =
25+
<InnerTestSolutionCompact as codec::Decode>::decode(
26+
&mut reencoded.as_slice(),
27+
).unwrap();
28+
// And it should be equal to the original decoded object (resulting from directly
29+
// decoding fuzzer_data):
30+
assert_eq!(decoded, decoded2);
31+
}
32+
});
33+
}
34+
}

0 commit comments

Comments
 (0)