From bd9186853d53d8b4c90cbb4afb02f2df7c634fd1 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Sat, 10 Dec 2016 01:19:35 +0000 Subject: [PATCH] [libFuzzer] use __sanitizer_get_module_and_offset_for_pc to get the module name while printing the coverage git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289310 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Fuzzer/FuzzerExtFunctions.def | 3 +++ lib/Fuzzer/FuzzerTracePC.cpp | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/Fuzzer/FuzzerExtFunctions.def b/lib/Fuzzer/FuzzerExtFunctions.def index b34670f85b4..61c72e4a209 100644 --- a/lib/Fuzzer/FuzzerExtFunctions.def +++ b/lib/Fuzzer/FuzzerExtFunctions.def @@ -40,6 +40,9 @@ EXT_FUNC(__sanitizer_print_memory_profile, int, (size_t), false); EXT_FUNC(__sanitizer_print_stack_trace, void, (), true); EXT_FUNC(__sanitizer_symbolize_pc, void, (void *, const char *fmt, char *out_buf, size_t out_buf_size), false); +EXT_FUNC(__sanitizer_get_module_and_offset_for_pc, int, + (void *pc, char *module_path, + size_t module_path_len,void **pc_offset), false); EXT_FUNC(__sanitizer_reset_coverage, void, (), true); EXT_FUNC(__sanitizer_set_death_callback, void, (void (*)(void)), true); EXT_FUNC(__sanitizer_set_report_fd, void, (void*), false); diff --git a/lib/Fuzzer/FuzzerTracePC.cpp b/lib/Fuzzer/FuzzerTracePC.cpp index d8036edf728..7e7a9143830 100644 --- a/lib/Fuzzer/FuzzerTracePC.cpp +++ b/lib/Fuzzer/FuzzerTracePC.cpp @@ -89,8 +89,10 @@ void TracePC::PrintNewPCs() { } void TracePC::PrintCoverage() { - if (!EF->__sanitizer_symbolize_pc) { - Printf("INFO: __sanitizer_symbolize_pc is not available," + if (!EF->__sanitizer_symbolize_pc || + !EF->__sanitizer_get_module_and_offset_for_pc) { + Printf("INFO: __sanitizer_symbolize_pc or " + "__sanitizer_get_module_and_offset_for_pc is not available," " not printing coverage\n"); return; } @@ -106,12 +108,15 @@ void TracePC::PrintCoverage() { std::string FixedPCStr = DescribePC("%p", PCs[i]); std::string FunctionStr = DescribePC("%F", PCs[i]); std::string LineStr = DescribePC("%l", PCs[i]); - // TODO(kcc): get the module using some other way since this - // does not work with ASAN_OPTIONS=strip_path_prefix=something. - std::string Module = DescribePC("%m", PCs[i]); - std::string OffsetStr = DescribePC("%o", PCs[i]); + char ModulePathRaw[4096] = ""; // What's PATH_MAX in portable C++? + void *OffsetRaw = nullptr; + if (!EF->__sanitizer_get_module_and_offset_for_pc( + reinterpret_cast(PCs[i]), ModulePathRaw, + sizeof(ModulePathRaw), &OffsetRaw)) + continue; + std::string Module = ModulePathRaw; uintptr_t FixedPC = std::stol(FixedPCStr, 0, 16); - uintptr_t PcOffset = std::stol(OffsetStr, 0, 16); + uintptr_t PcOffset = reinterpret_cast(OffsetRaw); ModuleOffsets[Module] = FixedPC - PcOffset; CoveredPCsPerModule[Module].push_back(PcOffset); CoveredFunctions.insert(FunctionStr); -- 2.50.1