summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/test/TableLookupTest.cpp
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2017-03-23 22:43:12 +0000
committerKostya Serebryany <kcc@google.com>2017-03-23 22:43:12 +0000
commit6ca44f91617d2d6f6d1dd0bb371f275a6a1d1bc6 (patch)
tree2e4011ad506595a2e0513413af63ee10fdadd52d /llvm/lib/Fuzzer/test/TableLookupTest.cpp
parent2705226a2b8225ef1b7297848390b67f44629471 (diff)
downloadbcm5719-llvm-6ca44f91617d2d6f6d1dd0bb371f275a6a1d1bc6.tar.gz
bcm5719-llvm-6ca44f91617d2d6f6d1dd0bb371f275a6a1d1bc6.zip
[libFuzzer] create experimental support for user-provided coverage signal
llvm-svn: 298654
Diffstat (limited to 'llvm/lib/Fuzzer/test/TableLookupTest.cpp')
-rw-r--r--llvm/lib/Fuzzer/test/TableLookupTest.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/test/TableLookupTest.cpp b/llvm/lib/Fuzzer/test/TableLookupTest.cpp
new file mode 100644
index 00000000000..165afdb391f
--- /dev/null
+++ b/llvm/lib/Fuzzer/test/TableLookupTest.cpp
@@ -0,0 +1,43 @@
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+
+// Make sure the fuzzer eventually finds all possible values of a variable
+// within a range.
+#include <cstring>
+#include <cstdint>
+#include <cstdio>
+#include <cstdlib>
+#include <cassert>
+#include <set>
+
+const size_t N = 1 << 12;
+
+// Define an array of counters that will be understood by libFuzzer
+// as extra coverage signal. The array must be:
+// * uint8_t
+// * aligned by 64
+// * in the section named __libfuzzer_extra_counters.
+// The target code may declare more than one such array.
+//
+// Use either `Counters[Idx] = 1` or `Counters[Idx]++;`
+// depending on whether multiple occurrences of the event 'Idx'
+// is important to distinguish from one occurrence.
+alignas(64) __attribute__((section("__libfuzzer_extra_counters")))
+static uint8_t Counters[N];
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+ static std::set<uint16_t> SeenIdx;
+ if (Size != 4) return 0;
+ uint32_t Idx;
+ memcpy(&Idx, Data, 4);
+ Idx %= N;
+ assert(Counters[Idx] == 0); // libFuzzer should reset these between the runs.
+ // Or Counters[Idx]=1 if we don't care how many times this happened.
+ Counters[Idx]++;
+ SeenIdx.insert(Idx);
+ if (SeenIdx.size() == N) {
+ fprintf(stderr, "BINGO: found all values\n");
+ abort();
+ }
+ return 0;
+}
OpenPOWER on IntegriCloud