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

Function LLVMFuzzerTestOneInput

extra/fuzzer/array.cpp:15–84  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

13#include <array>
14
15extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data,
16 std::size_t size)
17{
18 constexpr auto var_count = 4;
19
20 using array_t = immer::array<int, immer::default_memory_policy>;
21 using size_t = std::uint8_t;
22
23 auto vars = std::array<array_t, var_count>{};
24
25 auto is_valid_var = [&](auto idx) { return idx >= 0 && idx < var_count; };
26 auto is_valid_index = [](auto& v) {
27 return [&](auto idx) { return idx >= 0 && idx < v.size(); };
28 };
29 auto is_valid_size = [](auto& v) {
30 return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
31 };
32 // limit doing immutable pushes on vectors that are too big already to
33 // prevent timeouts
34 auto too_big = [](auto&& v) { return v.size() > (std::size_t{1} << 10); };
35 return fuzzer_input{data, size}.run([&](auto& in) {
36 enum ops
37 {
38 op_push_back,
39 op_update,
40 op_take,
41 op_push_back_move,
42 op_update_move,
43 op_take_move,
44 };
45 auto src = read<char>(in, is_valid_var);
46 auto dst = read<char>(in, is_valid_var);
47 switch (read<char>(in)) {
48 case op_push_back: {
49 if (!too_big(vars[src]))
50 vars[dst] = vars[src].push_back(42);
51 break;
52 }
53 case op_update: {
54 auto idx = read<size_t>(in, is_valid_index(vars[src]));
55 vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
56 break;
57 }
58 case op_take: {
59 auto idx = read<size_t>(in, is_valid_size(vars[src]));
60 vars[dst] = vars[src].take(idx);
61 break;
62 }
63 case op_push_back_move: {
64 if (!too_big(vars[src]))
65 vars[dst] = std::move(vars[src]).push_back(12);
66 break;
67 }
68 case op_update_move: {
69 auto idx = read<size_t>(in, is_valid_index(vars[src]));
70 vars[dst] =
71 std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
72 break;

Callers

nothing calls this directly

Calls 5

sizeMethod · 0.45
runMethod · 0.45
push_backMethod · 0.45
updateMethod · 0.45
takeMethod · 0.45

Tested by

no test coverage detected