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
11static volatile int Sink;
12
13template<class T>
14bool 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
31bool 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
48extern "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
59