Changeset View
Changeset View
Standalone View
Standalone View
compiler-rt/lib/fuzzer/FuzzerDriver.cpp
Show First 20 Lines • Show All 702 Lines • ▼ Show 20 Lines | int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { | ||||
if (Flags.data_flow_trace) | if (Flags.data_flow_trace) | ||||
Options.DataFlowTrace = Flags.data_flow_trace; | Options.DataFlowTrace = Flags.data_flow_trace; | ||||
if (Flags.features_dir) | if (Flags.features_dir) | ||||
Options.FeaturesDir = Flags.features_dir; | Options.FeaturesDir = Flags.features_dir; | ||||
if (Flags.collect_data_flow) | if (Flags.collect_data_flow) | ||||
Options.CollectDataFlow = Flags.collect_data_flow; | Options.CollectDataFlow = Flags.collect_data_flow; | ||||
if (Flags.stop_file) | if (Flags.stop_file) | ||||
Options.StopFile = Flags.stop_file; | Options.StopFile = Flags.stop_file; | ||||
Options.Entropic = Flags.entropic; | |||||
Options.ConsideredRare = (size_t)Flags.considered_rare; | |||||
Options.TopXRarestFeatures = (size_t)Flags.topX_rarest_features; | |||||
if (Options.Entropic) { | |||||
if (!Options.FocusFunction.empty()) { | |||||
Printf("ERROR: The parameters `--entropic` and `--focus_function` cannot " | |||||
"be used together.\n"); | |||||
exit(1); | |||||
} | |||||
Printf("INFO: Running with entropic power schedule (0x%X, %d).\n", | |||||
Options.ConsideredRare, Options.TopXRarestFeatures); | |||||
} | |||||
unsigned Seed = Flags.seed; | unsigned Seed = Flags.seed; | ||||
// Initialize Seed. | // Initialize Seed. | ||||
if (Seed == 0) | if (Seed == 0) | ||||
Seed = | Seed = | ||||
std::chrono::system_clock::now().time_since_epoch().count() + GetPid(); | std::chrono::system_clock::now().time_since_epoch().count() + GetPid(); | ||||
if (Flags.verbosity) | if (Flags.verbosity) | ||||
Printf("INFO: Seed: %u\n", Seed); | Printf("INFO: Seed: %u\n", Seed); | ||||
if (Flags.collect_data_flow && !Flags.fork && !Flags.merge) { | if (Flags.collect_data_flow && !Flags.fork && !Flags.merge) { | ||||
if (RunIndividualFiles) | if (RunIndividualFiles) | ||||
return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, | return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, | ||||
ReadCorpora({}, *Inputs)); | ReadCorpora({}, *Inputs)); | ||||
else | else | ||||
return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, | return CollectDataFlow(Flags.collect_data_flow, Flags.data_flow_trace, | ||||
ReadCorpora(*Inputs, {})); | ReadCorpora(*Inputs, {})); | ||||
} | } | ||||
Random Rand(Seed); | Random Rand(Seed); | ||||
auto *MD = new MutationDispatcher(Rand, Options); | auto *MD = new MutationDispatcher(Rand, Options); | ||||
auto *Corpus = new InputCorpus(Options.OutputCorpus); | auto *Corpus = | ||||
new InputCorpus(Options.OutputCorpus, Options.Entropic, | |||||
Options.ConsideredRare, Options.TopXRarestFeatures); | |||||
auto *F = new Fuzzer(Callback, *Corpus, *MD, Options); | auto *F = new Fuzzer(Callback, *Corpus, *MD, Options); | ||||
for (auto &U: Dictionary) | for (auto &U: Dictionary) | ||||
if (U.size() <= Word::GetMaxSize()) | if (U.size() <= Word::GetMaxSize()) | ||||
MD->AddWordToManualDictionary(Word(U.data(), U.size())); | MD->AddWordToManualDictionary(Word(U.data(), U.size())); | ||||
// Threads are only supported by Chrome. Don't use them with emscripten | // Threads are only supported by Chrome. Don't use them with emscripten | ||||
// for now. | // for now. | ||||
▲ Show 20 Lines • Show All 100 Lines • Show Last 20 Lines |