1//
2// immer: immutable data structures for C++
3// Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente
4//
5// This software is distributed under the Boost Software License, Version 1.0.
6// See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt
7//
8
9#include "fuzzer_input.hpp"
10#include <immer/set.hpp>
11#include <immer/heap/gc_heap.hpp>
12#include <immer/refcount/no_refcount_policy.hpp>
13#include <iostream>
14#include <array>
15
16using gc_memory = immer::memory_policy<
17 immer::heap_policy<immer::gc_heap>,
18 immer::no_refcount_policy,
19 immer::gc_transience_policy,
20 false>;
21
22extern "C"
23int LLVMFuzzerTestOneInput(const std::uint8_t* data, std::size_t size)
24{
25 constexpr auto var_count = 4;
26
27 using set_t= immer::set<int, std::hash<char>, std::equal_to<char>, gc_memory>;
28
29 auto vars = std::array<set_t, var_count>{};
30
31 auto is_valid_var = [&] (auto idx) {
32 return idx >= 0 && idx < var_count;
33 };
34
35 return fuzzer_input{data, size}.run([&] (auto& in)
36 {
37 enum ops {
38 op_insert,
39 op_erase,
40 op_insert_move,
41 op_erase_move,
42 op_iterate
43 };
44 auto src = read<char>(in, is_valid_var);
45 auto dst = read<char>(in, is_valid_var);
46 switch (read<char>(in))
47 {
48 case op_insert: {
49 auto value = read<size_t>(in);
50 vars[dst] = vars[src].insert(value);
51 break;
52 }
53 case op_erase: {
54 auto value = read<size_t>(in);
55 vars[dst] = vars[src].erase(value);
56 break;
57 }
58 case op_insert_move: {
59 auto value = read<size_t>(in);
60 vars[dst] = std::move(vars[src]).insert(value);
61 break;
62 }
63 case op_erase_move: {
64 auto value = read<size_t>(in);
65 vars[dst] = vars[src].erase(value);
66 break;
67 }
68 case op_iterate: {
69 auto srcv = vars[src];
70 for(const auto &v : srcv) {
71 vars[dst] = vars[dst].insert(v);
72 }
73 break;
74 }
75 default:
76 break;
77 };
78 return true;
79 });
80}
81