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 // Test that libFuzzer does not crash when LLVMFuzzerMutate called from
610ab2aceSGeorge Karpenkov // LLVMFuzzerCustomCrossOver.
710ab2aceSGeorge Karpenkov #include <algorithm>
810ab2aceSGeorge Karpenkov #include <cstddef>
910ab2aceSGeorge Karpenkov #include <cstdint>
1010ab2aceSGeorge Karpenkov #include <cstdlib>
1110ab2aceSGeorge Karpenkov #include <string.h>
1210ab2aceSGeorge Karpenkov #include <string>
1310ab2aceSGeorge Karpenkov #include <vector>
1410ab2aceSGeorge Karpenkov
1510ab2aceSGeorge Karpenkov #include "FuzzerInterface.h"
1610ab2aceSGeorge Karpenkov
1710ab2aceSGeorge Karpenkov static volatile int sink;
1810ab2aceSGeorge Karpenkov
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)1910ab2aceSGeorge Karpenkov extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
2010ab2aceSGeorge Karpenkov std::string Str(reinterpret_cast<const char *>(Data), Size);
2110ab2aceSGeorge Karpenkov if (Size && Data[0] == '0')
2210ab2aceSGeorge Karpenkov sink++;
2310ab2aceSGeorge Karpenkov return 0;
2410ab2aceSGeorge Karpenkov }
2510ab2aceSGeorge Karpenkov
LLVMFuzzerCustomCrossOver(const uint8_t * Data1,size_t Size1,const uint8_t * Data2,size_t Size2,uint8_t * Out,size_t MaxOutSize,unsigned int Seed)2610ab2aceSGeorge Karpenkov extern "C" size_t LLVMFuzzerCustomCrossOver(const uint8_t *Data1, size_t Size1,
2710ab2aceSGeorge Karpenkov const uint8_t *Data2, size_t Size2,
2810ab2aceSGeorge Karpenkov uint8_t *Out, size_t MaxOutSize,
2910ab2aceSGeorge Karpenkov unsigned int Seed) {
3010ab2aceSGeorge Karpenkov std::vector<uint8_t> Buffer(MaxOutSize * 10);
3110ab2aceSGeorge Karpenkov LLVMFuzzerMutate(Buffer.data(), Buffer.size(), Buffer.size());
3210ab2aceSGeorge Karpenkov size_t Size = std::min(Size1, MaxOutSize);
3310ab2aceSGeorge Karpenkov memcpy(Out, Data1, Size);
3410ab2aceSGeorge Karpenkov return Size;
3510ab2aceSGeorge Karpenkov }
36