This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
…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]>
- Loading branch information
1 parent
4b471dd
commit 6c89d07
Showing
3 changed files
with
40 additions
and
0 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
use honggfuzz::fuzz; | ||
use sp_npos_elections::generate_solution_type; | ||
use sp_npos_elections::sp_arithmetic::Percent; | ||
use sp_runtime::codec::{Encode, Error}; | ||
|
||
fn main() { | ||
generate_solution_type!(#[compact] pub struct InnerTestSolutionCompact::<u32, u32, Percent>(16)); | ||
loop { | ||
fuzz!(|fuzzer_data: &[u8]| { | ||
let result_decoded: Result<InnerTestSolutionCompact, Error> = | ||
<InnerTestSolutionCompact as codec::Decode>::decode(&mut &fuzzer_data[..]); | ||
// Ignore errors as not every random sequence of bytes can be decoded as InnerTestSolutionCompact | ||
if let Ok(decoded) = result_decoded { | ||
// Decoding works, let's re-encode it and compare results. | ||
let reencoded: std::vec::Vec<u8> = decoded.encode(); | ||
// The reencoded value may or may not be equal to the original fuzzer output. However, the | ||
// original decoder should be optimal (in the sense that there is no shorter encoding of | ||
// the same object). So let's see if the fuzzer can find something shorter: | ||
if fuzzer_data.len() < reencoded.len() { | ||
panic!("fuzzer_data.len() < reencoded.len()"); | ||
} | ||
// The reencoded value should definitely be decodable (if unwrap() fails that is a valid | ||
// panic/finding for the fuzzer): | ||
let decoded2: InnerTestSolutionCompact = | ||
<InnerTestSolutionCompact as codec::Decode>::decode( | ||
&mut reencoded.as_slice(), | ||
).unwrap(); | ||
// And it should be equal to the original decoded object (resulting from directly | ||
// decoding fuzzer_data): | ||
assert_eq!(decoded, decoded2); | ||
} | ||
}); | ||
} | ||
} |