From: Kostya Serebryany Date: Tue, 1 Aug 2017 00:48:44 +0000 (+0000) Subject: [libFuzzer] enable -fsanitize-coverage=pc-table for all tests X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c6d173bbf65b5a1264f52bd8deaee18395bf418c;p=llvm [libFuzzer] enable -fsanitize-coverage=pc-table for all tests git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309646 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Fuzzer/FuzzerTracePC.cpp b/lib/Fuzzer/FuzzerTracePC.cpp index 1c4c24032fc..1cfd3f3ecff 100644 --- a/lib/Fuzzer/FuzzerTracePC.cpp +++ b/lib/Fuzzer/FuzzerTracePC.cpp @@ -72,7 +72,7 @@ void TracePC::HandlePCsInit(const uint8_t *Start, const uint8_t *Stop) { if (NumPCTables && ModulePCTable[NumPCTables - 1].Start == B) return; assert(NumPCTables < sizeof(ModulePCTable) / sizeof(ModulePCTable[0])); ModulePCTable[NumPCTables++] = {B, E}; - NumPCsInPCTables = E - B; + NumPCsInPCTables += E - B; } void TracePC::HandleInit(uint32_t *Start, uint32_t *Stop) { @@ -95,26 +95,36 @@ void TracePC::HandleInit(uint32_t *Start, uint32_t *Stop) { void TracePC::PrintModuleInfo() { if (NumGuards) { - Printf("INFO: Loaded %zd modules (%zd guards): ", NumModules, NumGuards); + Printf("INFO: Loaded %zd modules (%zd guards): ", NumModules, NumGuards); for (size_t i = 0; i < NumModules; i++) - Printf("[%p, %p), ", Modules[i].Start, Modules[i].Stop); + Printf("%zd [%p, %p), ", Modules[i].Stop - Modules[i].Start, + Modules[i].Start, Modules[i].Stop); Printf("\n"); } if (NumModulesWithInline8bitCounters) { - Printf("INFO: Loaded %zd modules with %zd inline 8-bit counters: ", + Printf("INFO: Loaded %zd modules (%zd inline 8-bit counters): ", NumModulesWithInline8bitCounters, NumInline8bitCounters); for (size_t i = 0; i < NumModulesWithInline8bitCounters; i++) - Printf("[%p, %p), ", ModuleCounters[i].Start, ModuleCounters[i].Stop); + Printf("%zd [%p, %p), ", ModuleCounters[i].Stop - ModuleCounters[i].Start, + ModuleCounters[i].Start, ModuleCounters[i].Stop); Printf("\n"); } if (NumPCTables) { - Printf("INFO: Loaded %zd PC tables, %zd PCs: ", NumPCTables, + Printf("INFO: Loaded %zd PC tables (%zd PCs): ", NumPCTables, NumPCsInPCTables); for (size_t i = 0; i < NumPCTables; i++) { - Printf("[%p,%p), ", ModulePCTable[i].Start, ModulePCTable[i].Stop, - ModulePCTable[i].Stop - ModulePCTable[i].Start); + Printf("%zd [%p,%p), ", ModulePCTable[i].Stop - ModulePCTable[i].Start, + ModulePCTable[i].Start, ModulePCTable[i].Stop); } Printf("\n"); + + if ((NumGuards && NumGuards != NumPCsInPCTables) || + (NumInline8bitCounters && NumInline8bitCounters != NumPCsInPCTables)) { + Printf("ERROR: The size of coverage PC tables does not match the" + " number of instrumented PCs. This might be a bug in the compiler," + " please contact the libFuzzer developers.\n"); + _Exit(1); + } } } diff --git a/lib/Fuzzer/FuzzerTracePC.h b/lib/Fuzzer/FuzzerTracePC.h index 1ad5cf1d1cc..36207f8ea3d 100644 --- a/lib/Fuzzer/FuzzerTracePC.h +++ b/lib/Fuzzer/FuzzerTracePC.h @@ -86,7 +86,8 @@ class TracePC { void ResetMaps() { ValueProfileMap.Reset(); - memset(Counters(), 0, GetNumPCs()); + if (NumModules) + memset(Counters(), 0, GetNumPCs()); ClearExtraCounters(); ClearInlineCounters(); } diff --git a/lib/Fuzzer/test/CMakeLists.txt b/lib/Fuzzer/test/CMakeLists.txt index b46960822bc..1de3dff04d6 100644 --- a/lib/Fuzzer/test/CMakeLists.txt +++ b/lib/Fuzzer/test/CMakeLists.txt @@ -15,7 +15,7 @@ foreach (VARNAME ${variables_to_filter}) endforeach() # Enable the coverage instrumentation (it is disabled for the Fuzzer lib). -set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp,trace-div,trace-gep -gline-tables-only") +set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize-coverage=trace-pc-guard,indirect-calls,trace-cmp,trace-div,trace-gep,pc-table -gline-tables-only") if(MSVC) # For tests use the CRT specified for release build diff --git a/lib/Fuzzer/test/inline-8bit-counters.test b/lib/Fuzzer/test/inline-8bit-counters.test index ff84dd119c1..4727ba45946 100644 --- a/lib/Fuzzer/test/inline-8bit-counters.test +++ b/lib/Fuzzer/test/inline-8bit-counters.test @@ -1,4 +1,4 @@ REQUIRES: linux -CHECK: INFO: Loaded 1 modules with {{.*}} inline 8-bit counters +CHECK: INFO: Loaded 1 modules ({{.*}} inline 8-bit counters) CHECK: BINGO RUN: not LLVMFuzzer-SimpleTest-Inline8bitCounters -runs=1000000 -seed=1 2>&1 | FileCheck %s