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

Function LLVMFuzzerTestOneInput

extra/fuzzer/vector.cpp:15–82  ·  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 constexpr auto bits = 2;
20
21 using vector_t =
22 immer::vector<int, immer::default_memory_policy, bits, bits>;
23 using size_t = std::uint8_t;
24
25 auto vars = std::array<vector_t, var_count>{};
26
27 auto is_valid_var = [&](auto idx) { return idx >= 0 && idx < var_count; };
28 auto is_valid_index = [](auto& v) {
29 return [&](auto idx) { return idx >= 0 && idx < v.size(); };
30 };
31 auto is_valid_size = [](auto& v) {
32 return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
33 };
34
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 vars[dst] = vars[src].push_back(42);
50 break;
51 }
52 case op_update: {
53 auto idx = read<size_t>(in, is_valid_index(vars[src]));
54 vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
55 break;
56 }
57 case op_take: {
58 auto idx = read<size_t>(in, is_valid_size(vars[src]));
59 vars[dst] = vars[src].take(idx);
60 break;
61 }
62 case op_push_back_move: {
63 vars[dst] = std::move(vars[src]).push_back(12);
64 break;
65 }
66 case op_update_move: {
67 auto idx = read<size_t>(in, is_valid_index(vars[src]));
68 vars[dst] =
69 std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
70 break;
71 }
72 case op_take_move: {

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