LLVM  4.0.0
SwitchTest.cpp
Go to the documentation of this file.
1 // This file is distributed under the University of Illinois Open Source
2 // License. See LICENSE.TXT for details.
3 
4 // Simple test for a fuzzer. The fuzzer must find the interesting switch value.
5 #include <cstdint>
6 #include <cstdlib>
7 #include <cstdio>
8 #include <cstring>
9 #include <cstddef>
10 
11 static volatile int Sink;
12 
13 template<class T>
14 bool Switch(const uint8_t *Data, size_t Size) {
15  T X;
16  if (Size < sizeof(X)) return false;
17  memcpy(&X, Data, sizeof(X));
18  switch (X) {
19  case 1: Sink = __LINE__; break;
20  case 101: Sink = __LINE__; break;
21  case 1001: Sink = __LINE__; break;
22  case 10001: Sink = __LINE__; break;
23  case 100001: Sink = __LINE__; break;
24  case 1000001: Sink = __LINE__; break;
25  case 10000001: Sink = __LINE__; break;
26  case 100000001: return true;
27  }
28  return false;
29 }
30 
31 bool ShortSwitch(const uint8_t *Data, size_t Size) {
32  short X;
33  if (Size < sizeof(short)) return false;
34  memcpy(&X, Data, sizeof(short));
35  switch(X) {
36  case 42: Sink = __LINE__; break;
37  case 402: Sink = __LINE__; break;
38  case 4002: Sink = __LINE__; break;
39  case 5002: Sink = __LINE__; break;
40  case 7002: Sink = __LINE__; break;
41  case 9002: Sink = __LINE__; break;
42  case 14002: Sink = __LINE__; break;
43  case 21402: return true;
44  }
45  return false;
46 }
47 
48 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
49  if (Size >= 4 && Switch<int>(Data, Size) &&
50  Size >= 12 && Switch<uint64_t>(Data + 4, Size - 4) &&
51  Size >= 14 && ShortSwitch(Data + 12, 2)
52  ) {
53  fprintf(stderr, "BINGO; Found the target, exiting\n");
54  exit(1);
55  }
56  return 0;
57 }
58 
static volatile int Sink
Definition: SwitchTest.cpp:11
bool Switch(const uint8_t *Data, size_t Size)
Definition: SwitchTest.cpp:14
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
bool ShortSwitch(const uint8_t *Data, size_t Size)
Definition: SwitchTest.cpp:31
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
Definition: SwitchTest.cpp:48