[libFuzzer] add -shuffle flag
authorKostya Serebryany <kcc@google.com>
Sat, 17 Oct 2015 04:38:26 +0000 (04:38 +0000)
committerKostya Serebryany <kcc@google.com>
Sat, 17 Oct 2015 04:38:26 +0000 (04:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250603 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Fuzzer/FuzzerDriver.cpp
lib/Fuzzer/FuzzerFlags.def
lib/Fuzzer/FuzzerInternal.h
lib/Fuzzer/FuzzerLoop.cpp

index 55d1491c7cf3f4553efe24b8226a84a316be01d2..ce745fed387b929cf25732645ea74edc7cc9537a 100644 (file)
@@ -255,6 +255,7 @@ int FuzzerDriver(const std::vector<std::string> &Args,
   Options.ExitOnFirst = Flags.exit_on_first;
   Options.UseCounters = Flags.use_counters;
   Options.UseTraces = Flags.use_traces;
+  Options.ShuffleAtStartUp = Flags.shuffle;
   Options.PreferSmallDuringInitialShuffle =
       Flags.prefer_small_during_initial_shuffle;
   Options.Tokens = ReadTokensFile(Flags.deprecated_tokens);
index b50d6d4ad03a679c0853ffe03668a85ca800501c..e9767dc4531d802306217879d5f2bd4df052542c 100644 (file)
@@ -18,6 +18,7 @@ FUZZER_FLAG_INT(max_len, 64, "Maximum length of the test input.")
 FUZZER_FLAG_INT(cross_over, 1, "If 1, cross over inputs.")
 FUZZER_FLAG_INT(mutate_depth, 5,
             "Apply this number of consecutive mutations to each input.")
+FUZZER_FLAG_INT(shuffle, 1, "Shuffle inputs at startup")
 FUZZER_FLAG_INT(
     prefer_small_during_initial_shuffle, -1,
     "If 1, always prefer smaller inputs during the initial corpus shuffle."
index a720adb21e41af8a7193e3d3a38ddce564ad8f70..7391e5ff0bdbcb8afbf1641a4ce5eb0cb479e0e9 100644 (file)
@@ -82,6 +82,7 @@ class Fuzzer {
     bool UseTraces = false;
     bool UseFullCoverageSet  = false;
     bool Reload = true;
+    bool ShuffleAtStartUp = true;
     int PreferSmallDuringInitialShuffle = -1;
     size_t MaxNumberOfRuns = ULONG_MAX;
     int SyncTimeout = 600;
index a642bbbf5cba8cd8941f839136929e5b51c0b1f6..ef71407d21cb688653310f2ace97fe13e559ba4e 100644 (file)
@@ -137,11 +137,13 @@ void Fuzzer::ShuffleAndMinimize() {
     Printf("PreferSmall: %d\n", PreferSmall);
   PrintStats("READ  ", 0);
   std::vector<Unit> NewCorpus;
-  std::random_shuffle(Corpus.begin(), Corpus.end(), USF.GetRand());
-  if (PreferSmall)
-    std::stable_sort(
-        Corpus.begin(), Corpus.end(),
-        [](const Unit &A, const Unit &B) { return A.size() < B.size(); });
+  if (Options.ShuffleAtStartUp) {
+    std::random_shuffle(Corpus.begin(), Corpus.end(), USF.GetRand());
+    if (PreferSmall)
+      std::stable_sort(
+          Corpus.begin(), Corpus.end(),
+          [](const Unit &A, const Unit &B) { return A.size() < B.size(); });
+  }
   Unit &U = CurrentUnit;
   for (const auto &C : Corpus) {
     for (size_t First = 0; First < 1; First++) {