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