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 410ab2aceSGeorge Karpenkov 510ab2aceSGeorge Karpenkov // Simple test for a fuzzer. The fuzzer must find repeated bytes. 610ab2aceSGeorge Karpenkov #include <assert.h> 710ab2aceSGeorge Karpenkov #include <cstddef> 810ab2aceSGeorge Karpenkov #include <cstdint> 910ab2aceSGeorge Karpenkov #include <cstdlib> 1010ab2aceSGeorge Karpenkov #include <iostream> 1110ab2aceSGeorge Karpenkov #include <ostream> 1210ab2aceSGeorge Karpenkov LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)1310ab2aceSGeorge Karpenkovextern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { 1410ab2aceSGeorge Karpenkov assert(Data); 1510ab2aceSGeorge Karpenkov // Looking for AAAAAAAAAAAAAAAAAAAAAA or some such. 1610ab2aceSGeorge Karpenkov size_t CurA = 0, MaxA = 0; 1710ab2aceSGeorge Karpenkov for (size_t i = 0; i < Size; i++) { 1810ab2aceSGeorge Karpenkov // Make sure there are no conditionals in the loop so that 1910ab2aceSGeorge Karpenkov // coverage can't help the fuzzer. 2010ab2aceSGeorge Karpenkov int EQ = Data[i] == 'A'; 2110ab2aceSGeorge Karpenkov CurA = EQ * (CurA + 1); 2210ab2aceSGeorge Karpenkov int GT = CurA > MaxA; 2310ab2aceSGeorge Karpenkov MaxA = GT * CurA + (!GT) * MaxA; 2410ab2aceSGeorge Karpenkov } 2510ab2aceSGeorge Karpenkov if (MaxA >= 20) { 2610ab2aceSGeorge Karpenkov std::cout << "BINGO; Found the target (Max: " << MaxA << "), exiting\n" 2710ab2aceSGeorge Karpenkov << std::flush; 2810ab2aceSGeorge Karpenkov exit(0); 2910ab2aceSGeorge Karpenkov } 3010ab2aceSGeorge Karpenkov return 0; 3110ab2aceSGeorge Karpenkov } 3210ab2aceSGeorge Karpenkov 33