xref: /aosp_15_r20/external/llvm/lib/Fuzzer/FuzzerUtil.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- FuzzerUtil.cpp - Misc utils ----------------------------------------===//
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 // Misc utils.
10*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
11*9880d681SAndroid Build Coastguard Worker 
12*9880d681SAndroid Build Coastguard Worker #include "FuzzerInternal.h"
13*9880d681SAndroid Build Coastguard Worker #include <sstream>
14*9880d681SAndroid Build Coastguard Worker #include <iomanip>
15*9880d681SAndroid Build Coastguard Worker #include <sys/resource.h>
16*9880d681SAndroid Build Coastguard Worker #include <sys/time.h>
17*9880d681SAndroid Build Coastguard Worker #include <sys/types.h>
18*9880d681SAndroid Build Coastguard Worker #include <sys/syscall.h>
19*9880d681SAndroid Build Coastguard Worker #include <cassert>
20*9880d681SAndroid Build Coastguard Worker #include <chrono>
21*9880d681SAndroid Build Coastguard Worker #include <cstring>
22*9880d681SAndroid Build Coastguard Worker #include <signal.h>
23*9880d681SAndroid Build Coastguard Worker #include <sstream>
24*9880d681SAndroid Build Coastguard Worker #include <unistd.h>
25*9880d681SAndroid Build Coastguard Worker #include <errno.h>
26*9880d681SAndroid Build Coastguard Worker #include <thread>
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker namespace fuzzer {
29*9880d681SAndroid Build Coastguard Worker 
PrintHexArray(const uint8_t * Data,size_t Size,const char * PrintAfter)30*9880d681SAndroid Build Coastguard Worker void PrintHexArray(const uint8_t *Data, size_t Size,
31*9880d681SAndroid Build Coastguard Worker                    const char *PrintAfter) {
32*9880d681SAndroid Build Coastguard Worker   for (size_t i = 0; i < Size; i++)
33*9880d681SAndroid Build Coastguard Worker     Printf("0x%x,", (unsigned)Data[i]);
34*9880d681SAndroid Build Coastguard Worker   Printf("%s", PrintAfter);
35*9880d681SAndroid Build Coastguard Worker }
36*9880d681SAndroid Build Coastguard Worker 
Print(const Unit & v,const char * PrintAfter)37*9880d681SAndroid Build Coastguard Worker void Print(const Unit &v, const char *PrintAfter) {
38*9880d681SAndroid Build Coastguard Worker   PrintHexArray(v.data(), v.size(), PrintAfter);
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker 
PrintASCIIByte(uint8_t Byte)41*9880d681SAndroid Build Coastguard Worker void PrintASCIIByte(uint8_t Byte) {
42*9880d681SAndroid Build Coastguard Worker   if (Byte == '\\')
43*9880d681SAndroid Build Coastguard Worker     Printf("\\\\");
44*9880d681SAndroid Build Coastguard Worker   else if (Byte == '"')
45*9880d681SAndroid Build Coastguard Worker     Printf("\\\"");
46*9880d681SAndroid Build Coastguard Worker   else if (Byte >= 32 && Byte < 127)
47*9880d681SAndroid Build Coastguard Worker     Printf("%c", Byte);
48*9880d681SAndroid Build Coastguard Worker   else
49*9880d681SAndroid Build Coastguard Worker     Printf("\\x%02x", Byte);
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker 
PrintASCII(const uint8_t * Data,size_t Size,const char * PrintAfter)52*9880d681SAndroid Build Coastguard Worker void PrintASCII(const uint8_t *Data, size_t Size, const char *PrintAfter) {
53*9880d681SAndroid Build Coastguard Worker   for (size_t i = 0; i < Size; i++)
54*9880d681SAndroid Build Coastguard Worker     PrintASCIIByte(Data[i]);
55*9880d681SAndroid Build Coastguard Worker   Printf("%s", PrintAfter);
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker 
PrintASCII(const Word & W,const char * PrintAfter)58*9880d681SAndroid Build Coastguard Worker void PrintASCII(const Word &W, const char *PrintAfter) {
59*9880d681SAndroid Build Coastguard Worker   PrintASCII(W.data(), W.size(), PrintAfter);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker 
PrintASCII(const Unit & U,const char * PrintAfter)62*9880d681SAndroid Build Coastguard Worker void PrintASCII(const Unit &U, const char *PrintAfter) {
63*9880d681SAndroid Build Coastguard Worker   PrintASCII(U.data(), U.size(), PrintAfter);
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker 
Hash(const Unit & U)66*9880d681SAndroid Build Coastguard Worker std::string Hash(const Unit &U) {
67*9880d681SAndroid Build Coastguard Worker   uint8_t Hash[kSHA1NumBytes];
68*9880d681SAndroid Build Coastguard Worker   ComputeSHA1(U.data(), U.size(), Hash);
69*9880d681SAndroid Build Coastguard Worker   std::stringstream SS;
70*9880d681SAndroid Build Coastguard Worker   for (int i = 0; i < kSHA1NumBytes; i++)
71*9880d681SAndroid Build Coastguard Worker     SS << std::hex << std::setfill('0') << std::setw(2) << (unsigned)Hash[i];
72*9880d681SAndroid Build Coastguard Worker   return SS.str();
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker 
AlarmHandler(int,siginfo_t *,void *)75*9880d681SAndroid Build Coastguard Worker static void AlarmHandler(int, siginfo_t *, void *) {
76*9880d681SAndroid Build Coastguard Worker   Fuzzer::StaticAlarmCallback();
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker 
CrashHandler(int,siginfo_t *,void *)79*9880d681SAndroid Build Coastguard Worker static void CrashHandler(int, siginfo_t *, void *) {
80*9880d681SAndroid Build Coastguard Worker   Fuzzer::StaticCrashSignalCallback();
81*9880d681SAndroid Build Coastguard Worker }
82*9880d681SAndroid Build Coastguard Worker 
InterruptHandler(int,siginfo_t *,void *)83*9880d681SAndroid Build Coastguard Worker static void InterruptHandler(int, siginfo_t *, void *) {
84*9880d681SAndroid Build Coastguard Worker   Fuzzer::StaticInterruptCallback();
85*9880d681SAndroid Build Coastguard Worker }
86*9880d681SAndroid Build Coastguard Worker 
SetSigaction(int signum,void (* callback)(int,siginfo_t *,void *))87*9880d681SAndroid Build Coastguard Worker static void SetSigaction(int signum,
88*9880d681SAndroid Build Coastguard Worker                          void (*callback)(int, siginfo_t *, void *)) {
89*9880d681SAndroid Build Coastguard Worker   struct sigaction sigact;
90*9880d681SAndroid Build Coastguard Worker   memset(&sigact, 0, sizeof(sigact));
91*9880d681SAndroid Build Coastguard Worker   sigact.sa_sigaction = callback;
92*9880d681SAndroid Build Coastguard Worker   if (sigaction(signum, &sigact, 0)) {
93*9880d681SAndroid Build Coastguard Worker     Printf("libFuzzer: sigaction failed with %d\n", errno);
94*9880d681SAndroid Build Coastguard Worker     exit(1);
95*9880d681SAndroid Build Coastguard Worker   }
96*9880d681SAndroid Build Coastguard Worker }
97*9880d681SAndroid Build Coastguard Worker 
SetTimer(int Seconds)98*9880d681SAndroid Build Coastguard Worker void SetTimer(int Seconds) {
99*9880d681SAndroid Build Coastguard Worker   struct itimerval T {{Seconds, 0}, {Seconds, 0}};
100*9880d681SAndroid Build Coastguard Worker   if (setitimer(ITIMER_REAL, &T, nullptr)) {
101*9880d681SAndroid Build Coastguard Worker     Printf("libFuzzer: setitimer failed with %d\n", errno);
102*9880d681SAndroid Build Coastguard Worker     exit(1);
103*9880d681SAndroid Build Coastguard Worker   }
104*9880d681SAndroid Build Coastguard Worker   SetSigaction(SIGALRM, AlarmHandler);
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker 
SetSigSegvHandler()107*9880d681SAndroid Build Coastguard Worker void SetSigSegvHandler() { SetSigaction(SIGSEGV, CrashHandler); }
SetSigBusHandler()108*9880d681SAndroid Build Coastguard Worker void SetSigBusHandler() { SetSigaction(SIGBUS, CrashHandler); }
SetSigAbrtHandler()109*9880d681SAndroid Build Coastguard Worker void SetSigAbrtHandler() { SetSigaction(SIGABRT, CrashHandler); }
SetSigIllHandler()110*9880d681SAndroid Build Coastguard Worker void SetSigIllHandler() { SetSigaction(SIGILL, CrashHandler); }
SetSigFpeHandler()111*9880d681SAndroid Build Coastguard Worker void SetSigFpeHandler() { SetSigaction(SIGFPE, CrashHandler); }
SetSigIntHandler()112*9880d681SAndroid Build Coastguard Worker void SetSigIntHandler() { SetSigaction(SIGINT, InterruptHandler); }
SetSigTermHandler()113*9880d681SAndroid Build Coastguard Worker void SetSigTermHandler() { SetSigaction(SIGTERM, InterruptHandler); }
114*9880d681SAndroid Build Coastguard Worker 
NumberOfCpuCores()115*9880d681SAndroid Build Coastguard Worker int NumberOfCpuCores() {
116*9880d681SAndroid Build Coastguard Worker   const char *CmdLine = nullptr;
117*9880d681SAndroid Build Coastguard Worker   if (LIBFUZZER_LINUX) {
118*9880d681SAndroid Build Coastguard Worker     CmdLine = "nproc";
119*9880d681SAndroid Build Coastguard Worker   } else if (LIBFUZZER_APPLE) {
120*9880d681SAndroid Build Coastguard Worker     CmdLine = "sysctl -n hw.ncpu";
121*9880d681SAndroid Build Coastguard Worker   } else {
122*9880d681SAndroid Build Coastguard Worker     assert(0 && "NumberOfCpuCores() is not implemented for your platform");
123*9880d681SAndroid Build Coastguard Worker   }
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker   FILE *F = popen(CmdLine, "r");
126*9880d681SAndroid Build Coastguard Worker   int N = 1;
127*9880d681SAndroid Build Coastguard Worker   if (!F || fscanf(F, "%d", &N) != 1) {
128*9880d681SAndroid Build Coastguard Worker     Printf("WARNING: Failed to parse output of command \"%s\" in %s(). "
129*9880d681SAndroid Build Coastguard Worker            "Assuming CPU count of 1.\n",
130*9880d681SAndroid Build Coastguard Worker            CmdLine, __func__);
131*9880d681SAndroid Build Coastguard Worker     N = 1;
132*9880d681SAndroid Build Coastguard Worker   }
133*9880d681SAndroid Build Coastguard Worker 
134*9880d681SAndroid Build Coastguard Worker   if (pclose(F)) {
135*9880d681SAndroid Build Coastguard Worker     Printf("WARNING: Executing command \"%s\" failed in %s(). "
136*9880d681SAndroid Build Coastguard Worker            "Assuming CPU count of 1.\n",
137*9880d681SAndroid Build Coastguard Worker            CmdLine, __func__);
138*9880d681SAndroid Build Coastguard Worker     N = 1;
139*9880d681SAndroid Build Coastguard Worker   }
140*9880d681SAndroid Build Coastguard Worker   if (N < 1) {
141*9880d681SAndroid Build Coastguard Worker     Printf("WARNING: Reported CPU count (%d) from command \"%s\" was invalid "
142*9880d681SAndroid Build Coastguard Worker            "in %s(). Assuming CPU count of 1.\n",
143*9880d681SAndroid Build Coastguard Worker            N, CmdLine, __func__);
144*9880d681SAndroid Build Coastguard Worker     N = 1;
145*9880d681SAndroid Build Coastguard Worker   }
146*9880d681SAndroid Build Coastguard Worker   return N;
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker 
ExecuteCommand(const std::string & Command)149*9880d681SAndroid Build Coastguard Worker int ExecuteCommand(const std::string &Command) {
150*9880d681SAndroid Build Coastguard Worker   return system(Command.c_str());
151*9880d681SAndroid Build Coastguard Worker }
152*9880d681SAndroid Build Coastguard Worker 
ToASCII(uint8_t * Data,size_t Size)153*9880d681SAndroid Build Coastguard Worker bool ToASCII(uint8_t *Data, size_t Size) {
154*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
155*9880d681SAndroid Build Coastguard Worker   for (size_t i = 0; i < Size; i++) {
156*9880d681SAndroid Build Coastguard Worker     uint8_t &X = Data[i];
157*9880d681SAndroid Build Coastguard Worker     auto NewX = X;
158*9880d681SAndroid Build Coastguard Worker     NewX &= 127;
159*9880d681SAndroid Build Coastguard Worker     if (!isspace(NewX) && !isprint(NewX))
160*9880d681SAndroid Build Coastguard Worker       NewX = ' ';
161*9880d681SAndroid Build Coastguard Worker     Changed |= NewX != X;
162*9880d681SAndroid Build Coastguard Worker     X = NewX;
163*9880d681SAndroid Build Coastguard Worker   }
164*9880d681SAndroid Build Coastguard Worker   return Changed;
165*9880d681SAndroid Build Coastguard Worker }
166*9880d681SAndroid Build Coastguard Worker 
IsASCII(const Unit & U)167*9880d681SAndroid Build Coastguard Worker bool IsASCII(const Unit &U) { return IsASCII(U.data(), U.size()); }
168*9880d681SAndroid Build Coastguard Worker 
IsASCII(const uint8_t * Data,size_t Size)169*9880d681SAndroid Build Coastguard Worker bool IsASCII(const uint8_t *Data, size_t Size) {
170*9880d681SAndroid Build Coastguard Worker   for (size_t i = 0; i < Size; i++)
171*9880d681SAndroid Build Coastguard Worker     if (!(isprint(Data[i]) || isspace(Data[i]))) return false;
172*9880d681SAndroid Build Coastguard Worker   return true;
173*9880d681SAndroid Build Coastguard Worker }
174*9880d681SAndroid Build Coastguard Worker 
ParseOneDictionaryEntry(const std::string & Str,Unit * U)175*9880d681SAndroid Build Coastguard Worker bool ParseOneDictionaryEntry(const std::string &Str, Unit *U) {
176*9880d681SAndroid Build Coastguard Worker   U->clear();
177*9880d681SAndroid Build Coastguard Worker   if (Str.empty()) return false;
178*9880d681SAndroid Build Coastguard Worker   size_t L = 0, R = Str.size() - 1;  // We are parsing the range [L,R].
179*9880d681SAndroid Build Coastguard Worker   // Skip spaces from both sides.
180*9880d681SAndroid Build Coastguard Worker   while (L < R && isspace(Str[L])) L++;
181*9880d681SAndroid Build Coastguard Worker   while (R > L && isspace(Str[R])) R--;
182*9880d681SAndroid Build Coastguard Worker   if (R - L < 2) return false;
183*9880d681SAndroid Build Coastguard Worker   // Check the closing "
184*9880d681SAndroid Build Coastguard Worker   if (Str[R] != '"') return false;
185*9880d681SAndroid Build Coastguard Worker   R--;
186*9880d681SAndroid Build Coastguard Worker   // Find the opening "
187*9880d681SAndroid Build Coastguard Worker   while (L < R && Str[L] != '"') L++;
188*9880d681SAndroid Build Coastguard Worker   if (L >= R) return false;
189*9880d681SAndroid Build Coastguard Worker   assert(Str[L] == '\"');
190*9880d681SAndroid Build Coastguard Worker   L++;
191*9880d681SAndroid Build Coastguard Worker   assert(L <= R);
192*9880d681SAndroid Build Coastguard Worker   for (size_t Pos = L; Pos <= R; Pos++) {
193*9880d681SAndroid Build Coastguard Worker     uint8_t V = (uint8_t)Str[Pos];
194*9880d681SAndroid Build Coastguard Worker     if (!isprint(V) && !isspace(V)) return false;
195*9880d681SAndroid Build Coastguard Worker     if (V =='\\') {
196*9880d681SAndroid Build Coastguard Worker       // Handle '\\'
197*9880d681SAndroid Build Coastguard Worker       if (Pos + 1 <= R && (Str[Pos + 1] == '\\' || Str[Pos + 1] == '"')) {
198*9880d681SAndroid Build Coastguard Worker         U->push_back(Str[Pos + 1]);
199*9880d681SAndroid Build Coastguard Worker         Pos++;
200*9880d681SAndroid Build Coastguard Worker         continue;
201*9880d681SAndroid Build Coastguard Worker       }
202*9880d681SAndroid Build Coastguard Worker       // Handle '\xAB'
203*9880d681SAndroid Build Coastguard Worker       if (Pos + 3 <= R && Str[Pos + 1] == 'x'
204*9880d681SAndroid Build Coastguard Worker            && isxdigit(Str[Pos + 2]) && isxdigit(Str[Pos + 3])) {
205*9880d681SAndroid Build Coastguard Worker         char Hex[] = "0xAA";
206*9880d681SAndroid Build Coastguard Worker         Hex[2] = Str[Pos + 2];
207*9880d681SAndroid Build Coastguard Worker         Hex[3] = Str[Pos + 3];
208*9880d681SAndroid Build Coastguard Worker         U->push_back(strtol(Hex, nullptr, 16));
209*9880d681SAndroid Build Coastguard Worker         Pos += 3;
210*9880d681SAndroid Build Coastguard Worker         continue;
211*9880d681SAndroid Build Coastguard Worker       }
212*9880d681SAndroid Build Coastguard Worker       return false;  // Invalid escape.
213*9880d681SAndroid Build Coastguard Worker     } else {
214*9880d681SAndroid Build Coastguard Worker       // Any other character.
215*9880d681SAndroid Build Coastguard Worker       U->push_back(V);
216*9880d681SAndroid Build Coastguard Worker     }
217*9880d681SAndroid Build Coastguard Worker   }
218*9880d681SAndroid Build Coastguard Worker   return true;
219*9880d681SAndroid Build Coastguard Worker }
220*9880d681SAndroid Build Coastguard Worker 
ParseDictionaryFile(const std::string & Text,std::vector<Unit> * Units)221*9880d681SAndroid Build Coastguard Worker bool ParseDictionaryFile(const std::string &Text, std::vector<Unit> *Units) {
222*9880d681SAndroid Build Coastguard Worker   if (Text.empty()) {
223*9880d681SAndroid Build Coastguard Worker     Printf("ParseDictionaryFile: file does not exist or is empty\n");
224*9880d681SAndroid Build Coastguard Worker     return false;
225*9880d681SAndroid Build Coastguard Worker   }
226*9880d681SAndroid Build Coastguard Worker   std::istringstream ISS(Text);
227*9880d681SAndroid Build Coastguard Worker   Units->clear();
228*9880d681SAndroid Build Coastguard Worker   Unit U;
229*9880d681SAndroid Build Coastguard Worker   int LineNo = 0;
230*9880d681SAndroid Build Coastguard Worker   std::string S;
231*9880d681SAndroid Build Coastguard Worker   while (std::getline(ISS, S, '\n')) {
232*9880d681SAndroid Build Coastguard Worker     LineNo++;
233*9880d681SAndroid Build Coastguard Worker     size_t Pos = 0;
234*9880d681SAndroid Build Coastguard Worker     while (Pos < S.size() && isspace(S[Pos])) Pos++;  // Skip spaces.
235*9880d681SAndroid Build Coastguard Worker     if (Pos == S.size()) continue;  // Empty line.
236*9880d681SAndroid Build Coastguard Worker     if (S[Pos] == '#') continue;  // Comment line.
237*9880d681SAndroid Build Coastguard Worker     if (ParseOneDictionaryEntry(S, &U)) {
238*9880d681SAndroid Build Coastguard Worker       Units->push_back(U);
239*9880d681SAndroid Build Coastguard Worker     } else {
240*9880d681SAndroid Build Coastguard Worker       Printf("ParseDictionaryFile: error in line %d\n\t\t%s\n", LineNo,
241*9880d681SAndroid Build Coastguard Worker              S.c_str());
242*9880d681SAndroid Build Coastguard Worker       return false;
243*9880d681SAndroid Build Coastguard Worker     }
244*9880d681SAndroid Build Coastguard Worker   }
245*9880d681SAndroid Build Coastguard Worker   return true;
246*9880d681SAndroid Build Coastguard Worker }
247*9880d681SAndroid Build Coastguard Worker 
SleepSeconds(int Seconds)248*9880d681SAndroid Build Coastguard Worker void SleepSeconds(int Seconds) {
249*9880d681SAndroid Build Coastguard Worker   std::this_thread::sleep_for(std::chrono::seconds(Seconds));
250*9880d681SAndroid Build Coastguard Worker }
251*9880d681SAndroid Build Coastguard Worker 
GetPid()252*9880d681SAndroid Build Coastguard Worker int GetPid() { return getpid(); }
253*9880d681SAndroid Build Coastguard Worker 
Base64(const Unit & U)254*9880d681SAndroid Build Coastguard Worker std::string Base64(const Unit &U) {
255*9880d681SAndroid Build Coastguard Worker   static const char Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
256*9880d681SAndroid Build Coastguard Worker                               "abcdefghijklmnopqrstuvwxyz"
257*9880d681SAndroid Build Coastguard Worker                               "0123456789+/";
258*9880d681SAndroid Build Coastguard Worker   std::string Res;
259*9880d681SAndroid Build Coastguard Worker   size_t i;
260*9880d681SAndroid Build Coastguard Worker   for (i = 0; i + 2 < U.size(); i += 3) {
261*9880d681SAndroid Build Coastguard Worker     uint32_t x = (U[i] << 16) + (U[i + 1] << 8) + U[i + 2];
262*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 18) & 63];
263*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 12) & 63];
264*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 6) & 63];
265*9880d681SAndroid Build Coastguard Worker     Res += Table[x & 63];
266*9880d681SAndroid Build Coastguard Worker   }
267*9880d681SAndroid Build Coastguard Worker   if (i + 1 == U.size()) {
268*9880d681SAndroid Build Coastguard Worker     uint32_t x = (U[i] << 16);
269*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 18) & 63];
270*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 12) & 63];
271*9880d681SAndroid Build Coastguard Worker     Res += "==";
272*9880d681SAndroid Build Coastguard Worker   } else if (i + 2 == U.size()) {
273*9880d681SAndroid Build Coastguard Worker     uint32_t x = (U[i] << 16) + (U[i + 1] << 8);
274*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 18) & 63];
275*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 12) & 63];
276*9880d681SAndroid Build Coastguard Worker     Res += Table[(x >> 6) & 63];
277*9880d681SAndroid Build Coastguard Worker     Res += "=";
278*9880d681SAndroid Build Coastguard Worker   }
279*9880d681SAndroid Build Coastguard Worker   return Res;
280*9880d681SAndroid Build Coastguard Worker }
281*9880d681SAndroid Build Coastguard Worker 
GetPeakRSSMb()282*9880d681SAndroid Build Coastguard Worker size_t GetPeakRSSMb() {
283*9880d681SAndroid Build Coastguard Worker   struct rusage usage;
284*9880d681SAndroid Build Coastguard Worker   if (getrusage(RUSAGE_SELF, &usage))
285*9880d681SAndroid Build Coastguard Worker     return 0;
286*9880d681SAndroid Build Coastguard Worker   if (LIBFUZZER_LINUX) {
287*9880d681SAndroid Build Coastguard Worker     // ru_maxrss is in KiB
288*9880d681SAndroid Build Coastguard Worker     return usage.ru_maxrss >> 10;
289*9880d681SAndroid Build Coastguard Worker   } else if (LIBFUZZER_APPLE) {
290*9880d681SAndroid Build Coastguard Worker     // ru_maxrss is in bytes
291*9880d681SAndroid Build Coastguard Worker     return usage.ru_maxrss >> 20;
292*9880d681SAndroid Build Coastguard Worker   }
293*9880d681SAndroid Build Coastguard Worker   assert(0 && "GetPeakRSSMb() is not implemented for your platform");
294*9880d681SAndroid Build Coastguard Worker   return 0;
295*9880d681SAndroid Build Coastguard Worker }
296*9880d681SAndroid Build Coastguard Worker 
297*9880d681SAndroid Build Coastguard Worker }  // namespace fuzzer
298