AsmParser: Recognize DW_TAG_* constants
[oota-llvm.git] / lib / Fuzzer / FuzzerInternal.h
1 //===- FuzzerInternal.h - Internal header for the Fuzzer --------*- C++ -* ===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 // Define the main class fuzzer::Fuzzer and most functions.
10 //===----------------------------------------------------------------------===//
11 #include <cassert>
12 #include <chrono>
13 #include <cstddef>
14 #include <cstdlib>
15 #include <string>
16 #include <vector>
17 #include <unordered_set>
18
19 namespace fuzzer {
20 typedef std::vector<uint8_t> Unit;
21 using namespace std::chrono;
22
23 Unit ReadFile(const char *Path);
24 void ReadDirToVectorOfUnits(const char *Path, std::vector<Unit> *V);
25 void WriteToFile(const Unit &U, const std::string &Path);
26 // Returns "Dir/FileName" or equivalent for the current OS.
27 std::string DirPlusFile(const std::string &DirPath,
28                         const std::string &FileName);
29
30 void Mutate(Unit *U, size_t MaxLen);
31
32 void CrossOver(const Unit &A, const Unit &B, Unit *U, size_t MaxLen);
33
34 void Print(const Unit &U, const char *PrintAfter = "");
35 void PrintASCII(const Unit &U, const char *PrintAfter = "");
36 std::string Hash(const Unit &U);
37 void SetTimer(int Seconds);
38
39 class Fuzzer {
40  public:
41   struct FuzzingOptions {
42     int Verbosity = 1;
43     int MaxLen = 0;
44     bool DoCrossOver = true;
45     bool MutateDepth = 10;
46     bool ExitOnFirst = false;
47     bool UseFullCoverageSet  = false;
48     std::string OutputCorpus;
49   };
50   Fuzzer(FuzzingOptions Options) : Options(Options) {
51     SetDeathCallback();
52   }
53   void AddToCorpus(const Unit &U) { Corpus.push_back(U); }
54   size_t Loop(size_t NumIterations);
55   void ShuffleAndMinimize();
56   size_t CorpusSize() const { return Corpus.size(); }
57   void ReadDir(const std::string &Path) {
58     ReadDirToVectorOfUnits(Path.c_str(), &Corpus);
59   }
60   // Save the current corpus to OutputCorpus.
61   void SaveCorpus();
62
63   static void AlarmCallback();
64
65  private:
66   size_t MutateAndTestOne(Unit *U);
67   size_t RunOne(const Unit &U);
68   size_t RunOneMaximizeTotalCoverage(const Unit &U);
69   size_t RunOneMaximizeFullCoverageSet(const Unit &U);
70   void WriteToOutputCorpus(const Unit &U);
71   static void WriteToCrash(const Unit &U, const char *Prefix);
72
73   void SetDeathCallback();
74   static void DeathCallback();
75   static Unit CurrentUnit;
76
77   size_t TotalNumberOfRuns = 0;
78
79   std::vector<Unit> Corpus;
80   std::unordered_set<uintptr_t> FullCoverageSets;
81   FuzzingOptions Options;
82   system_clock::time_point ProcessStartTime = system_clock::now();
83   static system_clock::time_point UnitStartTime;
84 };
85
86 };  // namespace fuzzer