diff options
author | Kostya Serebryany <kcc@google.com> | 2017-08-25 19:29:47 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2017-08-25 19:29:47 +0000 |
commit | 3518c5ed168302e729f32e59e7406e733eabbff7 (patch) | |
tree | a405155c505ea5d964c1dc878e549c81c66d2ebc | |
parent | 809c05a0ca406262e02bf5ec2dd78ae1f44009da (diff) |
[sanitizer-coverage] extend fsanitize-coverage=pc-table with flags for every PC
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@311794 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/fuzzer/FuzzerTracePC.cpp | 17 | ||||
-rw-r--r-- | lib/fuzzer/FuzzerTracePC.h | 8 | ||||
-rw-r--r-- | test/fuzzer/InitializeTest.cpp | 1 | ||||
-rw-r--r-- | test/sanitizer_common/TestCases/sanitizer_coverage_inline8bit_counter.cc | 17 |
4 files changed, 28 insertions, 15 deletions
diff --git a/lib/fuzzer/FuzzerTracePC.cpp b/lib/fuzzer/FuzzerTracePC.cpp index 6513b4f64..2df850b2c 100644 --- a/lib/fuzzer/FuzzerTracePC.cpp +++ b/lib/fuzzer/FuzzerTracePC.cpp @@ -70,9 +70,9 @@ void TracePC::HandleInline8bitCountersInit(uint8_t *Start, uint8_t *Stop) { NumInline8bitCounters += Stop - Start; } -void TracePC::HandlePCsInit(const uint8_t *Start, const uint8_t *Stop) { - const uintptr_t *B = reinterpret_cast<const uintptr_t *>(Start); - const uintptr_t *E = reinterpret_cast<const uintptr_t *>(Stop); +void TracePC::HandlePCsInit(const uintptr_t *Start, const uintptr_t *Stop) { + const PCTableEntry *B = reinterpret_cast<const PCTableEntry *>(Start); + const PCTableEntry *E = reinterpret_cast<const PCTableEntry *>(Stop); if (NumPCTables && ModulePCTable[NumPCTables - 1].Start == B) return; assert(NumPCTables < sizeof(ModulePCTable) / sizeof(ModulePCTable[0])); ModulePCTable[NumPCTables++] = {B, E}; @@ -157,7 +157,7 @@ void TracePC::UpdateObservedPCs() { (size_t)(ModulePCTable[i].Stop - ModulePCTable[i].Start)); for (size_t j = 0; j < Size; j++) if (Beg[j]) - Observe(ModulePCTable[i].Start[j]); + Observe(ModulePCTable[i].Start[j].PC); } } else if (NumGuards == NumPCsInPCTables) { size_t GuardIdx = 1; @@ -168,7 +168,7 @@ void TracePC::UpdateObservedPCs() { (size_t)(ModulePCTable[i].Stop - ModulePCTable[i].Start)); for (size_t j = 0; j < Size; j++, GuardIdx++) if (Counters()[GuardIdx]) - Observe(ModulePCTable[i].Start[j]); + Observe(ModulePCTable[i].Start[j].PC); } } } @@ -240,9 +240,9 @@ void TracePC::PrintCoverage() { for (size_t i = 0; i < NumPCTables; i++) { auto &M = ModulePCTable[i]; assert(M.Start < M.Stop); - auto ModuleName = GetModuleName(*M.Start); + auto ModuleName = GetModuleName(M.Start->PC); for (auto Ptr = M.Start; Ptr < M.Stop; Ptr++) { - auto PC = *Ptr; + auto PC = Ptr->PC; auto VisualizePC = GetNextInstructionPc(PC); bool IsObserved = ObservedPCs.count(PC); std::string FileStr = DescribePC("%s", VisualizePC); @@ -388,7 +388,8 @@ void __sanitizer_cov_8bit_counters_init(uint8_t *Start, uint8_t *Stop) { } ATTRIBUTE_INTERFACE -void __sanitizer_cov_pcs_init(const uint8_t *pcs_beg, const uint8_t *pcs_end) { +void __sanitizer_cov_pcs_init(const uintptr_t *pcs_beg, + const uintptr_t *pcs_end) { fuzzer::TPC.HandlePCsInit(pcs_beg, pcs_end); } diff --git a/lib/fuzzer/FuzzerTracePC.h b/lib/fuzzer/FuzzerTracePC.h index 56f1820f7..0c9d4b69b 100644 --- a/lib/fuzzer/FuzzerTracePC.h +++ b/lib/fuzzer/FuzzerTracePC.h @@ -75,7 +75,7 @@ class TracePC { void HandleInit(uint32_t *Start, uint32_t *Stop); void HandleInline8bitCountersInit(uint8_t *Start, uint8_t *Stop); - void HandlePCsInit(const uint8_t *Start, const uint8_t *Stop); + void HandlePCsInit(const uintptr_t *Start, const uintptr_t *Stop); void HandleCallerCallee(uintptr_t Caller, uintptr_t Callee); template <class T> void HandleCmp(uintptr_t PC, T Arg1, T Arg2); size_t GetTotalPCCoverage(); @@ -146,7 +146,11 @@ private: size_t NumModulesWithInline8bitCounters; // linker-initialized. size_t NumInline8bitCounters; - struct { const uintptr_t *Start, *Stop; } ModulePCTable[4096]; + struct PCTableEntry { + uintptr_t PC, PCFlags; + }; + + struct { const PCTableEntry *Start, *Stop; } ModulePCTable[4096]; size_t NumPCTables; size_t NumPCsInPCTables; diff --git a/test/fuzzer/InitializeTest.cpp b/test/fuzzer/InitializeTest.cpp index d640a8d10..a93c2a525 100644 --- a/test/fuzzer/InitializeTest.cpp +++ b/test/fuzzer/InitializeTest.cpp @@ -19,6 +19,7 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { } extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + assert(argv0); if (Size == strlen(argv0) && !memmem(Data, Size, argv0, Size)) { fprintf(stderr, "BINGO %s\n", argv0); diff --git a/test/sanitizer_common/TestCases/sanitizer_coverage_inline8bit_counter.cc b/test/sanitizer_common/TestCases/sanitizer_coverage_inline8bit_counter.cc index c071ba669..58a64d1a9 100644 --- a/test/sanitizer_common/TestCases/sanitizer_coverage_inline8bit_counter.cc +++ b/test/sanitizer_common/TestCases/sanitizer_coverage_inline8bit_counter.cc @@ -3,7 +3,9 @@ // REQUIRES: has_sancovcc,stable-runtime // UNSUPPORTED: i386-darwin // -// RUN: %clangxx -O0 %s -fsanitize-coverage=inline-8bit-counters,pc-table 2>&1 +// RUN: %clangxx -O0 %s -fsanitize-coverage=inline-8bit-counters,pc-table -o %t +// RUN: %run %t 2>&1 | FileCheck %s +// XFAIL: tsan #include <stdio.h> #include <stdint.h> @@ -19,13 +21,15 @@ void __sanitizer_cov_8bit_counters_init(const char *start, const char *end) { } uintptr_t FirstPC; +uintptr_t FirstPCFlag; -extern "C" void __sanitizer_cov_pcs_init(const uint8_t *pcs_beg, - const uint8_t *pcs_end) { +extern "C" void __sanitizer_cov_pcs_init(const uintptr_t *pcs_beg, + const uintptr_t *pcs_end) { const uintptr_t *B = (const uintptr_t *)pcs_beg; const uintptr_t *E = (const uintptr_t *)pcs_end; - assert(B < E); - FirstPC = *B; + assert(B + 1 < E); + FirstPC = B[0]; + FirstPCFlag = B[1]; } @@ -33,4 +37,7 @@ int main() { assert(first_counter); assert(*first_counter == 1); assert(FirstPC == (uintptr_t)&main); + assert(FirstPCFlag == 1); + fprintf(stderr, "PASS\n"); + // CHECK: PASS } |