1 //===- FuzzerUtil.h - Internal header for the Fuzzer Utils ------*- C++ -* ===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 //===----------------------------------------------------------------------===//
11 #ifndef LLVM_FUZZER_UTIL_H
12 #define LLVM_FUZZER_UTIL_H
14 #include "FuzzerBuiltins.h"
15 #include "FuzzerBuiltinsMsvc.h"
16 #include "FuzzerCommand.h"
17 #include "FuzzerDefs.h"
21 void PrintHexArray(const Unit
&U
, const char *PrintAfter
= "");
23 void PrintHexArray(const uint8_t *Data
, size_t Size
,
24 const char *PrintAfter
= "");
26 void PrintASCII(const uint8_t *Data
, size_t Size
, const char *PrintAfter
= "");
28 void PrintASCII(const Unit
&U
, const char *PrintAfter
= "");
30 // Changes U to contain only ASCII (isprint+isspace) characters.
31 // Returns true iff U has been changed.
32 bool ToASCII(uint8_t *Data
, size_t Size
);
34 bool IsASCII(const Unit
&U
);
36 bool IsASCII(const uint8_t *Data
, size_t Size
);
38 std::string
Base64(const Unit
&U
);
40 void PrintPC(const char *SymbolizedFMT
, const char *FallbackFMT
, uintptr_t PC
);
42 std::string
DescribePC(const char *SymbolizedFMT
, uintptr_t PC
);
44 void PrintStackTrace();
46 void PrintMemoryProfile();
48 unsigned NumberOfCpuCores();
50 // Platform specific functions.
51 void SetSignalHandler(const FuzzingOptions
& Options
);
53 void SleepSeconds(int Seconds
);
55 unsigned long GetPid();
57 size_t GetPeakRSSMb();
59 int ExecuteCommand(const Command
&Cmd
);
60 bool ExecuteCommand(const Command
&Cmd
, std::string
*CmdOutput
);
62 // Fuchsia does not have popen/pclose.
63 FILE *OpenProcessPipe(const char *Command
, const char *Mode
);
64 int CloseProcessPipe(FILE *F
);
66 const void *SearchMemory(const void *haystack
, size_t haystacklen
,
67 const void *needle
, size_t needlelen
);
69 std::string
CloneArgsWithoutX(const Vector
<std::string
> &Args
,
70 const char *X1
, const char *X2
);
72 inline std::string
CloneArgsWithoutX(const Vector
<std::string
> &Args
,
74 return CloneArgsWithoutX(Args
, X
, X
);
77 inline std::pair
<std::string
, std::string
> SplitBefore(std::string X
,
80 if (Pos
== std::string::npos
)
81 return std::make_pair(S
, "");
82 return std::make_pair(S
.substr(0, Pos
), S
.substr(Pos
));
85 void DiscardOutput(int Fd
);
87 std::string
DisassembleCmd(const std::string
&FileName
);
89 std::string
SearchRegexCmd(const std::string
&Regex
);
91 size_t SimpleFastHash(const uint8_t *Data
, size_t Size
);
93 inline uint32_t Log(uint32_t X
) { return 32 - Clz(X
) - 1; }
95 inline size_t PageSize() { return 4096; }
96 inline uint8_t *RoundUpByPage(uint8_t *P
) {
97 uintptr_t X
= reinterpret_cast<uintptr_t>(P
);
98 size_t Mask
= PageSize() - 1;
99 X
= (X
+ Mask
) & ~Mask
;
100 return reinterpret_cast<uint8_t *>(X
);
102 inline uint8_t *RoundDownByPage(uint8_t *P
) {
103 uintptr_t X
= reinterpret_cast<uintptr_t>(P
);
104 size_t Mask
= PageSize() - 1;
106 return reinterpret_cast<uint8_t *>(X
);
109 #if __BYTE_ORDER == __LITTLE_ENDIAN
110 template <typename T
> T
HostToLE(T X
) { return X
; }
112 template <typename T
> T
HostToLE(T X
) { return Bswap(X
); }
115 } // namespace fuzzer
117 #endif // LLVM_FUZZER_UTIL_H