xref: /aosp_15_r20/external/llvm/lib/Fuzzer/FuzzerInternal.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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