1*9880d681SAndroid Build Coastguard Worker //===- FuzzerInternal.h - Internal header for the Fuzzer --------*- C++ -* ===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // Define the main class fuzzer::Fuzzer and most functions. 10*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_FUZZER_INTERNAL_H 13*9880d681SAndroid Build Coastguard Worker #define LLVM_FUZZER_INTERNAL_H 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include <algorithm> 16*9880d681SAndroid Build Coastguard Worker #include <atomic> 17*9880d681SAndroid Build Coastguard Worker #include <cassert> 18*9880d681SAndroid Build Coastguard Worker #include <chrono> 19*9880d681SAndroid Build Coastguard Worker #include <climits> 20*9880d681SAndroid Build Coastguard Worker #include <cstddef> 21*9880d681SAndroid Build Coastguard Worker #include <cstdlib> 22*9880d681SAndroid Build Coastguard Worker #include <random> 23*9880d681SAndroid Build Coastguard Worker #include <string.h> 24*9880d681SAndroid Build Coastguard Worker #include <string> 25*9880d681SAndroid Build Coastguard Worker #include <unordered_set> 26*9880d681SAndroid Build Coastguard Worker #include <vector> 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker #include "FuzzerExtFunctions.h" 29*9880d681SAndroid Build Coastguard Worker #include "FuzzerInterface.h" 30*9880d681SAndroid Build Coastguard Worker #include "FuzzerTracePC.h" 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker // Platform detection. 33*9880d681SAndroid Build Coastguard Worker #ifdef __linux__ 34*9880d681SAndroid Build Coastguard Worker #define LIBFUZZER_LINUX 1 35*9880d681SAndroid Build Coastguard Worker #define LIBFUZZER_APPLE 0 36*9880d681SAndroid Build Coastguard Worker #elif __APPLE__ 37*9880d681SAndroid Build Coastguard Worker #define LIBFUZZER_LINUX 0 38*9880d681SAndroid Build Coastguard Worker #define LIBFUZZER_APPLE 1 39*9880d681SAndroid Build Coastguard Worker #else 40*9880d681SAndroid Build Coastguard Worker #error "Support for your platform has not been implemented" 41*9880d681SAndroid Build Coastguard Worker #endif 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker namespace fuzzer { 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker typedef int (*UserCallback)(const uint8_t *Data, size_t Size); 46*9880d681SAndroid Build Coastguard Worker int FuzzerDriver(int *argc, char ***argv, UserCallback Callback); 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker using namespace std::chrono; 49*9880d681SAndroid Build Coastguard Worker typedef std::vector<uint8_t> Unit; 50*9880d681SAndroid Build Coastguard Worker typedef std::vector<Unit> UnitVector; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker // A simple POD sized array of bytes. 53*9880d681SAndroid Build Coastguard Worker template <size_t kMaxSize> class FixedWord { 54*9880d681SAndroid Build Coastguard Worker public: FixedWord()55*9880d681SAndroid Build Coastguard Worker FixedWord() {} FixedWord(const uint8_t * B,uint8_t S)56*9880d681SAndroid Build Coastguard Worker FixedWord(const uint8_t *B, uint8_t S) { Set(B, S); } 57*9880d681SAndroid Build Coastguard Worker Set(const uint8_t * B,uint8_t S)58*9880d681SAndroid Build Coastguard Worker void Set(const uint8_t *B, uint8_t S) { 59*9880d681SAndroid Build Coastguard Worker assert(S <= kMaxSize); 60*9880d681SAndroid Build Coastguard Worker memcpy(Data, B, S); 61*9880d681SAndroid Build Coastguard Worker Size = S; 62*9880d681SAndroid Build Coastguard Worker } 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker bool operator==(const FixedWord<kMaxSize> &w) const { 65*9880d681SAndroid Build Coastguard Worker return Size == w.Size && 0 == memcmp(Data, w.Data, Size); 66*9880d681SAndroid Build Coastguard Worker } 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker bool operator<(const FixedWord<kMaxSize> &w) const { 69*9880d681SAndroid Build Coastguard Worker if (Size != w.Size) 70*9880d681SAndroid Build Coastguard Worker return Size < w.Size; 71*9880d681SAndroid Build Coastguard Worker return memcmp(Data, w.Data, Size) < 0; 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker GetMaxSize()74*9880d681SAndroid Build Coastguard Worker static size_t GetMaxSize() { return kMaxSize; } data()75*9880d681SAndroid Build Coastguard Worker const uint8_t *data() const { return Data; } size()76*9880d681SAndroid Build Coastguard Worker uint8_t size() const { return Size; } 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker private: 79*9880d681SAndroid Build Coastguard Worker uint8_t Size = 0; 80*9880d681SAndroid Build Coastguard Worker uint8_t Data[kMaxSize]; 81*9880d681SAndroid Build Coastguard Worker }; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker typedef FixedWord<27> Word; // 28 bytes. 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker bool IsFile(const std::string &Path); 86*9880d681SAndroid Build Coastguard Worker std::string FileToString(const std::string &Path); 87*9880d681SAndroid Build Coastguard Worker Unit FileToVector(const std::string &Path, size_t MaxSize = 0); 88*9880d681SAndroid Build Coastguard Worker void ReadDirToVectorOfUnits(const char *Path, std::vector<Unit> *V, 89*9880d681SAndroid Build Coastguard Worker long *Epoch, size_t MaxSize); 90*9880d681SAndroid Build Coastguard Worker void WriteToFile(const Unit &U, const std::string &Path); 91*9880d681SAndroid Build Coastguard Worker void CopyFileToErr(const std::string &Path); 92*9880d681SAndroid Build Coastguard Worker // Returns "Dir/FileName" or equivalent for the current OS. 93*9880d681SAndroid Build Coastguard Worker std::string DirPlusFile(const std::string &DirPath, 94*9880d681SAndroid Build Coastguard Worker const std::string &FileName); 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker void DupAndCloseStderr(); 97*9880d681SAndroid Build Coastguard Worker void CloseStdout(); 98*9880d681SAndroid Build Coastguard Worker void Printf(const char *Fmt, ...); 99*9880d681SAndroid Build Coastguard Worker void PrintHexArray(const Unit &U, const char *PrintAfter = ""); 100*9880d681SAndroid Build Coastguard Worker void PrintHexArray(const uint8_t *Data, size_t Size, 101*9880d681SAndroid Build Coastguard Worker const char *PrintAfter = ""); 102*9880d681SAndroid Build Coastguard Worker void PrintASCII(const uint8_t *Data, size_t Size, const char *PrintAfter = ""); 103*9880d681SAndroid Build Coastguard Worker void PrintASCII(const Unit &U, const char *PrintAfter = ""); 104*9880d681SAndroid Build Coastguard Worker void PrintASCII(const Word &W, const char *PrintAfter = ""); 105*9880d681SAndroid Build Coastguard Worker std::string Hash(const Unit &U); 106*9880d681SAndroid Build Coastguard Worker void SetTimer(int Seconds); 107*9880d681SAndroid Build Coastguard Worker void SetSigSegvHandler(); 108*9880d681SAndroid Build Coastguard Worker void SetSigBusHandler(); 109*9880d681SAndroid Build Coastguard Worker void SetSigAbrtHandler(); 110*9880d681SAndroid Build Coastguard Worker void SetSigIllHandler(); 111*9880d681SAndroid Build Coastguard Worker void SetSigFpeHandler(); 112*9880d681SAndroid Build Coastguard Worker void SetSigIntHandler(); 113*9880d681SAndroid Build Coastguard Worker void SetSigTermHandler(); 114*9880d681SAndroid Build Coastguard Worker std::string Base64(const Unit &U); 115*9880d681SAndroid Build Coastguard Worker int ExecuteCommand(const std::string &Command); 116*9880d681SAndroid Build Coastguard Worker size_t GetPeakRSSMb(); 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker // Private copy of SHA1 implementation. 119*9880d681SAndroid Build Coastguard Worker static const int kSHA1NumBytes = 20; 120*9880d681SAndroid Build Coastguard Worker // Computes SHA1 hash of 'Len' bytes in 'Data', writes kSHA1NumBytes to 'Out'. 121*9880d681SAndroid Build Coastguard Worker void ComputeSHA1(const uint8_t *Data, size_t Len, uint8_t *Out); 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker // Changes U to contain only ASCII (isprint+isspace) characters. 124*9880d681SAndroid Build Coastguard Worker // Returns true iff U has been changed. 125*9880d681SAndroid Build Coastguard Worker bool ToASCII(uint8_t *Data, size_t Size); 126*9880d681SAndroid Build Coastguard Worker bool IsASCII(const Unit &U); 127*9880d681SAndroid Build Coastguard Worker bool IsASCII(const uint8_t *Data, size_t Size); 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker int NumberOfCpuCores(); 130*9880d681SAndroid Build Coastguard Worker int GetPid(); 131*9880d681SAndroid Build Coastguard Worker void SleepSeconds(int Seconds); 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker class Random { 134*9880d681SAndroid Build Coastguard Worker public: Random(unsigned int seed)135*9880d681SAndroid Build Coastguard Worker Random(unsigned int seed) : R(seed) {} Rand()136*9880d681SAndroid Build Coastguard Worker size_t Rand() { return R(); } RandBool()137*9880d681SAndroid Build Coastguard Worker size_t RandBool() { return Rand() % 2; } operator()138*9880d681SAndroid Build Coastguard Worker size_t operator()(size_t n) { return n ? Rand() % n : 0; } Get_mt19937()139*9880d681SAndroid Build Coastguard Worker std::mt19937 &Get_mt19937() { return R; } 140*9880d681SAndroid Build Coastguard Worker private: 141*9880d681SAndroid Build Coastguard Worker std::mt19937 R; 142*9880d681SAndroid Build Coastguard Worker }; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker // Dictionary. 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker // Parses one dictionary entry. 147*9880d681SAndroid Build Coastguard Worker // If successfull, write the enty to Unit and returns true, 148*9880d681SAndroid Build Coastguard Worker // otherwise returns false. 149*9880d681SAndroid Build Coastguard Worker bool ParseOneDictionaryEntry(const std::string &Str, Unit *U); 150*9880d681SAndroid Build Coastguard Worker // Parses the dictionary file, fills Units, returns true iff all lines 151*9880d681SAndroid Build Coastguard Worker // were parsed succesfully. 152*9880d681SAndroid Build Coastguard Worker bool ParseDictionaryFile(const std::string &Text, std::vector<Unit> *Units); 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker class DictionaryEntry { 155*9880d681SAndroid Build Coastguard Worker public: DictionaryEntry()156*9880d681SAndroid Build Coastguard Worker DictionaryEntry() {} DictionaryEntry(Word W)157*9880d681SAndroid Build Coastguard Worker DictionaryEntry(Word W) : W(W) {} DictionaryEntry(Word W,size_t PositionHint)158*9880d681SAndroid Build Coastguard Worker DictionaryEntry(Word W, size_t PositionHint) : W(W), PositionHint(PositionHint) {} GetW()159*9880d681SAndroid Build Coastguard Worker const Word &GetW() const { return W; } 160*9880d681SAndroid Build Coastguard Worker HasPositionHint()161*9880d681SAndroid Build Coastguard Worker bool HasPositionHint() const { return PositionHint != std::numeric_limits<size_t>::max(); } GetPositionHint()162*9880d681SAndroid Build Coastguard Worker size_t GetPositionHint() const { 163*9880d681SAndroid Build Coastguard Worker assert(HasPositionHint()); 164*9880d681SAndroid Build Coastguard Worker return PositionHint; 165*9880d681SAndroid Build Coastguard Worker } IncUseCount()166*9880d681SAndroid Build Coastguard Worker void IncUseCount() { UseCount++; } IncSuccessCount()167*9880d681SAndroid Build Coastguard Worker void IncSuccessCount() { SuccessCount++; } GetUseCount()168*9880d681SAndroid Build Coastguard Worker size_t GetUseCount() const { return UseCount; } GetSuccessCount()169*9880d681SAndroid Build Coastguard Worker size_t GetSuccessCount() const {return SuccessCount; } 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker private: 172*9880d681SAndroid Build Coastguard Worker Word W; 173*9880d681SAndroid Build Coastguard Worker size_t PositionHint = std::numeric_limits<size_t>::max(); 174*9880d681SAndroid Build Coastguard Worker size_t UseCount = 0; 175*9880d681SAndroid Build Coastguard Worker size_t SuccessCount = 0; 176*9880d681SAndroid Build Coastguard Worker }; 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker class Dictionary { 179*9880d681SAndroid Build Coastguard Worker public: 180*9880d681SAndroid Build Coastguard Worker static const size_t kMaxDictSize = 1 << 14; 181*9880d681SAndroid Build Coastguard Worker ContainsWord(const Word & W)182*9880d681SAndroid Build Coastguard Worker bool ContainsWord(const Word &W) const { 183*9880d681SAndroid Build Coastguard Worker return std::any_of(begin(), end(), [&](const DictionaryEntry &DE) { 184*9880d681SAndroid Build Coastguard Worker return DE.GetW() == W; 185*9880d681SAndroid Build Coastguard Worker }); 186*9880d681SAndroid Build Coastguard Worker } begin()187*9880d681SAndroid Build Coastguard Worker const DictionaryEntry *begin() const { return &DE[0]; } end()188*9880d681SAndroid Build Coastguard Worker const DictionaryEntry *end() const { return begin() + Size; } 189*9880d681SAndroid Build Coastguard Worker DictionaryEntry & operator[] (size_t Idx) { 190*9880d681SAndroid Build Coastguard Worker assert(Idx < Size); 191*9880d681SAndroid Build Coastguard Worker return DE[Idx]; 192*9880d681SAndroid Build Coastguard Worker } push_back(DictionaryEntry DE)193*9880d681SAndroid Build Coastguard Worker void push_back(DictionaryEntry DE) { 194*9880d681SAndroid Build Coastguard Worker if (Size < kMaxDictSize) 195*9880d681SAndroid Build Coastguard Worker this->DE[Size++] = DE; 196*9880d681SAndroid Build Coastguard Worker } clear()197*9880d681SAndroid Build Coastguard Worker void clear() { Size = 0; } empty()198*9880d681SAndroid Build Coastguard Worker bool empty() const { return Size == 0; } size()199*9880d681SAndroid Build Coastguard Worker size_t size() const { return Size; } 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker private: 202*9880d681SAndroid Build Coastguard Worker DictionaryEntry DE[kMaxDictSize]; 203*9880d681SAndroid Build Coastguard Worker size_t Size = 0; 204*9880d681SAndroid Build Coastguard Worker }; 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker struct FuzzingOptions { 207*9880d681SAndroid Build Coastguard Worker int Verbosity = 1; 208*9880d681SAndroid Build Coastguard Worker size_t MaxLen = 0; 209*9880d681SAndroid Build Coastguard Worker int UnitTimeoutSec = 300; 210*9880d681SAndroid Build Coastguard Worker int TimeoutExitCode = 77; 211*9880d681SAndroid Build Coastguard Worker int ErrorExitCode = 77; 212*9880d681SAndroid Build Coastguard Worker int MaxTotalTimeSec = 0; 213*9880d681SAndroid Build Coastguard Worker int RssLimitMb = 0; 214*9880d681SAndroid Build Coastguard Worker bool DoCrossOver = true; 215*9880d681SAndroid Build Coastguard Worker int MutateDepth = 5; 216*9880d681SAndroid Build Coastguard Worker bool UseCounters = false; 217*9880d681SAndroid Build Coastguard Worker bool UseIndirCalls = true; 218*9880d681SAndroid Build Coastguard Worker bool UseTraces = false; 219*9880d681SAndroid Build Coastguard Worker bool UseMemcmp = true; 220*9880d681SAndroid Build Coastguard Worker bool UseFullCoverageSet = false; 221*9880d681SAndroid Build Coastguard Worker bool Reload = true; 222*9880d681SAndroid Build Coastguard Worker bool ShuffleAtStartUp = true; 223*9880d681SAndroid Build Coastguard Worker bool PreferSmall = true; 224*9880d681SAndroid Build Coastguard Worker size_t MaxNumberOfRuns = ULONG_MAX; 225*9880d681SAndroid Build Coastguard Worker int ReportSlowUnits = 10; 226*9880d681SAndroid Build Coastguard Worker bool OnlyASCII = false; 227*9880d681SAndroid Build Coastguard Worker std::string OutputCorpus; 228*9880d681SAndroid Build Coastguard Worker std::string ArtifactPrefix = "./"; 229*9880d681SAndroid Build Coastguard Worker std::string ExactArtifactPath; 230*9880d681SAndroid Build Coastguard Worker bool SaveArtifacts = true; 231*9880d681SAndroid Build Coastguard Worker bool PrintNEW = true; // Print a status line when new units are found; 232*9880d681SAndroid Build Coastguard Worker bool OutputCSV = false; 233*9880d681SAndroid Build Coastguard Worker bool PrintNewCovPcs = false; 234*9880d681SAndroid Build Coastguard Worker bool PrintFinalStats = false; 235*9880d681SAndroid Build Coastguard Worker bool DetectLeaks = true; 236*9880d681SAndroid Build Coastguard Worker bool TruncateUnits = false; 237*9880d681SAndroid Build Coastguard Worker bool PruneCorpus = true; 238*9880d681SAndroid Build Coastguard Worker }; 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker class MutationDispatcher { 241*9880d681SAndroid Build Coastguard Worker public: 242*9880d681SAndroid Build Coastguard Worker MutationDispatcher(Random &Rand, const FuzzingOptions &Options); ~MutationDispatcher()243*9880d681SAndroid Build Coastguard Worker ~MutationDispatcher() {} 244*9880d681SAndroid Build Coastguard Worker /// Indicate that we are about to start a new sequence of mutations. 245*9880d681SAndroid Build Coastguard Worker void StartMutationSequence(); 246*9880d681SAndroid Build Coastguard Worker /// Print the current sequence of mutations. 247*9880d681SAndroid Build Coastguard Worker void PrintMutationSequence(); 248*9880d681SAndroid Build Coastguard Worker /// Indicate that the current sequence of mutations was successfull. 249*9880d681SAndroid Build Coastguard Worker void RecordSuccessfulMutationSequence(); 250*9880d681SAndroid Build Coastguard Worker /// Mutates data by invoking user-provided mutator. 251*9880d681SAndroid Build Coastguard Worker size_t Mutate_Custom(uint8_t *Data, size_t Size, size_t MaxSize); 252*9880d681SAndroid Build Coastguard Worker /// Mutates data by invoking user-provided crossover. 253*9880d681SAndroid Build Coastguard Worker size_t Mutate_CustomCrossOver(uint8_t *Data, size_t Size, size_t MaxSize); 254*9880d681SAndroid Build Coastguard Worker /// Mutates data by shuffling bytes. 255*9880d681SAndroid Build Coastguard Worker size_t Mutate_ShuffleBytes(uint8_t *Data, size_t Size, size_t MaxSize); 256*9880d681SAndroid Build Coastguard Worker /// Mutates data by erasing a byte. 257*9880d681SAndroid Build Coastguard Worker size_t Mutate_EraseByte(uint8_t *Data, size_t Size, size_t MaxSize); 258*9880d681SAndroid Build Coastguard Worker /// Mutates data by inserting a byte. 259*9880d681SAndroid Build Coastguard Worker size_t Mutate_InsertByte(uint8_t *Data, size_t Size, size_t MaxSize); 260*9880d681SAndroid Build Coastguard Worker /// Mutates data by chanding one byte. 261*9880d681SAndroid Build Coastguard Worker size_t Mutate_ChangeByte(uint8_t *Data, size_t Size, size_t MaxSize); 262*9880d681SAndroid Build Coastguard Worker /// Mutates data by chanding one bit. 263*9880d681SAndroid Build Coastguard Worker size_t Mutate_ChangeBit(uint8_t *Data, size_t Size, size_t MaxSize); 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker /// Mutates data by adding a word from the manual dictionary. 266*9880d681SAndroid Build Coastguard Worker size_t Mutate_AddWordFromManualDictionary(uint8_t *Data, size_t Size, 267*9880d681SAndroid Build Coastguard Worker size_t MaxSize); 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker /// Mutates data by adding a word from the temporary automatic dictionary. 270*9880d681SAndroid Build Coastguard Worker size_t Mutate_AddWordFromTemporaryAutoDictionary(uint8_t *Data, size_t Size, 271*9880d681SAndroid Build Coastguard Worker size_t MaxSize); 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker /// Mutates data by adding a word from the persistent automatic dictionary. 274*9880d681SAndroid Build Coastguard Worker size_t Mutate_AddWordFromPersistentAutoDictionary(uint8_t *Data, size_t Size, 275*9880d681SAndroid Build Coastguard Worker size_t MaxSize); 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker /// Tries to find an ASCII integer in Data, changes it to another ASCII int. 278*9880d681SAndroid Build Coastguard Worker size_t Mutate_ChangeASCIIInteger(uint8_t *Data, size_t Size, size_t MaxSize); 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker /// CrossOver Data with some other element of the corpus. 281*9880d681SAndroid Build Coastguard Worker size_t Mutate_CrossOver(uint8_t *Data, size_t Size, size_t MaxSize); 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker /// Applies one of the configured mutations. 284*9880d681SAndroid Build Coastguard Worker /// Returns the new size of data which could be up to MaxSize. 285*9880d681SAndroid Build Coastguard Worker size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize); 286*9880d681SAndroid Build Coastguard Worker /// Applies one of the default mutations. Provided as a service 287*9880d681SAndroid Build Coastguard Worker /// to mutation authors. 288*9880d681SAndroid Build Coastguard Worker size_t DefaultMutate(uint8_t *Data, size_t Size, size_t MaxSize); 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker /// Creates a cross-over of two pieces of Data, returns its size. 291*9880d681SAndroid Build Coastguard Worker size_t CrossOver(const uint8_t *Data1, size_t Size1, const uint8_t *Data2, 292*9880d681SAndroid Build Coastguard Worker size_t Size2, uint8_t *Out, size_t MaxOutSize); 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker void AddWordToManualDictionary(const Word &W); 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker void AddWordToAutoDictionary(const Word &W, size_t PositionHint); 297*9880d681SAndroid Build Coastguard Worker void ClearAutoDictionary(); 298*9880d681SAndroid Build Coastguard Worker void PrintRecommendedDictionary(); 299*9880d681SAndroid Build Coastguard Worker SetCorpus(const std::vector<Unit> * Corpus)300*9880d681SAndroid Build Coastguard Worker void SetCorpus(const std::vector<Unit> *Corpus) { this->Corpus = Corpus; } 301*9880d681SAndroid Build Coastguard Worker GetRand()302*9880d681SAndroid Build Coastguard Worker Random &GetRand() { return Rand; } 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker private: 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker struct Mutator { 307*9880d681SAndroid Build Coastguard Worker size_t (MutationDispatcher::*Fn)(uint8_t *Data, size_t Size, size_t Max); 308*9880d681SAndroid Build Coastguard Worker const char *Name; 309*9880d681SAndroid Build Coastguard Worker }; 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker size_t AddWordFromDictionary(Dictionary &D, uint8_t *Data, size_t Size, 312*9880d681SAndroid Build Coastguard Worker size_t MaxSize); 313*9880d681SAndroid Build Coastguard Worker size_t MutateImpl(uint8_t *Data, size_t Size, size_t MaxSize, 314*9880d681SAndroid Build Coastguard Worker const std::vector<Mutator> &Mutators); 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker Random &Rand; 317*9880d681SAndroid Build Coastguard Worker const FuzzingOptions Options; 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker // Dictionary provided by the user via -dict=DICT_FILE. 320*9880d681SAndroid Build Coastguard Worker Dictionary ManualDictionary; 321*9880d681SAndroid Build Coastguard Worker // Temporary dictionary modified by the fuzzer itself, 322*9880d681SAndroid Build Coastguard Worker // recreated periodically. 323*9880d681SAndroid Build Coastguard Worker Dictionary TempAutoDictionary; 324*9880d681SAndroid Build Coastguard Worker // Persistent dictionary modified by the fuzzer, consists of 325*9880d681SAndroid Build Coastguard Worker // entries that led to successfull discoveries in the past mutations. 326*9880d681SAndroid Build Coastguard Worker Dictionary PersistentAutoDictionary; 327*9880d681SAndroid Build Coastguard Worker std::vector<Mutator> CurrentMutatorSequence; 328*9880d681SAndroid Build Coastguard Worker std::vector<DictionaryEntry *> CurrentDictionaryEntrySequence; 329*9880d681SAndroid Build Coastguard Worker const std::vector<Unit> *Corpus = nullptr; 330*9880d681SAndroid Build Coastguard Worker std::vector<uint8_t> MutateInPlaceHere; 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker std::vector<Mutator> Mutators; 333*9880d681SAndroid Build Coastguard Worker std::vector<Mutator> DefaultMutators; 334*9880d681SAndroid Build Coastguard Worker }; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker class Fuzzer { 337*9880d681SAndroid Build Coastguard Worker public: 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker // Aggregates all available coverage measurements. 340*9880d681SAndroid Build Coastguard Worker struct Coverage { CoverageCoverage341*9880d681SAndroid Build Coastguard Worker Coverage() { Reset(); } 342*9880d681SAndroid Build Coastguard Worker ResetCoverage343*9880d681SAndroid Build Coastguard Worker void Reset() { 344*9880d681SAndroid Build Coastguard Worker BlockCoverage = 0; 345*9880d681SAndroid Build Coastguard Worker CallerCalleeCoverage = 0; 346*9880d681SAndroid Build Coastguard Worker PcMapBits = 0; 347*9880d681SAndroid Build Coastguard Worker CounterBitmapBits = 0; 348*9880d681SAndroid Build Coastguard Worker PcBufferLen = 0; 349*9880d681SAndroid Build Coastguard Worker CounterBitmap.clear(); 350*9880d681SAndroid Build Coastguard Worker PCMap.Reset(); 351*9880d681SAndroid Build Coastguard Worker } 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker std::string DebugString() const; 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker size_t BlockCoverage; 356*9880d681SAndroid Build Coastguard Worker size_t CallerCalleeCoverage; 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker size_t PcBufferLen; 359*9880d681SAndroid Build Coastguard Worker // Precalculated number of bits in CounterBitmap. 360*9880d681SAndroid Build Coastguard Worker size_t CounterBitmapBits; 361*9880d681SAndroid Build Coastguard Worker std::vector<uint8_t> CounterBitmap; 362*9880d681SAndroid Build Coastguard Worker // Precalculated number of bits in PCMap. 363*9880d681SAndroid Build Coastguard Worker size_t PcMapBits; 364*9880d681SAndroid Build Coastguard Worker PcCoverageMap PCMap; 365*9880d681SAndroid Build Coastguard Worker }; 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker Fuzzer(UserCallback CB, MutationDispatcher &MD, FuzzingOptions Options); AddToCorpus(const Unit & U)368*9880d681SAndroid Build Coastguard Worker void AddToCorpus(const Unit &U) { 369*9880d681SAndroid Build Coastguard Worker Corpus.push_back(U); 370*9880d681SAndroid Build Coastguard Worker UpdateCorpusDistribution(); 371*9880d681SAndroid Build Coastguard Worker } 372*9880d681SAndroid Build Coastguard Worker size_t ChooseUnitIdxToMutate(); ChooseUnitToMutate()373*9880d681SAndroid Build Coastguard Worker const Unit &ChooseUnitToMutate() { return Corpus[ChooseUnitIdxToMutate()]; }; 374*9880d681SAndroid Build Coastguard Worker void TruncateUnits(std::vector<Unit> *NewCorpus); 375*9880d681SAndroid Build Coastguard Worker void Loop(); 376*9880d681SAndroid Build Coastguard Worker void Drill(); 377*9880d681SAndroid Build Coastguard Worker void ShuffleAndMinimize(); 378*9880d681SAndroid Build Coastguard Worker void InitializeTraceState(); 379*9880d681SAndroid Build Coastguard Worker void AssignTaintLabels(uint8_t *Data, size_t Size); CorpusSize()380*9880d681SAndroid Build Coastguard Worker size_t CorpusSize() const { return Corpus.size(); } 381*9880d681SAndroid Build Coastguard Worker size_t MaxUnitSizeInCorpus() const; ReadDir(const std::string & Path,long * Epoch,size_t MaxSize)382*9880d681SAndroid Build Coastguard Worker void ReadDir(const std::string &Path, long *Epoch, size_t MaxSize) { 383*9880d681SAndroid Build Coastguard Worker Printf("Loading corpus: %s\n", Path.c_str()); 384*9880d681SAndroid Build Coastguard Worker ReadDirToVectorOfUnits(Path.c_str(), &Corpus, Epoch, MaxSize); 385*9880d681SAndroid Build Coastguard Worker } 386*9880d681SAndroid Build Coastguard Worker void RereadOutputCorpus(size_t MaxSize); 387*9880d681SAndroid Build Coastguard Worker // Save the current corpus to OutputCorpus. 388*9880d681SAndroid Build Coastguard Worker void SaveCorpus(); 389*9880d681SAndroid Build Coastguard Worker secondsSinceProcessStartUp()390*9880d681SAndroid Build Coastguard Worker size_t secondsSinceProcessStartUp() { 391*9880d681SAndroid Build Coastguard Worker return duration_cast<seconds>(system_clock::now() - ProcessStartTime) 392*9880d681SAndroid Build Coastguard Worker .count(); 393*9880d681SAndroid Build Coastguard Worker } execPerSec()394*9880d681SAndroid Build Coastguard Worker size_t execPerSec() { 395*9880d681SAndroid Build Coastguard Worker size_t Seconds = secondsSinceProcessStartUp(); 396*9880d681SAndroid Build Coastguard Worker return Seconds ? TotalNumberOfRuns / Seconds : 0; 397*9880d681SAndroid Build Coastguard Worker } 398*9880d681SAndroid Build Coastguard Worker getTotalNumberOfRuns()399*9880d681SAndroid Build Coastguard Worker size_t getTotalNumberOfRuns() { return TotalNumberOfRuns; } 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker static void StaticAlarmCallback(); 402*9880d681SAndroid Build Coastguard Worker static void StaticCrashSignalCallback(); 403*9880d681SAndroid Build Coastguard Worker static void StaticInterruptCallback(); 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker void ExecuteCallback(const uint8_t *Data, size_t Size); 406*9880d681SAndroid Build Coastguard Worker bool RunOne(const uint8_t *Data, size_t Size); 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker // Merge Corpora[1:] into Corpora[0]. 409*9880d681SAndroid Build Coastguard Worker void Merge(const std::vector<std::string> &Corpora); 410*9880d681SAndroid Build Coastguard Worker // Returns a subset of 'Extra' that adds coverage to 'Initial'. 411*9880d681SAndroid Build Coastguard Worker UnitVector FindExtraUnits(const UnitVector &Initial, const UnitVector &Extra); GetMD()412*9880d681SAndroid Build Coastguard Worker MutationDispatcher &GetMD() { return MD; } 413*9880d681SAndroid Build Coastguard Worker void PrintFinalStats(); 414*9880d681SAndroid Build Coastguard Worker void SetMaxLen(size_t MaxLen); 415*9880d681SAndroid Build Coastguard Worker void RssLimitCallback(); 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Worker // Public for tests. 418*9880d681SAndroid Build Coastguard Worker void ResetCoverage(); 419*9880d681SAndroid Build Coastguard Worker InFuzzingThread()420*9880d681SAndroid Build Coastguard Worker bool InFuzzingThread() const { return IsMyThread; } 421*9880d681SAndroid Build Coastguard Worker size_t GetCurrentUnitInFuzzingThead(const uint8_t **Data) const; 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Worker private: 424*9880d681SAndroid Build Coastguard Worker void AlarmCallback(); 425*9880d681SAndroid Build Coastguard Worker void CrashCallback(); 426*9880d681SAndroid Build Coastguard Worker void InterruptCallback(); 427*9880d681SAndroid Build Coastguard Worker void MutateAndTestOne(); 428*9880d681SAndroid Build Coastguard Worker void ReportNewCoverage(const Unit &U); RunOne(const Unit & U)429*9880d681SAndroid Build Coastguard Worker bool RunOne(const Unit &U) { return RunOne(U.data(), U.size()); } 430*9880d681SAndroid Build Coastguard Worker void RunOneAndUpdateCorpus(const uint8_t *Data, size_t Size); 431*9880d681SAndroid Build Coastguard Worker void WriteToOutputCorpus(const Unit &U); 432*9880d681SAndroid Build Coastguard Worker void WriteUnitToFileWithPrefix(const Unit &U, const char *Prefix); 433*9880d681SAndroid Build Coastguard Worker void PrintStats(const char *Where, const char *End = "\n"); 434*9880d681SAndroid Build Coastguard Worker void PrintStatusForNewUnit(const Unit &U); 435*9880d681SAndroid Build Coastguard Worker void ShuffleCorpus(UnitVector *V); 436*9880d681SAndroid Build Coastguard Worker void TryDetectingAMemoryLeak(const uint8_t *Data, size_t Size, 437*9880d681SAndroid Build Coastguard Worker bool DuringInitialCorpusExecution); 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Worker // Updates the probability distribution for the units in the corpus. 440*9880d681SAndroid Build Coastguard Worker // Must be called whenever the corpus or unit weights are changed. 441*9880d681SAndroid Build Coastguard Worker void UpdateCorpusDistribution(); 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Worker bool UpdateMaxCoverage(); 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker // Trace-based fuzzing: we run a unit with some kind of tracing 446*9880d681SAndroid Build Coastguard Worker // enabled and record potentially useful mutations. Then 447*9880d681SAndroid Build Coastguard Worker // We apply these mutations one by one to the unit and run it again. 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker // Start tracing; forget all previously proposed mutations. 450*9880d681SAndroid Build Coastguard Worker void StartTraceRecording(); 451*9880d681SAndroid Build Coastguard Worker // Stop tracing. 452*9880d681SAndroid Build Coastguard Worker void StopTraceRecording(); 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Worker void SetDeathCallback(); 455*9880d681SAndroid Build Coastguard Worker static void StaticDeathCallback(); 456*9880d681SAndroid Build Coastguard Worker void DumpCurrentUnit(const char *Prefix); 457*9880d681SAndroid Build Coastguard Worker void DeathCallback(); 458*9880d681SAndroid Build Coastguard Worker 459*9880d681SAndroid Build Coastguard Worker void LazyAllocateCurrentUnitData(); 460*9880d681SAndroid Build Coastguard Worker uint8_t *CurrentUnitData = nullptr; 461*9880d681SAndroid Build Coastguard Worker std::atomic<size_t> CurrentUnitSize; 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Worker size_t TotalNumberOfRuns = 0; 464*9880d681SAndroid Build Coastguard Worker size_t NumberOfNewUnitsAdded = 0; 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Worker bool HasMoreMallocsThanFrees = false; 467*9880d681SAndroid Build Coastguard Worker size_t NumberOfLeakDetectionAttempts = 0; 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Worker std::vector<Unit> Corpus; 470*9880d681SAndroid Build Coastguard Worker std::unordered_set<std::string> UnitHashesAddedToCorpus; 471*9880d681SAndroid Build Coastguard Worker 472*9880d681SAndroid Build Coastguard Worker std::piecewise_constant_distribution<double> CorpusDistribution; 473*9880d681SAndroid Build Coastguard Worker UserCallback CB; 474*9880d681SAndroid Build Coastguard Worker MutationDispatcher &MD; 475*9880d681SAndroid Build Coastguard Worker FuzzingOptions Options; 476*9880d681SAndroid Build Coastguard Worker system_clock::time_point ProcessStartTime = system_clock::now(); 477*9880d681SAndroid Build Coastguard Worker system_clock::time_point UnitStartTime; 478*9880d681SAndroid Build Coastguard Worker long TimeOfLongestUnitInSeconds = 0; 479*9880d681SAndroid Build Coastguard Worker long EpochOfLastReadOfOutputCorpus = 0; 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Worker // Maximum recorded coverage. 482*9880d681SAndroid Build Coastguard Worker Coverage MaxCoverage; 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker // Need to know our own thread. 485*9880d681SAndroid Build Coastguard Worker static thread_local bool IsMyThread; 486*9880d681SAndroid Build Coastguard Worker }; 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker // Global interface to functions that may or may not be available. 489*9880d681SAndroid Build Coastguard Worker extern ExternalFunctions *EF; 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker }; // namespace fuzzer 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Worker #endif // LLVM_FUZZER_INTERNAL_H 494