aboutsummaryrefslogtreecommitdiff
path: root/instrumentation
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2021-03-24 11:25:33 +0100
committerGitHub <noreply@github.com>2021-03-24 11:25:33 +0100
commitf0e08e648609e57732a76e285e57714c6d5fd2cd (patch)
tree9d35021985e2b6ea2b2988f318195d238e6fabc3 /instrumentation
parent37829765282421d9e3cb9448bceedcb58256e76a (diff)
parent2dac4e785fa9f27e8c59bb504cfa8942eba938be (diff)
downloadafl++-f0e08e648609e57732a76e285e57714c6d5fd2cd.tar.gz
Merge pull request #842 from AFLplusplus/stable
3.12c release
Diffstat (limited to 'instrumentation')
-rw-r--r--instrumentation/README.lto.md2
-rw-r--r--instrumentation/SanitizerCoverageLTO.so.cc10
-rw-r--r--instrumentation/SanitizerCoveragePCGUARD.so.cc238
-rw-r--r--instrumentation/afl-compiler-rt.o.c46
-rw-r--r--instrumentation/afl-llvm-common.cc21
5 files changed, 105 insertions, 212 deletions
diff --git a/instrumentation/README.lto.md b/instrumentation/README.lto.md
index 81c82c4b..39f6465a 100644
--- a/instrumentation/README.lto.md
+++ b/instrumentation/README.lto.md
@@ -113,7 +113,7 @@ cmake \
-DLLVM_LINK_LLVM_DYLIB="ON" \
-DLLVM_TARGETS_TO_BUILD="host" \
../llvm/
-cmake --build . --parallel
+cmake --build . -j4
export PATH="$(pwd)/bin:$PATH"
export LLVM_CONFIG="$(pwd)/bin/llvm-config"
export LD_LIBRARY_PATH="$(llvm-config --libdir)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
diff --git a/instrumentation/SanitizerCoverageLTO.so.cc b/instrumentation/SanitizerCoverageLTO.so.cc
index 13a5e5fd..6dd390e6 100644
--- a/instrumentation/SanitizerCoverageLTO.so.cc
+++ b/instrumentation/SanitizerCoverageLTO.so.cc
@@ -507,6 +507,7 @@ bool ModuleSanitizerCoverage::instrumentModule(
Zero = ConstantInt::get(Int8Tyi, 0);
One = ConstantInt::get(Int8Tyi, 1);
+ initInstrumentList();
scanForDangerousFunctions(&M);
Mo = &M;
@@ -1229,7 +1230,7 @@ void ModuleSanitizerCoverage::instrumentFunction(
// afl++ START
if (!F.size()) return;
- if (isIgnoreFunction(&F)) return;
+ if (!isInInstrumentList(&F)) return;
// afl++ END
if (Options.CoverageType >= SanitizerCoverageOptions::SCK_Edge)
@@ -1291,10 +1292,17 @@ GlobalVariable *ModuleSanitizerCoverage::CreateFunctionLocalArrayInSection(
*CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,
Constant::getNullValue(ArrayTy), "__sancov_gen_");
+#if LLVM_VERSION_MAJOR > 12
+ if (TargetTriple.supportsCOMDAT() &&
+ (TargetTriple.isOSBinFormatELF() || !F.isInterposable()))
+ if (auto Comdat = getOrCreateFunctionComdat(F, TargetTriple))
+ Array->setComdat(Comdat);
+#else
if (TargetTriple.supportsCOMDAT() && !F.isInterposable())
if (auto Comdat =
GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId))
Array->setComdat(Comdat);
+#endif
Array->setSection(getSectionName(Section));
Array->setAlignment(Align(DL->getTypeStoreSize(Ty).getFixedSize()));
GlobalsToAppendToUsed.push_back(Array);
diff --git a/instrumentation/SanitizerCoveragePCGUARD.so.cc b/instrumentation/SanitizerCoveragePCGUARD.so.cc
index 9b1351b0..09cda9e2 100644
--- a/instrumentation/SanitizerCoveragePCGUARD.so.cc
+++ b/instrumentation/SanitizerCoveragePCGUARD.so.cc
@@ -10,6 +10,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/EHPersonalities.h"
@@ -34,11 +35,11 @@
#include "llvm/InitializePasses.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
-#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/SpecialCaseList.h"
#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
#include "llvm/Support/VirtualFileSystem.h"
#endif
+#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
@@ -47,65 +48,6 @@
#include "debug.h"
#include "afl-llvm-common.h"
-namespace llvm {
-
-/// This is the ModuleSanitizerCoverage pass used in the new pass manager. The
-/// pass instruments functions for coverage, adds initialization calls to the
-/// module for trace PC guards and 8bit counters if they are requested, and
-/// appends globals to llvm.compiler.used.
-class ModuleSanitizerCoveragePass
- : public PassInfoMixin<ModuleSanitizerCoveragePass> {
-
- public:
- explicit ModuleSanitizerCoveragePass(
- SanitizerCoverageOptions Options = SanitizerCoverageOptions(),
- const std::vector<std::string> &AllowlistFiles =
- std::vector<std::string>(),
- const std::vector<std::string> &BlocklistFiles =
- std::vector<std::string>())
- : Options(Options) {
-
- if (AllowlistFiles.size() > 0)
- Allowlist = SpecialCaseList::createOrDie(AllowlistFiles
-#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
- ,
- *vfs::getRealFileSystem()
-#endif
- );
- if (BlocklistFiles.size() > 0)
- Blocklist = SpecialCaseList::createOrDie(BlocklistFiles
-#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
- ,
- *vfs::getRealFileSystem()
-#endif
- );
-
- }
-
- PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
- static bool isRequired() {
-
- return true;
-
- }
-
- private:
- SanitizerCoverageOptions Options;
-
- std::unique_ptr<SpecialCaseList> Allowlist;
- std::unique_ptr<SpecialCaseList> Blocklist;
-
-};
-
-// Insert SanitizerCoverage instrumentation.
-ModulePass *createModuleSanitizerCoverageLegacyPassPass(
- const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
- const std::vector<std::string> &AllowlistFiles = std::vector<std::string>(),
- const std::vector<std::string> &BlocklistFiles =
- std::vector<std::string>());
-
-} // namespace llvm
-
using namespace llvm;
#define DEBUG_TYPE "sancov"
@@ -156,96 +98,8 @@ static const char *const SanCovLowestStackName = "__sancov_lowest_stack";
static char *skip_nozero;
-/*
-static cl::opt<int> ClCoverageLevel(
- "sanitizer-coverage-level",
- cl::desc("Sanitizer Coverage. 0: none, 1: entry block, 2: all blocks, "
- "3: all blocks and critical edges"),
- cl::Hidden, cl::init(3));
-
-static cl::opt<bool> ClTracePC("sanitizer-coverage-trace-pc",
- cl::desc("Experimental pc tracing"), cl::Hidden,
- cl::init(false));
-
-static cl::opt<bool> ClTracePCGuard("sanitizer-coverage-trace-pc-guard",
- cl::desc("pc tracing with a guard"),
- cl::Hidden, cl::init(true));
-
-// If true, we create a global variable that contains PCs of all instrumented
-// BBs, put this global into a named section, and pass this section's bounds
-// to __sanitizer_cov_pcs_init.
-// This way the coverage instrumentation does not need to acquire the PCs
-// at run-time. Works with trace-pc-guard, inline-8bit-counters, and
-// inline-bool-flag.
-static cl::opt<bool> ClCreatePCTable("sanitizer-coverage-pc-table",
- cl::desc("create a static PC table"),
- cl::Hidden, cl::init(false));
-
-static cl::opt<bool> ClInline8bitCounters(
- "sanitizer-coverage-inline-8bit-counters",
- cl::desc("increments 8-bit counter for every edge"), cl::Hidden,
- cl::init(false));
-
-static cl::opt<bool> ClInlineBoolFlag(
- "sanitizer-coverage-inline-bool-flag",
- cl::desc("sets a boolean flag for every edge"), cl::Hidden,
- cl::init(false));
-
-static cl::opt<bool> ClCMPTracing(
- "sanitizer-coverage-trace-compares",
- cl::desc("Tracing of CMP and similar instructions"), cl::Hidden,
- cl::init(false));
-
-static cl::opt<bool> ClDIVTracing("sanitizer-coverage-trace-divs",
- cl::desc("Tracing of DIV instructions"),
- cl::Hidden, cl::init(false));
-
-static cl::opt<bool> ClGEPTracing("sanitizer-coverage-trace-geps",
- cl::desc("Tracing of GEP instructions"),
- cl::Hidden, cl::init(false));
-
-static cl::opt<bool> ClPruneBlocks(
- "sanitizer-coverage-prune-blocks",
- cl::desc("Reduce the number of instrumented blocks"), cl::Hidden,
- cl::init(true));
-
-static cl::opt<bool> ClStackDepth("sanitizer-coverage-stack-depth",
- cl::desc("max stack depth tracing"),
- cl::Hidden, cl::init(false));
-*/
namespace {
-/*
-SanitizerCoverageOptions getOptions(int LegacyCoverageLevel) {
-
- SanitizerCoverageOptions Res;
- switch (LegacyCoverageLevel) {
-
- case 0:
- Res.CoverageType = SanitizerCoverageOptions::SCK_None;
- break;
- case 1:
- Res.CoverageType = SanitizerCoverageOptions::SCK_Function;
- break;
- case 2:
- Res.CoverageType = SanitizerCoverageOptions::SCK_BB;
- break;
- case 3:
- Res.CoverageType = SanitizerCoverageOptions::SCK_Edge;
- break;
- case 4:
- Res.CoverageType = SanitizerCoverageOptions::SCK_Edge;
- Res.IndirectCalls = true;
- break;
-
- }
-
- return Res;
-
-}
-
-*/
-
SanitizerCoverageOptions OverrideFromCL(SanitizerCoverageOptions Options) {
// Sets CoverageType and IndirectCalls.
@@ -281,12 +135,14 @@ class ModuleSanitizerCoverage {
public:
ModuleSanitizerCoverage(
- const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
- const SpecialCaseList * Allowlist = nullptr,
- const SpecialCaseList * Blocklist = nullptr)
- : Options(OverrideFromCL(Options)),
- Allowlist(Allowlist),
- Blocklist(Blocklist) {
+ const SanitizerCoverageOptions &Options = SanitizerCoverageOptions()
+#if LLVM_MAJOR > 10
+ ,
+ const SpecialCaseList *Allowlist = nullptr,
+ const SpecialCaseList *Blocklist = nullptr
+#endif
+ )
+ : Options(OverrideFromCL(Options)) {
}
@@ -356,9 +212,6 @@ class ModuleSanitizerCoverage {
SanitizerCoverageOptions Options;
- const SpecialCaseList *Allowlist;
- const SpecialCaseList *Blocklist;
-
uint32_t instr = 0;
GlobalVariable *AFLMapPtr = NULL;
ConstantInt * One = NULL;
@@ -370,27 +223,17 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
public:
ModuleSanitizerCoverageLegacyPass(
- const SanitizerCoverageOptions &Options = SanitizerCoverageOptions(),
+ const SanitizerCoverageOptions &Options = SanitizerCoverageOptions()
+#if LLVM_VERSION_MAJOR > 10
+ ,
const std::vector<std::string> &AllowlistFiles =
std::vector<std::string>(),
const std::vector<std::string> &BlocklistFiles =
- std::vector<std::string>())
+ std::vector<std::string>()
+#endif
+ )
: ModulePass(ID), Options(Options) {
- if (AllowlistFiles.size() > 0)
- Allowlist = SpecialCaseList::createOrDie(AllowlistFiles
-#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
- ,
- *vfs::getRealFileSystem()
-#endif
- );
- if (BlocklistFiles.size() > 0)
- Blocklist = SpecialCaseList::createOrDie(BlocklistFiles
-#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
- ,
- *vfs::getRealFileSystem()
-#endif
- );
initializeModuleSanitizerCoverageLegacyPassPass(
*PassRegistry::getPassRegistry());
@@ -398,8 +241,12 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
bool runOnModule(Module &M) override {
- ModuleSanitizerCoverage ModuleSancov(Options, Allowlist.get(),
- Blocklist.get());
+ ModuleSanitizerCoverage ModuleSancov(Options
+#if LLVM_MAJOR > 10
+ ,
+ Allowlist.get(), Blocklist.get()
+#endif
+ );
auto DTCallback = [this](Function &F) -> const DominatorTree * {
return &this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
@@ -444,8 +291,12 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
PreservedAnalyses ModuleSanitizerCoveragePass::run(Module & M,
ModuleAnalysisManager &MAM) {
- ModuleSanitizerCoverage ModuleSancov(Options, Allowlist.get(),
- Blocklist.get());
+ ModuleSanitizerCoverage ModuleSancov(Options
+#if LLVM_MAJOR > 10
+ ,
+ Allowlist.get(), Blocklist.get()
+#endif
+ );
auto &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
auto DTCallback = [&FAM](Function &F) -> const DominatorTree * {
@@ -564,12 +415,6 @@ bool ModuleSanitizerCoverage::instrumentModule(
}
if (Options.CoverageType == SanitizerCoverageOptions::SCK_None) return false;
- if (Allowlist &&
- !Allowlist->inSection("coverage", "src", M.getSourceFileName()))
- return false;
- if (Blocklist &&
- Blocklist->inSection("coverage", "src", M.getSourceFileName()))
- return false;
C = &(M.getContext());
DL = &M.getDataLayout();
CurModule = &M;
@@ -842,9 +687,6 @@ void ModuleSanitizerCoverage::instrumentFunction(
if (F.hasPersonalityFn() &&
isAsynchronousEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
return;
- if (Allowlist && !Allowlist->inSection("coverage", "fun", F.getName()))
- return;
- if (Blocklist && Blocklist->inSection("coverage", "fun", F.getName())) return;
if (Options.CoverageType >= SanitizerCoverageOptions::SCK_Edge)
SplitAllCriticalEdges(
F, CriticalEdgeSplittingOptions().setIgnoreUnreachableDests());
@@ -915,10 +757,18 @@ GlobalVariable *ModuleSanitizerCoverage::CreateFunctionLocalArrayInSection(
*CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,
Constant::getNullValue(ArrayTy), "__sancov_gen_");
+#if LLVM_VERSION_MAJOR > 12
+ if (TargetTriple.supportsCOMDAT() &&
+ (TargetTriple.isOSBinFormatELF() || !F.isInterposable()))
+ if (auto Comdat = getOrCreateFunctionComdat(F, TargetTriple))
+ Array->setComdat(Comdat);
+#else
if (TargetTriple.supportsCOMDAT() && !F.isInterposable())
if (auto Comdat =
GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId))
Array->setComdat(Comdat);
+#endif
+
Array->setSection(getSectionName(Section));
#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
Array->setAlignment(Align(DL->getTypeStoreSize(Ty).getFixedSize()));
@@ -1354,12 +1204,20 @@ INITIALIZE_PASS_END(ModuleSanitizerCoverageLegacyPass, "sancov",
false)
ModulePass *llvm::createModuleSanitizerCoverageLegacyPassPass(
- const SanitizerCoverageOptions &Options,
+ const SanitizerCoverageOptions &Options
+#if LLVM_MAJOR > 10
+ ,
const std::vector<std::string> &AllowlistFiles,
- const std::vector<std::string> &BlocklistFiles) {
+ const std::vector<std::string> &BlocklistFiles
+#endif
+) {
- return new ModuleSanitizerCoverageLegacyPass(Options, AllowlistFiles,
- BlocklistFiles);
+ return new ModuleSanitizerCoverageLegacyPass(Options
+#if LLVM_MAJOR > 10
+ ,
+ AllowlistFiles, BlocklistFiles
+#endif
+ );
}
diff --git a/instrumentation/afl-compiler-rt.o.c b/instrumentation/afl-compiler-rt.o.c
index cca38cd0..f241447a 100644
--- a/instrumentation/afl-compiler-rt.o.c
+++ b/instrumentation/afl-compiler-rt.o.c
@@ -204,7 +204,7 @@ static void __afl_map_shm_fuzz() {
int shm_fd = -1;
/* create the shared memory segment as if it was a file */
- shm_fd = shm_open(shm_file_path, O_RDWR, 0600);
+ shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
if (shm_fd == -1) {
fprintf(stderr, "shm_open() failed for fuzz\n");
@@ -353,7 +353,7 @@ static void __afl_map_shm(void) {
unsigned char *shm_base = NULL;
/* create the shared memory segment as if it was a file */
- shm_fd = shm_open(shm_file_path, O_RDWR, 0600);
+ shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
if (shm_fd == -1) {
fprintf(stderr, "shm_open() failed\n");
@@ -528,7 +528,7 @@ static void __afl_map_shm(void) {
struct cmp_map *shm_base = NULL;
/* create the shared memory segment as if it was a file */
- shm_fd = shm_open(shm_file_path, O_RDWR, 0600);
+ shm_fd = shm_open(shm_file_path, O_RDWR, DEFAULT_PERMISSION);
if (shm_fd == -1) {
perror("shm_open() failed\n");
@@ -729,7 +729,7 @@ static void __afl_start_snapshots(void) {
static uint32_t counter = 0;
char fn[32];
sprintf(fn, "%09u:forkserver", counter);
- s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_PERMISSION);
if (fd_doc >= 0) {
if (write(fd_doc, __afl_fuzz_ptr, *__afl_fuzz_len) != *__afl_fuzz_len) {
@@ -960,7 +960,7 @@ static void __afl_start_forkserver(void) {
static uint32_t counter = 0;
char fn[32];
sprintf(fn, "%09u:forkserver", counter);
- s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ s32 fd_doc = open(fn, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_PERMISSION);
if (fd_doc >= 0) {
if (write(fd_doc, __afl_fuzz_ptr, *__afl_fuzz_len) != *__afl_fuzz_len) {
@@ -1676,6 +1676,12 @@ void __sanitizer_cov_trace_cmp16(uint128_t arg1, uint128_t arg2) {
}
+void __sanitizer_cov_trace_const_cmp16(uint128_t arg1, uint128_t arg2) {
+
+ __cmplog_ins_hook16(arg1, arg2, 0);
+
+}
+
#endif
void __sanitizer_cov_trace_switch(uint64_t val, uint64_t *cases) {
@@ -1730,29 +1736,30 @@ __attribute__((weak)) void *__asan_region_is_poisoned(void *beg, size_t size) {
// to avoid to call it on .text addresses
static int area_is_valid(void *ptr, size_t len) {
- if (unlikely(__asan_region_is_poisoned(ptr, len))) { return 0; }
+ if (unlikely(!ptr || __asan_region_is_poisoned(ptr, len))) { return 0; }
- long r = syscall(__afl_dummy_fd[1], SYS_write, ptr, len);
+ long r = syscall(SYS_write, __afl_dummy_fd[1], ptr, len);
- if (unlikely(r <= 0 || r > len)) { // fail - maybe hitting asan boundary?
+ if (r <= 0 || r > len) return 0;
- char *p = (char *)ptr;
- long page_size = sysconf(_SC_PAGE_SIZE);
- char *page = (char *)((uintptr_t)p & ~(page_size - 1)) + page_size;
- if (page < p + len) { return 0; } // no isnt, return fail
- len -= (p + len - page);
- r = syscall(__afl_dummy_fd[1], SYS_write, p, len);
+ // even if the write succeed this can be a false positive if we cross
+ // a page boundary. who knows why.
- }
+ char *p = (char *)ptr;
+ long page_size = sysconf(_SC_PAGE_SIZE);
+ char *page = (char *)((uintptr_t)p & ~(page_size - 1)) + page_size;
- // partial writes - we return what was written.
- if (likely(r >= 0 && r <= len)) {
+ if (page > p + len) {
+ // no, not crossing a page boundary
return (int)r;
} else {
- return 0;
+ // yes it crosses a boundary, hence we can only return the length of
+ // rest of the first page, we cannot detect if the next page is valid
+ // or not, neither by SYS_write nor msync() :-(
+ return (int)(page - p);
}
@@ -1773,12 +1780,14 @@ void __cmplog_rtn_hook(u8 *ptr1, u8 *ptr2) {
*/
if (unlikely(!__afl_cmp_map)) return;
+ // fprintf(stderr, "RTN1 %p %p\n", ptr1, ptr2);
int l1, l2;
if ((l1 = area_is_valid(ptr1, 32)) <= 0 ||
(l2 = area_is_valid(ptr2, 32)) <= 0)
return;
int len = MIN(l1, l2);
+ // fprintf(stderr, "RTN2 %u\n", len);
uintptr_t k = (uintptr_t)__builtin_return_address(0);
k = (k >> 4) ^ (k << 8);
k &= CMP_MAP_W - 1;
@@ -1809,6 +1818,7 @@ void __cmplog_rtn_hook(u8 *ptr1, u8 *ptr2) {
ptr1, len);
__builtin_memcpy(((struct cmpfn_operands *)__afl_cmp_map->log[k])[hits].v1,
ptr2, len);
+ // fprintf(stderr, "RTN3\n");
}
diff --git a/instrumentation/afl-llvm-common.cc b/instrumentation/afl-llvm-common.cc
index 0fd3a011..74943fb2 100644
--- a/instrumentation/afl-llvm-common.cc
+++ b/instrumentation/afl-llvm-common.cc
@@ -60,7 +60,7 @@ bool isIgnoreFunction(const llvm::Function *F) {
"asan.",
"llvm.",
"sancov.",
- "__ubsan_",
+ "__ubsan",
"ign.",
"__afl",
"_fini",
@@ -69,13 +69,16 @@ bool isIgnoreFunction(const llvm::Function *F) {
"__msan",
"__cmplog",
"__sancov",
+ "__san",
"__cxx_",
+ "__decide_deferred",
"_GLOBAL",
+ "_ZZN6__asan",
+ "_ZZN6__lsan",
"msan.",
"LLVMFuzzerM",
"LLVMFuzzerC",
"LLVMFuzzerI",
- "__decide_deferred",
"maybe_duplicate_stderr",
"discard_output",
"close_stdout",
@@ -91,6 +94,20 @@ bool isIgnoreFunction(const llvm::Function *F) {
}
+ static const char *ignoreSubstringList[] = {
+
+ "__asan", "__msan", "__ubsan", "__lsan",
+ "__san", "__sanitize", "__cxx", "_GLOBAL__",
+ "DebugCounter", "DwarfDebug", "DebugLoc"
+
+ };
+
+ for (auto const &ignoreListFunc : ignoreSubstringList) {
+
+ if (F->getName().contains(ignoreListFunc)) { return true; }
+
+ }
+
return false;
}