1 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
2 | // See https://llvm.org/LICENSE.txt for license information. |
3 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
4 | |
5 | // Simple test for a fuzzer. The fuzzer must find the interesting switch value. |
6 | #include <cstddef> |
7 | #include <cstdint> |
8 | #include <cstdio> |
9 | #include <cstdlib> |
10 | #include <cstring> |
11 | |
12 | static volatile int Sink; |
13 | |
14 | template<class T> |
15 | bool Switch(const uint8_t *Data, size_t Size) { |
16 | T X; |
17 | if (Size < sizeof(X)) return false; |
18 | memcpy(&X, Data, sizeof(X)); |
19 | switch (X) { |
20 | case 1: Sink = __LINE__; break; |
21 | case 101: Sink = __LINE__; break; |
22 | case 1001: Sink = __LINE__; break; |
23 | case 10001: Sink = __LINE__; break; |
24 | case 100001: Sink = __LINE__; break; |
25 | case 1000001: Sink = __LINE__; break; |
26 | case 10000001: Sink = __LINE__; break; |
27 | case 100000001: return true; |
28 | } |
29 | return false; |
30 | } |
31 | |
32 | bool ShortSwitch(const uint8_t *Data, size_t Size) { |
33 | short X; |
34 | if (Size < sizeof(short)) return false; |
35 | memcpy(dest: &X, src: Data, n: sizeof(short)); |
36 | switch(X) { |
37 | case 42: Sink = __LINE__; break; |
38 | case 402: Sink = __LINE__; break; |
39 | case 4002: Sink = __LINE__; break; |
40 | case 5002: Sink = __LINE__; break; |
41 | case 7002: Sink = __LINE__; break; |
42 | case 9002: Sink = __LINE__; break; |
43 | case 14002: Sink = __LINE__; break; |
44 | case 21402: return true; |
45 | } |
46 | return false; |
47 | } |
48 | |
49 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
50 | if (Size >= 4 && Switch<int>(Data, Size) && |
51 | Size >= 12 && Switch<uint64_t>(Data: Data + 4, Size: Size - 4) && |
52 | Size >= 14 && ShortSwitch(Data: Data + 12, Size: 2) |
53 | ) { |
54 | fprintf(stderr, format: "BINGO; Found the target, exiting\n" ); |
55 | exit(status: 1); |
56 | } |
57 | return 0; |
58 | } |
59 | |
60 | |