[libFuzzer] When -test_single_input crashes the test it is not necessary to write...
[oota-llvm.git] / lib / Fuzzer / FuzzerDriver.cpp
index b267a9bf039fe7e79240684561a7231c637d894c..55d1491c7cf3f4553efe24b8226a84a316be01d2 100644 (file)
@@ -270,17 +270,24 @@ int FuzzerDriver(const std::vector<std::string> &Args,
     Options.SyncCommand = Flags.sync_command;
   Options.SyncTimeout = Flags.sync_timeout;
   Options.ReportSlowUnits = Flags.report_slow_units;
+  if (Flags.artifact_prefix)
+    Options.ArtifactPrefix = Flags.artifact_prefix;
   if (Flags.dict)
     if (!ParseDictionaryFile(FileToString(Flags.dict), &Options.Dictionary))
       return 1;
   if (Flags.verbosity > 0 && !Options.Dictionary.empty())
     Printf("Dictionary: %zd entries\n", Options.Dictionary.size());
+  Options.SaveArtifacts = !Flags.test_single_input;
 
   Fuzzer F(USF, Options);
 
   if (Flags.apply_tokens)
     return ApplyTokens(F, Flags.apply_tokens);
 
+  // Timer
+  if (Flags.timeout > 0)
+    SetTimer(Flags.timeout / 2 + 1);
+
   if (Flags.test_single_input)
     return RunOneTest(&F, Flags.test_single_input);
 
@@ -292,10 +299,6 @@ int FuzzerDriver(const std::vector<std::string> &Args,
     Printf("Seed: %u\n", Seed);
   USF.GetRand().ResetSeed(Seed);
 
-  // Timer
-  if (Flags.timeout > 0)
-    SetTimer(Flags.timeout / 2 + 1);
-
   if (Flags.verbosity >= 2) {
     Printf("Tokens: {");
     for (auto &T : Options.Tokens)
@@ -318,7 +321,7 @@ int FuzzerDriver(const std::vector<std::string> &Args,
     Printf("Done %d runs in %zd second(s)\n", F.getTotalNumberOfRuns(),
            F.secondsSinceProcessStartUp());
 
-  return 0;
+  exit(0);  // Don't let F destroy itself.
 }
 
 }  // namespace fuzzer