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 | // Find "FUZZME", the target has 3 different functions. |
6 | // |
7 | // This test, and the accompanying lit tests |
8 | // (dataflow.test, only-some-bytes.test) assume that the compiler |
9 | // instruments functions in their lexical order. |
10 | // This assumption is not guaranteed, but it is likely to hold. |
11 | // It allows to simplify the test quite a bit: in the lit tests |
12 | // LLVMFuzzerTestOneInput is "F0", Func1 is "F1", Func2 is "F2". |
13 | #include <assert.h> |
14 | #include <cstddef> |
15 | #include <cstdint> |
16 | #include <cstdlib> |
17 | #include <cstdio> |
18 | |
19 | extern "C" bool Func1(const uint8_t *Data, size_t Size); |
20 | extern "C" bool Func2(const uint8_t *Data, size_t Size); |
21 | |
22 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
23 | if (Size >= 5 |
24 | && Data[0] == 'F' |
25 | && Data[1] == 'U' |
26 | && Data[2] == 'Z' |
27 | && Data[3] == 'Z' |
28 | && Func1(Data, Size) |
29 | && Func2(Data, Size)) { |
30 | fprintf(stderr, format: "BINGO\n" ); |
31 | abort(); |
32 | } |
33 | return 0; |
34 | } |
35 | |
36 | extern "C" |
37 | __attribute__((noinline)) |
38 | bool Func1(const uint8_t *Data, size_t Size) { |
39 | // assumes Size >= 5, doesn't check it. |
40 | return Data[4] == 'M'; |
41 | } |
42 | |
43 | extern "C" |
44 | __attribute__((noinline)) |
45 | bool Func2(const uint8_t *Data, size_t Size) { |
46 | return Size >= 6 && Data[5] == 'E'; |
47 | } |
48 | |
49 | |
50 | |