summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2015-05-07 18:32:29 +0000
committerKostya Serebryany <kcc@google.com>2015-05-07 18:32:29 +0000
commit7d470cfb0cbf072996f899361777579cc73b85c1 (patch)
tree0d3891503426340d77a25e1c6e22e87f5c3429dd /llvm/lib/Fuzzer
parent3f3b3abe2bd01805e6df86667bd8da5e3cb2dd6c (diff)
downloadbcm5719-llvm-7d470cfb0cbf072996f899361777579cc73b85c1.tar.gz
bcm5719-llvm-7d470cfb0cbf072996f899361777579cc73b85c1.zip
[lib/Fuzzer] minor refactoring/simplification, NFC
llvm-svn: 236757
Diffstat (limited to 'llvm/lib/Fuzzer')
-rw-r--r--llvm/lib/Fuzzer/FuzzerDFSan.cpp7
-rw-r--r--llvm/lib/Fuzzer/FuzzerInternal.h6
-rw-r--r--llvm/lib/Fuzzer/FuzzerLoop.cpp59
3 files changed, 41 insertions, 31 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerDFSan.cpp b/llvm/lib/Fuzzer/FuzzerDFSan.cpp
index e3fda1615b8..a17ab60c788 100644
--- a/llvm/lib/Fuzzer/FuzzerDFSan.cpp
+++ b/llvm/lib/Fuzzer/FuzzerDFSan.cpp
@@ -287,4 +287,11 @@ void dfsan_weak_hook_memcmp(void *caller_pc, const void *s1, const void *s2,
dfsan_label L2 = dfsan_read_label(s2, n);
DFSan->DFSanCmpCallback(PC, n, ICMP_EQ, S1, S2, L1, L2);
}
+
+void __sanitizer_cov_trace_cmp(uint64_t SizeAndType, uint64_t Arg1,
+ uint64_t Arg2) {
+ // This symbol will be present if dfsan is disabled on the given function.
+ // FIXME: implement poor man's taint analysis here (w/o dfsan).
+}
+
} // extern "C"
diff --git a/llvm/lib/Fuzzer/FuzzerInternal.h b/llvm/lib/Fuzzer/FuzzerInternal.h
index 8948e3478c5..6fd3bfe799c 100644
--- a/llvm/lib/Fuzzer/FuzzerInternal.h
+++ b/llvm/lib/Fuzzer/FuzzerInternal.h
@@ -61,7 +61,7 @@ class Fuzzer {
};
Fuzzer(UserCallback Callback, FuzzingOptions Options);
void AddToCorpus(const Unit &U) { Corpus.push_back(U); }
- size_t Loop(size_t NumIterations);
+ void Loop(size_t NumIterations);
void ShuffleAndMinimize();
void InitializeDFSan();
size_t CorpusSize() const { return Corpus.size(); }
@@ -85,8 +85,10 @@ class Fuzzer {
private:
void AlarmCallback();
void ExecuteCallback(const Unit &U);
- size_t MutateAndTestOne(Unit *U);
+ void MutateAndTestOne(Unit *U);
+ void ReportNewCoverage(size_t NewCoverage, const Unit &U);
size_t RunOne(const Unit &U);
+ void RunOneAndUpdateCorpus(const Unit &U);
size_t RunOneMaximizeTotalCoverage(const Unit &U);
size_t RunOneMaximizeFullCoverageSet(const Unit &U);
size_t RunOneMaximizeCoveragePairs(const Unit &U);
diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp
index 3a19b22653d..57893e0f1fe 100644
--- a/llvm/lib/Fuzzer/FuzzerLoop.cpp
+++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp
@@ -143,6 +143,12 @@ size_t Fuzzer::RunOne(const Unit &U) {
return Res;
}
+void Fuzzer::RunOneAndUpdateCorpus(const Unit &U) {
+ if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
+ return;
+ ReportNewCoverage(RunOne(U), U);
+}
+
static uintptr_t HashOfArrayOfPCs(uintptr_t *PCs, uintptr_t NumPCs) {
uintptr_t Res = 0;
for (uintptr_t i = 0; i < NumPCs; i++) {
@@ -259,55 +265,50 @@ void Fuzzer::SaveCorpus() {
<< Options.OutputCorpus << "\n";
}
-size_t Fuzzer::MutateAndTestOne(Unit *U) {
- size_t NewUnits = 0;
+void Fuzzer::ReportNewCoverage(size_t NewCoverage, const Unit &U) {
+ if (!NewCoverage) return;
+ Corpus.push_back(U);
+ PrintStats("NEW ", NewCoverage, "");
+ if (Options.Verbosity) {
+ std::cerr << " L: " << U.size();
+ if (U.size() < 30) {
+ std::cerr << " ";
+ PrintUnitInASCIIOrTokens(U, "\t");
+ Print(U);
+ }
+ std::cerr << "\n";
+ }
+ WriteToOutputCorpus(U);
+ if (Options.ExitOnFirst)
+ exit(0);
+}
+
+void Fuzzer::MutateAndTestOne(Unit *U) {
for (int i = 0; i < Options.MutateDepth; i++) {
- if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
- return NewUnits;
MutateWithDFSan(U);
Mutate(U, Options.MaxLen);
- size_t NewCoverage = RunOne(*U);
- if (NewCoverage) {
- Corpus.push_back(*U);
- NewUnits++;
- PrintStats("NEW ", NewCoverage, "");
- if (Options.Verbosity) {
- std::cerr << " L: " << U->size();
- if (U->size() < 30) {
- std::cerr << " ";
- PrintUnitInASCIIOrTokens(*U, "\t");
- Print(*U);
- }
- std::cerr << "\n";
- }
- WriteToOutputCorpus(*U);
- if (Options.ExitOnFirst)
- exit(0);
- }
+ RunOneAndUpdateCorpus(*U);
}
- return NewUnits;
}
-size_t Fuzzer::Loop(size_t NumIterations) {
- size_t NewUnits = 0;
+void Fuzzer::Loop(size_t NumIterations) {
for (size_t i = 1; i <= NumIterations; i++) {
for (size_t J1 = 0; J1 < Corpus.size(); J1++) {
if (TotalNumberOfRuns >= Options.MaxNumberOfRuns)
- return NewUnits;
+ return;
// First, simply mutate the unit w/o doing crosses.
CurrentUnit = Corpus[J1];
- NewUnits += MutateAndTestOne(&CurrentUnit);
+ MutateAndTestOne(&CurrentUnit);
// Now, cross with others.
if (Options.DoCrossOver) {
for (size_t J2 = 0; J2 < Corpus.size(); J2++) {
CurrentUnit.clear();
CrossOver(Corpus[J1], Corpus[J2], &CurrentUnit, Options.MaxLen);
- NewUnits += MutateAndTestOne(&CurrentUnit);
+ MutateAndTestOne(&CurrentUnit);
}
}
}
}
- return NewUnits;
}
} // namespace fuzzer
OpenPOWER on IntegriCloud