MCPcopy Create free account
hub / github.com/arximboldi/immer / LLVMFuzzerTestOneInput

Function LLVMFuzzerTestOneInput

extra/fuzzer/array-gc.cpp:24–110  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

22 false>;
23
24extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data,
25 std::size_t size)
26{
27 constexpr auto var_count = 4;
28
29 auto guard = immer::gc_disable_guard{};
30
31 using array_t = immer::array<int, gc_memory>;
32 using transient_t = typename array_t::transient_type;
33 using size_t = std::uint8_t;
34
35 auto vs = std::array<array_t, var_count>{};
36 auto ts = std::array<transient_t, var_count>{};
37
38 auto is_valid_var = [&](auto idx) { return idx >= 0 && idx < var_count; };
39 auto is_valid_index = [](auto& v) {
40 return [&](auto idx) { return idx >= 0 && idx < v.size(); };
41 };
42 auto is_valid_size = [](auto& v) {
43 return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
44 };
45 // limit doing immutable pushes on vectors that are too big already to
46 // prevent timeouts
47 auto too_big = [](auto&& v) { return v.size() > (std::size_t{1} << 10); };
48 return fuzzer_input{data, size}.run([&](auto& in) {
49 enum ops
50 {
51 op_transient,
52 op_persistent,
53 op_push_back,
54 op_update,
55 op_take,
56 op_push_back_mut,
57 op_update_mut,
58 op_take_mut,
59 };
60 auto dst = read<char>(in, is_valid_var);
61 switch (read<char>(in)) {
62 case op_transient: {
63 auto src = read<char>(in, is_valid_var);
64 ts[dst] = vs[src].transient();
65 break;
66 }
67 case op_persistent: {
68 auto src = read<char>(in, is_valid_var);
69 vs[dst] = ts[src].persistent();
70 break;
71 }
72 case op_push_back: {
73 auto src = read<char>(in, is_valid_var);
74 if (!too_big(vs[src]))
75 vs[dst] = vs[src].push_back(42);
76 break;
77 }
78 case op_update: {
79 auto src = read<char>(in, is_valid_var);
80 auto idx = read<size_t>(in, is_valid_index(vs[src]));
81 vs[dst] = vs[src].update(idx, [](auto x) { return x + 1; });

Callers

nothing calls this directly

Calls 7

sizeMethod · 0.45
runMethod · 0.45
transientMethod · 0.45
persistentMethod · 0.45
push_backMethod · 0.45
updateMethod · 0.45
takeMethod · 0.45

Tested by

no test coverage detected