|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | // Simple test for a fuzzer. | 
|  | // Try to find the target using the indirect caller-callee pairs. | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <cstdlib> | 
|  | #include <cstring> | 
|  | #include <iostream> | 
|  |  | 
|  | typedef void (*F)(); | 
|  | static F t[256]; | 
|  |  | 
|  | void f34() { | 
|  | std::cerr << "BINGO\n"; | 
|  | exit(1); | 
|  | } | 
|  | void f23() { t[(unsigned)'d'] = f34;} | 
|  | void f12() { t[(unsigned)'c'] = f23;} | 
|  | void f01() { t[(unsigned)'b'] = f12;} | 
|  | void f00() {} | 
|  |  | 
|  | static F t0[256] = { | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, f00, | 
|  | }; | 
|  |  | 
|  | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { | 
|  | if (Size < 4) return 0; | 
|  | // Spoof the counters. | 
|  | for (int i = 0; i < 200; i++) { | 
|  | f23(); | 
|  | f12(); | 
|  | f01(); | 
|  | } | 
|  | memcpy(t, t0, sizeof(t)); | 
|  | t[(unsigned)'a'] = f01; | 
|  | t[Data[0]](); | 
|  | t[Data[1]](); | 
|  | t[Data[2]](); | 
|  | t[Data[3]](); | 
|  | return 0; | 
|  | } | 
|  |  |