Lines Matching +full:set +full:- +full:env
1 //===- FuzzerFork.cpp - run fuzzing in separate subprocesses --------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 //===----------------------------------------------------------------------===//
95 std::set<uint32_t> Features, Cov;
96 std::set<std::string> FilesWithDFT;
116 std::chrono::system_clock::now() - ProcessStartTime) in secondsSinceProcessStartUp()
144 size_t StartIndex = ((JobId - 1) % NumCorpuses) * AverageCorpusSize; in CreateNewJob()
149 : Rand->SkewTowardsLast(Files.size()); in CreateNewJob()
156 auto &SF = Files[Rand->SkewTowardsLast(Files.size())]; in CreateNewJob()
162 auto DftTimeInSeconds = duration_cast<seconds>(Time2 - Time1).count(); in CreateNewJob()
164 Job->DftTimeInSeconds = static_cast<int>(DftTimeInSeconds); in CreateNewJob()
167 Job->SeedListPath = in CreateNewJob()
169 WriteToFile(Seeds, Job->SeedListPath); in CreateNewJob()
170 Cmd.addFlag("seed_inputs", "@" + Job->SeedListPath); in CreateNewJob()
172 Job->LogPath = DirPlusFile(TempDir, std::to_string(JobId) + ".log"); in CreateNewJob()
173 Job->CorpusDir = DirPlusFile(TempDir, "C" + std::to_string(JobId)); in CreateNewJob()
174 Job->FeaturesDir = DirPlusFile(TempDir, "F" + std::to_string(JobId)); in CreateNewJob()
175 Job->CFPath = DirPlusFile(TempDir, std::to_string(JobId) + ".merge"); in CreateNewJob()
176 Job->JobId = JobId; in CreateNewJob()
179 Cmd.addArgument(Job->CorpusDir); in CreateNewJob()
180 Cmd.addFlag("features_dir", Job->FeaturesDir); in CreateNewJob()
182 for (auto &D : {Job->CorpusDir, Job->FeaturesDir}) { in CreateNewJob()
187 Cmd.setOutputFile(Job->LogPath); in CreateNewJob()
190 Job->Cmd = Cmd; in CreateNewJob()
194 Job->Cmd.toString().c_str()); in CreateNewJob()
200 auto Stats = ParseFinalStatsFromLog(Job->LogPath); in RunOneMergeJob()
206 GetSizedFilesFromDir(Job->CorpusDir, &TempFiles); in RunOneMergeJob()
210 FeatureFile.replace(0, Job->CorpusDir.size(), Job->FeaturesDir); in RunOneMergeJob()
222 // if (!FilesToAdd.empty() || Job->ExitCode != 0) in RunOneMergeJob()
227 secondsSinceProcessStartUp(), Job->JobId, Job->DftTimeInSeconds); in RunOneMergeJob()
232 std::set<uint32_t> NewFeatures, NewCov; in RunOneMergeJob()
234 !Job->Cmd.getFlagValue("set_cover_merge").compare("1"); in RunOneMergeJob()
236 &NewFeatures, Cov, &NewCov, Job->CFPath, false, in RunOneMergeJob()
245 std::upper_bound(FilesSizes.begin(), FilesSizes.end(), UnitSize) - in RunOneMergeJob()
259 TPC.GetNextInstructionPc(TE->PC)); in RunOneMergeJob()
304 while (auto Job = FuzzQ->Pop()) { in WorkerThread()
306 Job->ExitCode = ExecuteCommand(Job->Cmd); in WorkerThread()
307 MergeQ->Push(Job); in WorkerThread()
311 // This is just a skeleton of an experimental -fork=1 feature.
315 Printf("INFO: -fork=%d: fuzzing in separate process(s)\n", NumJobs); in FuzzWithFork()
317 GlobalEnv Env; in FuzzWithFork() local
318 Env.Args = Args; in FuzzWithFork()
319 Env.CorpusDirs = CorpusDirs; in FuzzWithFork()
320 Env.Rand = &Rand; in FuzzWithFork()
321 Env.Verbosity = Options.Verbosity; in FuzzWithFork()
322 Env.ProcessStartTime = std::chrono::system_clock::now(); in FuzzWithFork()
323 Env.DataFlowBinary = Options.CollectDataFlow; in FuzzWithFork()
324 Env.Group = Options.ForkCorpusGroups; in FuzzWithFork()
330 Env.TempDir = TempPath("FuzzWithFork", ".dir"); in FuzzWithFork()
331 Env.DFTDir = DirPlusFile(Env.TempDir, "DFT"); in FuzzWithFork()
332 RmDirRecursive(Env.TempDir); // in case there is a leftover from old runs. in FuzzWithFork()
333 MkDir(Env.TempDir); in FuzzWithFork()
334 MkDir(Env.DFTDir); in FuzzWithFork()
338 MkDir(Env.MainCorpusDir = DirPlusFile(Env.TempDir, "C")); in FuzzWithFork()
340 Env.MainCorpusDir = CorpusDirs[0]; in FuzzWithFork()
344 Env.Files.push_back(File.File); in FuzzWithFork()
346 auto CFPath = DirPlusFile(Env.TempDir, "merge.txt"); in FuzzWithFork()
347 std::set<uint32_t> NewFeatures, NewCov; in FuzzWithFork()
348 CrashResistantMerge(Env.Args, {}, SeedFiles, &Env.Files, Env.Features, in FuzzWithFork()
349 &NewFeatures, Env.Cov, &NewCov, CFPath, in FuzzWithFork()
351 Env.Features.insert(NewFeatures.begin(), NewFeatures.end()); in FuzzWithFork()
352 Env.Cov.insert(NewCov.begin(), NewCov.end()); in FuzzWithFork()
356 if (Env.Group) { in FuzzWithFork()
357 for (auto &path : Env.Files) in FuzzWithFork()
358 Env.FilesSizes.push_back(FileSize(path)); in FuzzWithFork()
361 Printf("INFO: -fork=%d: %zd seed inputs, starting to fuzz in %s\n", NumJobs, in FuzzWithFork()
362 Env.Files.size(), Env.TempDir.c_str()); in FuzzWithFork()
372 WriteToFile(Unit({1}), Env.StopFile()); in FuzzWithFork()
381 FuzzQ.Push(Env.CreateNewJob(JobId++)); in FuzzWithFork()
388 ExitCode = Job->ExitCode; in FuzzWithFork()
396 Env.RunOneMergeJob(Job.get()); in FuzzWithFork()
400 if (Env.Group && JobExecuted >= MergeCycle) { in FuzzWithFork()
406 auto CFPath = DirPlusFile(Env.TempDir, "merge.txt"); in FuzzWithFork()
407 std::set<uint32_t> TmpNewFeatures, TmpNewCov; in FuzzWithFork()
408 std::set<uint32_t> TmpFeatures, TmpCov; in FuzzWithFork()
409 Env.Files.clear(); in FuzzWithFork()
410 Env.FilesSizes.clear(); in FuzzWithFork()
411 CrashResistantMerge(Env.Args, {}, CurrentSeedFiles, &Env.Files, in FuzzWithFork()
414 for (auto &path : Env.Files) in FuzzWithFork()
415 Env.FilesSizes.push_back(FileSize(path)); in FuzzWithFork()
424 if (Env.Files.size() < 2000) in FuzzWithFork()
425 Env.NumCorpuses = 12; in FuzzWithFork()
426 else if (Env.Files.size() < 6000) in FuzzWithFork()
427 Env.NumCorpuses = 20; in FuzzWithFork()
428 else if (Env.Files.size() < 12000) in FuzzWithFork()
429 Env.NumCorpuses = 32; in FuzzWithFork()
430 else if (Env.Files.size() < 16000) in FuzzWithFork()
431 Env.NumCorpuses = 40; in FuzzWithFork()
432 else if (Env.Files.size() < 24000) in FuzzWithFork()
433 Env.NumCorpuses = 60; in FuzzWithFork()
435 Env.NumCorpuses = 80; in FuzzWithFork()
439 Env.NumTimeouts++; in FuzzWithFork()
441 Env.NumOOMs++; in FuzzWithFork()
443 Env.NumCrashes++; in FuzzWithFork()
445 std::ifstream In(Job->LogPath); in FuzzWithFork()
454 FileToString(Job->LogPath).c_str()); in FuzzWithFork()
465 Env.secondsSinceProcessStartUp() >= (size_t)Options.MaxTotalTimeSec) { in FuzzWithFork()
467 Env.secondsSinceProcessStartUp()); in FuzzWithFork()
471 if (Env.NumRuns >= Options.MaxNumberOfRuns) { in FuzzWithFork()
473 Env.NumRuns); in FuzzWithFork()
478 FuzzQ.Push(Env.CreateNewJob(JobId++)); in FuzzWithFork()
486 RmDirRecursive(Env.TempDir); in FuzzWithFork()
490 Env.secondsSinceProcessStartUp()); in FuzzWithFork()