Skip to content

Commit faf2e23

Browse files
author
MarcoFalke
committed
fuzz: Shuffle files before testing them
When iterating over all fuzz input files in a folder, the order should not matter. However, shuffling may be useful to detect non-determinism. Thus, shuffle in fuzz.cpp, when using neither libFuzzer, nor AFL. Also, shuffle in the deterministic-fuzz-coverage tool, when using libFuzzer.
1 parent 639279e commit faf2e23

File tree

2 files changed

+10
-3
lines changed
  • contrib/devtools/deterministic-fuzz-coverage/src
  • src/test/fuzz

2 files changed

+10
-3
lines changed

contrib/devtools/deterministic-fuzz-coverage/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ fn deterministic_coverage(
133133
let output = {
134134
let mut cmd = Command::new(fuzz_exe);
135135
if using_libfuzzer {
136-
cmd.arg("-runs=1");
136+
cmd.args(["-runs=1", "-shuffle=1", "-prefer_small=0"]);
137137
}
138138
cmd
139139
}

src/test/fuzz/fuzz.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <util/sock.h>
1616
#include <util/time.h>
1717

18+
#include <algorithm>
1819
#include <csignal>
1920
#include <cstdint>
2021
#include <cstdio>
@@ -26,6 +27,7 @@
2627
#include <iostream>
2728
#include <map>
2829
#include <memory>
30+
#include <random>
2931
#include <string>
3032
#include <tuple>
3133
#include <utility>
@@ -241,10 +243,15 @@ int main(int argc, char** argv)
241243
for (int i = 1; i < argc; ++i) {
242244
fs::path input_path(*(argv + i));
243245
if (fs::is_directory(input_path)) {
246+
std::vector<fs::path> files;
244247
for (fs::directory_iterator it(input_path); it != fs::directory_iterator(); ++it) {
245248
if (!fs::is_regular_file(it->path())) continue;
246-
g_input_path = it->path();
247-
Assert(read_file(it->path(), buffer));
249+
files.emplace_back(it->path());
250+
}
251+
std::ranges::shuffle(files, std::mt19937{std::random_device{}()});
252+
for (const auto& input_path : files) {
253+
g_input_path = input_path;
254+
Assert(read_file(input_path, buffer));
248255
test_one_input(buffer);
249256
++tested;
250257
buffer.clear();

0 commit comments

Comments
 (0)