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/map.hpp>
11#include <iostream>
12#include <array>
13
14extern "C"
15int LLVMFuzzerTestOneInput(const std::uint8_t* data, std::size_t size)
16{
17 constexpr auto var_count = 4;
18
19 using map_t = immer::map<char, int>;
20
21 auto vars = std::array<map_t, var_count>{};
22
23 auto is_valid_var = [&] (auto idx) {
24 return idx >= 0 && idx < var_count;
25 };
26
27 return fuzzer_input{data, size}.run([&] (auto& in)
28 {
29 enum ops {
30 op_set,
31 op_erase,
32 op_set_move,
33 op_erase_move,
34 op_iterate,
35 op_find,
36 op_update
37 };
38 auto src = read<char>(in, is_valid_var);
39 auto dst = read<char>(in, is_valid_var);
40 switch (read<char>(in))
41 {
42 case op_set: {
43 auto value = read<size_t>(in);
44 vars[dst] = vars[src].set(value, 42);
45 break;
46 }
47 case op_erase: {
48 auto value = read<size_t>(in);
49 vars[dst] = vars[src].erase(value);
50 break;
51 }
52 case op_set_move: {
53 auto value = read<size_t>(in);
54 vars[dst] = std::move(vars[src]).set(value, 42);
55 break;
56 }
57 case op_erase_move: {
58 auto value = read<size_t>(in);
59 vars[dst] = std::move(vars[src]).erase(value);
60 break;
61 }
62 case op_iterate: {
63 auto srcv = vars[src];
64 for(const auto& v : srcv) {
65 vars[dst] = vars[dst].set(v.first, v.second);
66 }
67 break;
68 }
69 case op_find: {
70 auto value = read<size_t>(in);
71 auto res = vars[src].find(value);
72 if(res != nullptr) {
73 vars[dst] = vars[dst].set(*res, 42);
74 }
75 break;
76 }
77 case op_update: {
78 auto key = read<size_t>(in);
79 vars[dst] = vars[src].update(key, [](int x) { return x+1; });
80 break;
81 }
82 default:
83 break;
84 };
85 return true;
86 });
87}
88