blob: b47a63e1d04652e241ee51a49a5b58c733286389 [file] [log] [blame]
George Karpenkov10ab2ac2017-08-21 23:25:50 +00001// This file is distributed under the University of Illinois Open Source
2// License. See LICENSE.TXT for details.
3
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +00004// Simple test for a cutom crossover.
George Karpenkov10ab2ac2017-08-21 23:25:50 +00005#include <assert.h>
6#include <cstddef>
7#include <cstdint>
8#include <cstdlib>
9#include <iostream>
10#include <ostream>
11#include <random>
12#include <string.h>
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000013#include <functional>
George Karpenkov10ab2ac2017-08-21 23:25:50 +000014
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000015static const char *Separator = "-########-";
16static const char *Target = "A-########-B";
George Karpenkov10ab2ac2017-08-21 23:25:50 +000017
18extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
19 assert(Data);
20 std::string Str(reinterpret_cast<const char *>(Data), Size);
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000021 static const size_t TargetHash = std::hash<std::string>{}(std::string(Target));
22 size_t StrHash = std::hash<std::string>{}(Str);
George Karpenkov10ab2ac2017-08-21 23:25:50 +000023
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000024 if (TargetHash == StrHash) {
George Karpenkov10ab2ac2017-08-21 23:25:50 +000025 std::cout << "BINGO; Found the target, exiting\n" << std::flush;
26 exit(1);
27 }
28 return 0;
29}
30
31extern "C" size_t LLVMFuzzerCustomCrossOver(const uint8_t *Data1, size_t Size1,
32 const uint8_t *Data2, size_t Size2,
33 uint8_t *Out, size_t MaxOutSize,
34 unsigned int Seed) {
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000035 static size_t Printed;
George Karpenkov10ab2ac2017-08-21 23:25:50 +000036 static size_t SeparatorLen = strlen(Separator);
37
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000038 if (Printed++ < 32)
39 std::cerr << "In LLVMFuzzerCustomCrossover " << Size1 << " " << Size2 << "\n";
George Karpenkov10ab2ac2017-08-21 23:25:50 +000040
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000041 size_t Size = Size1 + Size2 + SeparatorLen;
George Karpenkov10ab2ac2017-08-21 23:25:50 +000042
43 if (Size > MaxOutSize)
44 return 0;
45
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000046 memcpy(Out, Data1, Size1);
47 memcpy(Out + Size1, Separator, SeparatorLen);
48 memcpy(Out + Size1 + SeparatorLen, Data2, Size2);
George Karpenkov10ab2ac2017-08-21 23:25:50 +000049
Kostya Serebryanyd0386fa2017-09-07 02:04:06 +000050 return Size;
George Karpenkov10ab2ac2017-08-21 23:25:50 +000051}