diff options
author | Kostya Serebryany <kcc@google.com> | 2016-03-12 01:57:04 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2016-03-12 01:57:04 +0000 |
commit | 64d24578d8e199a5f0de8849179ab58807747afb (patch) | |
tree | e3441a9956b880c6019e4f2d9ee76a7db176105a /llvm/lib/Fuzzer/FuzzerLoop.cpp | |
parent | a0d9990c59f4e4f6637d72ff8d69f01f7d47b73b (diff) | |
download | llvm-64d24578d8e199a5f0de8849179ab58807747afb.zip llvm-64d24578d8e199a5f0de8849179ab58807747afb.tar.gz llvm-64d24578d8e199a5f0de8849179ab58807747afb.tar.bz2 |
[libFuzzer] try to use max_len based on the items of the corpus instead of blindly defaulting to 64 bytes.
llvm-svn: 263323
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerLoop.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerLoop.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp index 0438f41..2bae761 100644 --- a/llvm/lib/Fuzzer/FuzzerLoop.cpp +++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp @@ -199,12 +199,27 @@ void Fuzzer::PrintFinalStats() { Printf("stat::peak_rss_mb: %zd\n", GetPeakRSSMb()); } -void Fuzzer::RereadOutputCorpus() { +size_t Fuzzer::MaxUnitSizeInCorpus() const { + size_t Res = 0; + for (auto &X : Corpus) + Res = std::max(Res, X.size()); + return Res; +} + +void Fuzzer::SetMaxLen(size_t MaxLen) { + assert(Options.MaxLen == 0); // Can only reset MaxLen from 0 to non-0. + assert(MaxLen); + Options.MaxLen = MaxLen; + Printf("INFO: -max_len is not provided, using %zd\n", Options.MaxLen); +} + + +void Fuzzer::RereadOutputCorpus(size_t MaxSize) { if (Options.OutputCorpus.empty()) return; std::vector<Unit> AdditionalCorpus; ReadDirToVectorOfUnits(Options.OutputCorpus.c_str(), &AdditionalCorpus, - &EpochOfLastReadOfOutputCorpus, Options.MaxLen); + &EpochOfLastReadOfOutputCorpus, MaxSize); if (Corpus.empty()) { Corpus = AdditionalCorpus; return; @@ -214,8 +229,8 @@ void Fuzzer::RereadOutputCorpus() { if (Options.Verbosity >= 2) Printf("Reload: read %zd new units.\n", AdditionalCorpus.size()); for (auto &X : AdditionalCorpus) { - if (X.size() > (size_t)Options.MaxLen) - X.resize(Options.MaxLen); + if (X.size() > MaxSize) + X.resize(MaxSize); if (UnitHashesAddedToCorpus.insert(Hash(X)).second) { if (RunOne(X)) { Corpus.push_back(X); @@ -231,7 +246,7 @@ void Fuzzer::ShuffleAndMinimize() { (Options.PreferSmallDuringInitialShuffle == -1 && MD.GetRand().RandBool())); if (Options.Verbosity) - Printf("PreferSmall: %d\n", PreferSmall); + Printf("INFO: PreferSmall: %d\n", PreferSmall); PrintStats("READ "); std::vector<Unit> NewCorpus; if (Options.ShuffleAtStartUp) { @@ -427,6 +442,7 @@ void Fuzzer::Merge(const std::vector<std::string> &Corpora) { return; } auto InitialCorpusDir = Corpora[0]; + assert(Options.MaxLen > 0); ReadDir(InitialCorpusDir, nullptr, Options.MaxLen); Printf("Merge: running the initial corpus '%s' of %d units\n", InitialCorpusDir.c_str(), Corpus.size()); @@ -469,7 +485,7 @@ void Fuzzer::MutateAndTestOne() { else NewSize = MD.Mutate(MutateInPlaceHere.data(), Size, Options.MaxLen); assert(NewSize > 0 && "Mutator returned empty unit"); - assert(NewSize <= (size_t)Options.MaxLen && + assert(NewSize <= Options.MaxLen && "Mutator return overisized unit"); Size = NewSize; if (i == 0) @@ -546,7 +562,7 @@ void Fuzzer::Loop() { SyncCorpus(); auto Now = system_clock::now(); if (duration_cast<seconds>(Now - LastCorpusReload).count()) { - RereadOutputCorpus(); + RereadOutputCorpus(Options.MaxLen); LastCorpusReload = Now; } if (TotalNumberOfRuns >= Options.MaxNumberOfRuns) |