summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/FuzzerLoop.cpp
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2016-10-05 22:56:21 +0000
committerKostya Serebryany <kcc@google.com>2016-10-05 22:56:21 +0000
commit1c73f1bf274edcadfcd4cc95f4adc89dff8cb5fb (patch)
treee13ce2de9795de3e90c1ee88707281ae25572d5a /llvm/lib/Fuzzer/FuzzerLoop.cpp
parentae34c56ee77ba6f9096dcec543d99d9ab87a6718 (diff)
downloadbcm5719-llvm-1c73f1bf274edcadfcd4cc95f4adc89dff8cb5fb.tar.gz
bcm5719-llvm-1c73f1bf274edcadfcd4cc95f4adc89dff8cb5fb.zip
[libFuzzer] refactoring to make -shrink=1 work for value profile, added a test.
llvm-svn: 283409
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerLoop.cpp')
-rw-r--r--llvm/lib/Fuzzer/FuzzerLoop.cpp55
1 files changed, 21 insertions, 34 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp
index 35d68bce694..6c1f376d8ef 100644
--- a/llvm/lib/Fuzzer/FuzzerLoop.cpp
+++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp
@@ -299,18 +299,18 @@ void Fuzzer::PrintStats(const char *Where, const char *End, size_t Units) {
Printf("#%zd\t%s", TotalNumberOfRuns, Where);
if (MaxCoverage.BlockCoverage)
Printf(" cov: %zd", MaxCoverage.BlockCoverage);
+ if (size_t N = MaxCoverage.VPMap.GetNumBitsSinceLastMerge())
+ Printf(" vp: %zd", N);
if (size_t N = TPC.GetTotalPCCoverage())
Printf(" cov: %zd", N);
- if (MaxCoverage.VPMap.GetNumBitsSinceLastMerge())
- Printf(" vp: %zd", MaxCoverage.VPMap.GetNumBitsSinceLastMerge());
if (auto TB = MaxCoverage.CounterBitmapBits)
Printf(" bits: %zd", TB);
- if (auto TB = MaxCoverage.TPCMap.GetNumBitsSinceLastMerge())
- Printf(" bits: %zd", MaxCoverage.TPCMap.GetNumBitsSinceLastMerge());
+ if (size_t N = Corpus.NumFeatures())
+ Printf( " ft: %zd", N);
if (MaxCoverage.CallerCalleeCoverage)
Printf(" indir: %zd", MaxCoverage.CallerCalleeCoverage);
if (size_t N = Corpus.size()) {
- Printf(" corpus: %zd", Corpus.NumActiveUnits());
+ Printf(" corp: %zd", Corpus.NumActiveUnits());
if (size_t N = Corpus.SizeInBytes()) {
if (N < (1<<14))
Printf("/%zdb", N);
@@ -392,8 +392,8 @@ void Fuzzer::RereadOutputCorpus(size_t MaxSize) {
if (U.size() > MaxSize)
U.resize(MaxSize);
if (!Corpus.HasUnit(U)) {
- if (RunOne(U)) {
- Corpus.AddToCorpus(U);
+ if (size_t NumFeatures = RunOne(U)) {
+ Corpus.AddToCorpus(U, NumFeatures);
PrintStats("RELOAD");
}
}
@@ -418,8 +418,8 @@ void Fuzzer::ShuffleAndMinimize(UnitVector *InitialCorpus) {
ExecuteCallback(&dummy, 0);
for (const auto &U : *InitialCorpus) {
- if (RunOne(U)) {
- Corpus.AddToCorpus(U);
+ if (size_t NumFeatures = RunOne(U)) {
+ Corpus.AddToCorpus(U, NumFeatures);
if (Options.Verbosity >= 2)
Printf("NEW0: %zd L %zd\n", MaxCoverage.BlockCoverage, U.size());
}
@@ -434,27 +434,23 @@ void Fuzzer::ShuffleAndMinimize(UnitVector *InitialCorpus) {
}
}
-bool Fuzzer::RunOne(const uint8_t *Data, size_t Size) {
+size_t Fuzzer::RunOne(const uint8_t *Data, size_t Size) {
+ if (!Size) return 0;
TotalNumberOfRuns++;
ExecuteCallback(Data, Size);
- bool Res = false;
- if (TPC.FinalizeTrace(Size))
- if (Options.Shrink)
- Res = true;
-
- if (!Res) {
- if (TPC.UpdateCounterMap(&MaxCoverage.TPCMap))
- Res = true;
+ size_t Res = 0;
+ if (size_t NumFeatures = TPC.FinalizeTrace(&Corpus, Size, Options.Shrink))
+ Res = NumFeatures;
+ if (!TPC.UsingTracePcGuard()) {
if (TPC.UpdateValueProfileMap(&MaxCoverage.VPMap))
- Res = true;
+ Res = 1;
+ if (!Res && RecordMaxCoverage(&MaxCoverage))
+ Res = 1;
}
- if (RecordMaxCoverage(&MaxCoverage))
- Res = true;
-
CheckExitOnSrcPos();
auto TimeOfUnit =
duration_cast<seconds>(UnitStopTime - UnitStartTime).count();
@@ -500,16 +496,6 @@ void Fuzzer::ExecuteCallback(const uint8_t *Data, size_t Size) {
delete[] DataCopy;
}
-std::string Fuzzer::Coverage::DebugString() const {
- std::string Result =
- std::string("Coverage{") + "BlockCoverage=" +
- std::to_string(BlockCoverage) + " CallerCalleeCoverage=" +
- std::to_string(CallerCalleeCoverage) + " CounterBitmapBits=" +
- std::to_string(CounterBitmapBits) + " VPMapBits " +
- std::to_string(VPMap.GetNumBitsSinceLastMerge()) + "}";
- return Result;
-}
-
void Fuzzer::WriteToOutputCorpus(const Unit &U) {
if (Options.OnlyASCII)
assert(IsASCII(U));
@@ -694,8 +680,9 @@ void Fuzzer::MutateAndTestOne() {
if (i == 0)
StartTraceRecording();
II.NumExecutedMutations++;
- if (RunOne(CurrentUnitData, Size)) {
- Corpus.AddToCorpus({CurrentUnitData, CurrentUnitData + Size});
+ if (size_t NumFeatures = RunOne(CurrentUnitData, Size)) {
+ Corpus.AddToCorpus({CurrentUnitData, CurrentUnitData + Size},
+ NumFeatures);
ReportNewCoverage(&II, {CurrentUnitData, CurrentUnitData + Size});
CheckExitOnItem();
}
OpenPOWER on IntegriCloud