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 // Threaded test for a fuzzer. The fuzzer should not crash.
610ab2aceSGeorge Karpenkov #include <assert.h>
710ab2aceSGeorge Karpenkov #include <cstddef>
810ab2aceSGeorge Karpenkov #include <cstdint>
910ab2aceSGeorge Karpenkov #include <cstring>
1010ab2aceSGeorge Karpenkov #include <thread>
1110ab2aceSGeorge Karpenkov 
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)1210ab2aceSGeorge Karpenkov extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
1310ab2aceSGeorge Karpenkov   if (Size < 8) return 0;
1410ab2aceSGeorge Karpenkov   assert(Data);
1510ab2aceSGeorge Karpenkov   auto C = [&] {
1610ab2aceSGeorge Karpenkov     size_t Res = 0;
1710ab2aceSGeorge Karpenkov     for (size_t i = 0; i < Size / 2; i++)
1810ab2aceSGeorge Karpenkov       Res += memcmp(Data, Data + Size / 2, 4);
1910ab2aceSGeorge Karpenkov     return Res;
2010ab2aceSGeorge Karpenkov   };
2110ab2aceSGeorge Karpenkov   std::thread T[] = {std::thread(C), std::thread(C), std::thread(C),
2210ab2aceSGeorge Karpenkov                      std::thread(C), std::thread(C), std::thread(C)};
2310ab2aceSGeorge Karpenkov   for (auto &X : T)
2410ab2aceSGeorge Karpenkov     X.join();
2510ab2aceSGeorge Karpenkov   return 0;
2610ab2aceSGeorge Karpenkov }
2710ab2aceSGeorge Karpenkov 
28