diff options
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerDriver.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerFlags.def | 6 | ||||
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerLoop.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerOptions.h | 2 |
4 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerDriver.cpp b/llvm/lib/Fuzzer/FuzzerDriver.cpp index 336bdf0f859..a00e49ef079 100644 --- a/llvm/lib/Fuzzer/FuzzerDriver.cpp +++ b/llvm/lib/Fuzzer/FuzzerDriver.cpp @@ -401,7 +401,7 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { Options.Shrink = Flags.shrink; Options.ShuffleAtStartUp = Flags.shuffle; Options.PreferSmall = Flags.prefer_small; - Options.Reload = Flags.reload; + Options.ReloadIntervalSec = Flags.reload; Options.OnlyASCII = Flags.only_ascii; Options.OutputCSV = Flags.output_csv; Options.DetectLeaks = Flags.detect_leaks; diff --git a/llvm/lib/Fuzzer/FuzzerFlags.def b/llvm/lib/Fuzzer/FuzzerFlags.def index ea998bb9a9e..03db9ade7f7 100644 --- a/llvm/lib/Fuzzer/FuzzerFlags.def +++ b/llvm/lib/Fuzzer/FuzzerFlags.def @@ -56,9 +56,9 @@ FUZZER_FLAG_INT(jobs, 0, "Number of jobs to run. If jobs >= 1 we spawn" FUZZER_FLAG_INT(workers, 0, "Number of simultaneous worker processes to run the jobs." " If zero, \"min(jobs,NumberOfCpuCores()/2)\" is used.") -FUZZER_FLAG_INT(reload, 1, - "Reload the main corpus periodically to get new units" - " discovered by other processes.") +FUZZER_FLAG_INT(reload, 10, + "Reload the main corpus every <N> seconds to get new units" + " discovered by other processes. If 0, disabled") FUZZER_FLAG_INT(report_slow_units, 10, "Report slowest units if they run for more than this number of seconds.") FUZZER_FLAG_INT(only_ascii, 0, diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp index 49b58ddf5d5..be006ce7cdc 100644 --- a/llvm/lib/Fuzzer/FuzzerLoop.cpp +++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp @@ -149,7 +149,7 @@ Fuzzer::Fuzzer(UserCallback CB, InputCorpus &Corpus, MutationDispatcher &MD, if (Options.Verbosity) TPC.PrintModuleInfo(); - if (!Options.OutputCorpus.empty() && Options.Reload) + if (!Options.OutputCorpus.empty() && Options.ReloadIntervalSec) EpochOfLastReadOfOutputCorpus = GetEpoch(Options.OutputCorpus); MaxInputLen = MaxMutationLen = Options.MaxLen; AllocateCurrentUnitData(); @@ -383,22 +383,25 @@ void Fuzzer::CheckExitOnSrcPos() { } void Fuzzer::RereadOutputCorpus(size_t MaxSize) { - if (Options.OutputCorpus.empty() || !Options.Reload) return; + if (Options.OutputCorpus.empty() || !Options.ReloadIntervalSec) return; std::vector<Unit> AdditionalCorpus; ReadDirToVectorOfUnits(Options.OutputCorpus.c_str(), &AdditionalCorpus, &EpochOfLastReadOfOutputCorpus, MaxSize); if (Options.Verbosity >= 2) Printf("Reload: read %zd new units.\n", AdditionalCorpus.size()); + bool Reloaded = false; for (auto &U : AdditionalCorpus) { if (U.size() > MaxSize) U.resize(MaxSize); if (!Corpus.HasUnit(U)) { if (size_t NumFeatures = RunOne(U)) { Corpus.AddToCorpus(U, NumFeatures); - PrintStats("RELOAD"); + Reloaded = true; } } } + if (Reloaded) + PrintStats("RELOAD"); } void Fuzzer::ShuffleCorpus(UnitVector *V) { @@ -705,7 +708,8 @@ void Fuzzer::Loop() { MD.SetCorpus(&Corpus); while (true) { auto Now = system_clock::now(); - if (duration_cast<seconds>(Now - LastCorpusReload).count()) { + if (duration_cast<seconds>(Now - LastCorpusReload).count() >= + Options.ReloadIntervalSec) { RereadOutputCorpus(MaxInputLen); LastCorpusReload = Now; } diff --git a/llvm/lib/Fuzzer/FuzzerOptions.h b/llvm/lib/Fuzzer/FuzzerOptions.h index 04a44d8c9ff..ed31fa22b34 100644 --- a/llvm/lib/Fuzzer/FuzzerOptions.h +++ b/llvm/lib/Fuzzer/FuzzerOptions.h @@ -32,7 +32,7 @@ struct FuzzingOptions { bool UseMemmem = true; bool UseValueProfile = false; bool Shrink = false; - bool Reload = true; + int ReloadIntervalSec = 1; bool ShuffleAtStartUp = true; bool PreferSmall = true; size_t MaxNumberOfRuns = -1L; |