diff options
author | Kostya Serebryany <kcc@google.com> | 2019-05-10 01:34:26 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2019-05-10 01:34:26 +0000 |
commit | d912fff639b76c8c23d7544555cf1d5fd7de6e29 (patch) | |
tree | 256cd17862dccf72c732a23fb90c0ebefafb844f /lib/fuzzer/FuzzerDriver.cpp | |
parent | cd390b7f8ff46b751ed12c17a0d0ac4dea7a37b6 (diff) | |
download | compiler-rt-d912fff639b76c8c23d7544555cf1d5fd7de6e29.tar.gz |
[libFuzzer] code refactoring; NFC
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@360400 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/fuzzer/FuzzerDriver.cpp')
-rw-r--r-- | lib/fuzzer/FuzzerDriver.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/lib/fuzzer/FuzzerDriver.cpp b/lib/fuzzer/FuzzerDriver.cpp index 7a963ad66..95ce8bbe9 100644 --- a/lib/fuzzer/FuzzerDriver.cpp +++ b/lib/fuzzer/FuzzerDriver.cpp @@ -584,6 +584,22 @@ Vector<std::string> ParseSeedInuts(const char *seed_inputs) { return Files; } +static Vector<SizedFile> ReadCorpora(const Vector<std::string> &CorpusDirs, + const Vector<std::string> &ExtraSeedFiles) { + Vector<SizedFile> SizedFiles; + size_t LastNumFiles = 0; + for (auto &Dir : CorpusDirs) { + GetSizedFilesFromDir(Dir, &SizedFiles); + Printf("INFO: % 8zd files found in %s\n", SizedFiles.size() - LastNumFiles, + Dir.c_str()); + LastNumFiles = SizedFiles.size(); + } + for (auto &File : ExtraSeedFiles) + if (auto Size = FileSize(File)) + SizedFiles.push_back({File, Size}); + return SizedFiles; +} + int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { using namespace fuzzer; assert(argc && argv && "Argument pointers cannot be nullptr"); @@ -666,9 +682,9 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { return 1; if (Flags.verbosity > 0 && !Dictionary.empty()) Printf("Dictionary: %zd entries\n", Dictionary.size()); - bool DoPlainRun = AllInputsAreFiles(); + bool RunIndividualFiles = AllInputsAreFiles(); Options.SaveArtifacts = - !DoPlainRun || Flags.minimize_crash_internal_step; + !RunIndividualFiles || Flags.minimize_crash_internal_step; Options.PrintNewCovPcs = Flags.print_pcs; Options.PrintNewCovFuncs = Flags.print_funcs; Options.PrintFinalStats = Flags.print_final_stats; @@ -686,8 +702,6 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { Options.FeaturesDir = Flags.features_dir; Options.LazyCounters = Flags.lazy_counters; - auto ExtraSeedFiles = ParseSeedInuts(Flags.seed_inputs); - unsigned Seed = Flags.seed; // Initialize Seed. if (Seed == 0) @@ -696,9 +710,14 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { if (Flags.verbosity) Printf("INFO: Seed: %u\n", Seed); - if (Flags.collect_data_flow) - return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, - *Inputs, ExtraSeedFiles); + if (Flags.collect_data_flow) { + if (RunIndividualFiles) + return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, + ReadCorpora({}, *Inputs)); + else + return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, + ReadCorpora(*Inputs, {})); + } Random Rand(Seed); auto *MD = new MutationDispatcher(Rand, Options); @@ -734,7 +753,7 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { if (Flags.cleanse_crash) return CleanseCrashInput(Args, Options); - if (DoPlainRun) { + if (RunIndividualFiles) { Options.SaveArtifacts = false; int Runs = std::max(1, Flags.runs); Printf("%s: Running %zd inputs %d time(s) each.\n", ProgName->c_str(), @@ -792,7 +811,8 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { exit(0); } - F->Loop(*Inputs, ExtraSeedFiles); + auto CorporaFiles = ReadCorpora(*Inputs, ParseSeedInuts(Flags.seed_inputs)); + F->Loop(CorporaFiles); if (Flags.verbosity) Printf("Done %zd runs in %zd second(s)\n", F->getTotalNumberOfRuns(), |