X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FFuzzer%2FFuzzerInternal.h;h=274fdf077a7fb7582a066873a23db3bfc274857e;hp=b0c27b0da3342cee6afcd9e95090b90948ac4711;hb=8d4c8061c9a8d4ca6bf30cd21368073b7d64e136;hpb=556425f9a9b6c0a2f4c7637b91893e186e62cf7a diff --git a/lib/Fuzzer/FuzzerInternal.h b/lib/Fuzzer/FuzzerInternal.h index b0c27b0da33..274fdf077a7 100644 --- a/lib/Fuzzer/FuzzerInternal.h +++ b/lib/Fuzzer/FuzzerInternal.h @@ -33,10 +33,16 @@ void CopyFileToErr(const std::string &Path); std::string DirPlusFile(const std::string &DirPath, const std::string &FileName); -void Mutate(Unit *U, size_t MaxLen); +size_t Mutate_EraseByte(uint8_t *Data, size_t size, size_t MaxSize, + FuzzerRandomBase &Rand); +size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize, + FuzzerRandomBase &Rand); -void CrossOver(const Unit &A, const Unit &B, Unit *U, size_t MaxLen); +size_t CrossOver(const uint8_t *Data1, size_t Size1, const uint8_t *Data2, + size_t Size2, uint8_t *Out, size_t MaxOutSize, + FuzzerRandomBase &Rand); +void Printf(const char *Fmt, ...); void Print(const Unit &U, const char *PrintAfter = ""); void PrintASCII(const Unit &U, const char *PrintAfter = ""); std::string Hash(const Unit &U); @@ -63,7 +69,6 @@ class Fuzzer { bool UseCounters = false; bool UseTraces = false; bool UseFullCoverageSet = false; - bool UseCoveragePairs = false; bool Reload = true; int PreferSmallDuringInitialShuffle = -1; size_t MaxNumberOfRuns = ULONG_MAX; @@ -72,7 +77,7 @@ class Fuzzer { std::string SyncCommand; std::vector Tokens; }; - Fuzzer(UserCallback Callback, FuzzingOptions Options); + Fuzzer(UserSuppliedFuzzer &USF, FuzzingOptions Options); void AddToCorpus(const Unit &U) { Corpus.push_back(U); } void Loop(size_t NumIterations); void ShuffleAndMinimize(); @@ -107,7 +112,7 @@ class Fuzzer { size_t RunOneMaximizeFullCoverageSet(const Unit &U); size_t RunOneMaximizeCoveragePairs(const Unit &U); void WriteToOutputCorpus(const Unit &U); - void WriteToCrash(const Unit &U, const char *Prefix); + void WriteUnitToFileWithPrefix(const Unit &U, const char *Prefix); void PrintStats(const char *Where, size_t Cov, const char *End = "\n"); void PrintUnitInASCIIOrTokens(const Unit &U, const char *PrintAfter = ""); @@ -134,7 +139,6 @@ class Fuzzer { std::vector Corpus; std::unordered_set UnitHashesAddedToCorpus; std::unordered_set FullCoverageSets; - std::unordered_set CoveragePairs; // For UseCounters std::vector CounterBitmap; @@ -144,7 +148,7 @@ class Fuzzer { return Res; } - UserCallback Callback; + UserSuppliedFuzzer &USF; FuzzingOptions Options; system_clock::time_point ProcessStartTime = system_clock::now(); system_clock::time_point LastExternalSync = system_clock::now(); @@ -153,4 +157,16 @@ class Fuzzer { long EpochOfLastReadOfOutputCorpus = 0; }; +class SimpleUserSuppliedFuzzer: public UserSuppliedFuzzer { + public: + SimpleUserSuppliedFuzzer(FuzzerRandomBase *Rand, UserCallback Callback) + : UserSuppliedFuzzer(Rand), Callback(Callback) {} + virtual void TargetFunction(const uint8_t *Data, size_t Size) { + return Callback(Data, Size); + } + + private: + UserCallback Callback; +}; + }; // namespace fuzzer