diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
| commit | ca089b24d48ef6fa8da2d0bb8c25bb802c4a95c0 (patch) | |
| tree | 3a28a772df9b17aef34f49e3c727965ad28c0c93 /lib/Fuzzer/FuzzerLoop.cpp | |
| parent | 9df3605dea17e84f8183581f6103bd0c79e2a606 (diff) | |
Notes
Diffstat (limited to 'lib/Fuzzer/FuzzerLoop.cpp')
| -rw-r--r-- | lib/Fuzzer/FuzzerLoop.cpp | 66 | 
1 files changed, 36 insertions, 30 deletions
diff --git a/lib/Fuzzer/FuzzerLoop.cpp b/lib/Fuzzer/FuzzerLoop.cpp index fbf18357ede6..6816f3af8a6f 100644 --- a/lib/Fuzzer/FuzzerLoop.cpp +++ b/lib/Fuzzer/FuzzerLoop.cpp @@ -22,9 +22,6 @@  #include <set>  #if defined(__has_include) -#if __has_include(<sanitizer / coverage_interface.h>) -#include <sanitizer/coverage_interface.h> -#endif  #if __has_include(<sanitizer / lsan_interface.h>)  #include <sanitizer/lsan_interface.h>  #endif @@ -348,11 +345,8 @@ void Fuzzer::RereadOutputCorpus(size_t MaxSize) {      if (U.size() > MaxSize)        U.resize(MaxSize);      if (!Corpus.HasUnit(U)) { -      if (size_t NumFeatures = RunOne(U)) { -        CheckExitOnSrcPosOrItem(); -        Corpus.AddToCorpus(U, NumFeatures); +      if (RunOne(U.data(), U.size()))          Reloaded = true; -      }      }    }    if (Reloaded) @@ -377,10 +371,7 @@ void Fuzzer::ShuffleAndMinimize(UnitVector *InitialCorpus) {    ExecuteCallback(&dummy, 0);    for (const auto &U : *InitialCorpus) { -    if (size_t NumFeatures = RunOne(U)) { -      CheckExitOnSrcPosOrItem(); -      Corpus.AddToCorpus(U, NumFeatures); -    } +    RunOne(U.data(), U.size());      TryDetectingAMemoryLeak(U.data(), U.size(),                              /*DuringInitialCorpusExecution*/ true);    } @@ -392,18 +383,7 @@ void Fuzzer::ShuffleAndMinimize(UnitVector *InitialCorpus) {    }  } -size_t Fuzzer::RunOne(const uint8_t *Data, size_t Size) { -  if (!Size) return 0; -  TotalNumberOfRuns++; - -  ExecuteCallback(Data, Size); - -  size_t NumUpdatesBefore = Corpus.NumFeatureUpdates(); -  TPC.CollectFeatures([&](size_t Feature) { -    Corpus.AddFeature(Feature, Size, Options.Shrink); -  }); -  size_t NumUpdatesAfter = Corpus.NumFeatureUpdates(); - +void Fuzzer::PrintPulseAndReportSlowInput(const uint8_t *Data, size_t Size) {    auto TimeOfUnit =        duration_cast<seconds>(UnitStopTime - UnitStartTime).count();    if (!(TotalNumberOfRuns & (TotalNumberOfRuns - 1)) && @@ -415,7 +395,34 @@ size_t Fuzzer::RunOne(const uint8_t *Data, size_t Size) {      Printf("Slowest unit: %zd s:\n", TimeOfLongestUnitInSeconds);      WriteUnitToFileWithPrefix({Data, Data + Size}, "slow-unit-");    } -  return NumUpdatesAfter - NumUpdatesBefore; +} + +bool Fuzzer::RunOne(const uint8_t *Data, size_t Size, bool MayDeleteFile, +                    InputInfo *II) { +  if (!Size) return false; + +  ExecuteCallback(Data, Size); + +  FeatureSetTmp.clear(); +  size_t NumUpdatesBefore = Corpus.NumFeatureUpdates(); +  TPC.CollectFeatures([&](size_t Feature) { +    Corpus.AddFeature(Feature, Size, Options.Shrink); +    if (Options.ReduceInputs) +      FeatureSetTmp.push_back(Feature); +  }); +  PrintPulseAndReportSlowInput(Data, Size); +  size_t NumNewFeatures = Corpus.NumFeatureUpdates() - NumUpdatesBefore; +  if (NumNewFeatures) { +    Corpus.AddToCorpus({Data, Data + Size}, NumNewFeatures, MayDeleteFile, +                       FeatureSetTmp); +    CheckExitOnSrcPosOrItem(); +    return true; +  } +  if (II && Corpus.TryToReplace(II, Data, Size, FeatureSetTmp)) { +    CheckExitOnSrcPosOrItem(); +    return true; +  } +  return false;  }  size_t Fuzzer::GetCurrentUnitInFuzzingThead(const uint8_t **Data) const { @@ -443,6 +450,7 @@ static bool LooseMemeq(const uint8_t *A, const uint8_t *B, size_t Size) {  }  void Fuzzer::ExecuteCallback(const uint8_t *Data, size_t Size) { +  TotalNumberOfRuns++;    assert(InFuzzingThread());    if (SMR.IsClient())      SMR.WriteByteArray(Data, Size); @@ -595,12 +603,9 @@ void Fuzzer::MutateAndTestOne() {      if (i == 0)        StartTraceRecording();      II.NumExecutedMutations++; -    if (size_t NumFeatures = RunOne(CurrentUnitData, Size)) { -      Corpus.AddToCorpus({CurrentUnitData, CurrentUnitData + Size}, NumFeatures, -                         /*MayDeleteFile=*/true); +    if (RunOne(CurrentUnitData, Size, /*MayDeleteFile=*/true, &II))        ReportNewCoverage(&II, {CurrentUnitData, CurrentUnitData + Size}); -      CheckExitOnSrcPosOrItem(); -    } +      StopTraceRecording();      TryDetectingAMemoryLeak(CurrentUnitData, Size,                              /*DuringInitialCorpusExecution*/ false); @@ -638,7 +643,8 @@ void Fuzzer::MinimizeCrashLoop(const Unit &U) {      for (int i = 0; i < Options.MutateDepth; i++) {        size_t NewSize = MD.Mutate(CurrentUnitData, U.size(), MaxMutationLen);        assert(NewSize > 0 && NewSize <= MaxMutationLen); -      RunOne(CurrentUnitData, NewSize); +      ExecuteCallback(CurrentUnitData, NewSize); +      PrintPulseAndReportSlowInput(CurrentUnitData, NewSize);        TryDetectingAMemoryLeak(CurrentUnitData, NewSize,                                /*DuringInitialCorpusExecution*/ false);      }  | 
