| //===- FuzzerUtil.h - Internal header for the Fuzzer Utils ------*- C++ -* ===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // Util functions. |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_FUZZER_UTIL_H |
| #define LLVM_FUZZER_UTIL_H |
| |
| #include "FuzzerBuiltins.h" |
| #include "FuzzerBuiltinsMsvc.h" |
| #include "FuzzerCommand.h" |
| #include "FuzzerDefs.h" |
| |
| namespace fuzzer { |
| |
| void PrintHexArray(const Unit &U, const char *PrintAfter = ""); |
| |
| void PrintHexArray(const uint8_t *Data, size_t Size, |
| const char *PrintAfter = ""); |
| |
| void PrintASCII(const uint8_t *Data, size_t Size, const char *PrintAfter = ""); |
| |
| void PrintASCII(const Unit &U, const char *PrintAfter = ""); |
| |
| // Changes U to contain only ASCII (isprint+isspace) characters. |
| // Returns true iff U has been changed. |
| bool ToASCII(uint8_t *Data, size_t Size); |
| |
| bool IsASCII(const Unit &U); |
| |
| bool IsASCII(const uint8_t *Data, size_t Size); |
| |
| std::string Base64(const Unit &U); |
| |
| void PrintPC(const char *SymbolizedFMT, const char *FallbackFMT, uintptr_t PC); |
| |
| std::string DescribePC(const char *SymbolizedFMT, uintptr_t PC); |
| |
| void PrintStackTrace(); |
| |
| void PrintMemoryProfile(); |
| |
| unsigned NumberOfCpuCores(); |
| |
| // Platform specific functions. |
| void SetSignalHandler(const FuzzingOptions& Options); |
| |
| void SleepSeconds(int Seconds); |
| |
| unsigned long GetPid(); |
| |
| size_t GetPeakRSSMb(); |
| |
| int ExecuteCommand(const Command &Cmd); |
| bool ExecuteCommand(const Command &Cmd, std::string *CmdOutput); |
| |
| // Fuchsia does not have popen/pclose. |
| FILE *OpenProcessPipe(const char *Command, const char *Mode); |
| int CloseProcessPipe(FILE *F); |
| |
| const void *SearchMemory(const void *haystack, size_t haystacklen, |
| const void *needle, size_t needlelen); |
| |
| std::string CloneArgsWithoutX(const std::vector<std::string> &Args, |
| const char *X1, const char *X2); |
| |
| inline std::string CloneArgsWithoutX(const std::vector<std::string> &Args, |
| const char *X) { |
| return CloneArgsWithoutX(Args, X, X); |
| } |
| |
| inline std::pair<std::string, std::string> SplitBefore(std::string X, |
| std::string S) { |
| auto Pos = S.find(X); |
| if (Pos == std::string::npos) |
| return std::make_pair(S, ""); |
| return std::make_pair(S.substr(0, Pos), S.substr(Pos)); |
| } |
| |
| void DiscardOutput(int Fd); |
| |
| std::string DisassembleCmd(const std::string &FileName); |
| |
| std::string SearchRegexCmd(const std::string &Regex); |
| |
| uint64_t SimpleFastHash(const void *Data, size_t Size, uint64_t Initial = 0); |
| |
| inline size_t Log(size_t X) { |
| return static_cast<size_t>((sizeof(unsigned long long) * 8) - Clzll(X) - 1); |
| } |
| |
| inline size_t PageSize() { return 4096; } |
| inline uint8_t *RoundUpByPage(uint8_t *P) { |
| uintptr_t X = reinterpret_cast<uintptr_t>(P); |
| size_t Mask = PageSize() - 1; |
| X = (X + Mask) & ~Mask; |
| return reinterpret_cast<uint8_t *>(X); |
| } |
| inline uint8_t *RoundDownByPage(uint8_t *P) { |
| uintptr_t X = reinterpret_cast<uintptr_t>(P); |
| size_t Mask = PageSize() - 1; |
| X = X & ~Mask; |
| return reinterpret_cast<uint8_t *>(X); |
| } |
| |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| template <typename T> T HostToLE(T X) { return X; } |
| #else |
| template <typename T> T HostToLE(T X) { return Bswap(X); } |
| #endif |
| |
| } // namespace fuzzer |
| |
| #endif // LLVM_FUZZER_UTIL_H |