1*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
3*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
42eef816eSKostya Serebryany
52eef816eSKostya Serebryany // Simple test for a fuzzer. The fuzzer must find the string "Hi!".
62eef816eSKostya Serebryany #include <cstddef>
72eef816eSKostya Serebryany #include <cstdint>
82eef816eSKostya Serebryany #include <cstdlib>
92eef816eSKostya Serebryany #include <iostream>
102eef816eSKostya Serebryany
112eef816eSKostya Serebryany extern "C" {
122eef816eSKostya Serebryany __attribute__((noinline))
FunctionC(const uint8_t * Data,size_t Size)132eef816eSKostya Serebryany void FunctionC(const uint8_t *Data, size_t Size) {
142eef816eSKostya Serebryany if (Size > 3 && Data[3] == 'Z') {
152eef816eSKostya Serebryany static bool PrintedOnce = false;
162eef816eSKostya Serebryany if (!PrintedOnce) {
172eef816eSKostya Serebryany std::cout << "BINGO\n";
182eef816eSKostya Serebryany PrintedOnce = true;
192eef816eSKostya Serebryany }
202eef816eSKostya Serebryany }
212eef816eSKostya Serebryany }
222eef816eSKostya Serebryany
232eef816eSKostya Serebryany __attribute__((noinline))
FunctionB(const uint8_t * Data,size_t Size)242eef816eSKostya Serebryany void FunctionB(const uint8_t *Data, size_t Size) {
252eef816eSKostya Serebryany if (Size > 2 && Data[2] == 'Z')
262eef816eSKostya Serebryany FunctionC(Data, Size);
272eef816eSKostya Serebryany }
282eef816eSKostya Serebryany __attribute__((noinline))
FunctionA(const uint8_t * Data,size_t Size)292eef816eSKostya Serebryany void FunctionA(const uint8_t *Data, size_t Size) {
302eef816eSKostya Serebryany if (Size > 1 && Data[1] == 'U')
312eef816eSKostya Serebryany FunctionB(Data, Size);
322eef816eSKostya Serebryany }
332eef816eSKostya Serebryany }
342eef816eSKostya Serebryany
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)352eef816eSKostya Serebryany extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
362eef816eSKostya Serebryany if (Size > 0 && Data[0] == 'F')
372eef816eSKostya Serebryany FunctionA(Data, Size);
382eef816eSKostya Serebryany return 0;
392eef816eSKostya Serebryany }
402eef816eSKostya Serebryany
41