Coverage Report

Created: 2025-07-11 06:44

/src/immer/extra/fuzzer/vector.cpp
Line
Count
Source (jump to first uncovered line)
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
11
#include <immer/vector.hpp>
12
13
#include <array>
14
15
extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data,
16
                                      std::size_t size)
17
2.32k
{
18
2.32k
    constexpr auto var_count = 4;
19
2.32k
    constexpr auto bits      = 2;
20
21
2.32k
    using vector_t =
22
2.32k
        immer::vector<int, immer::default_memory_policy, bits, bits>;
23
2.32k
    using size_t = std::uint8_t;
24
25
2.32k
    auto vars = std::array<vector_t, var_count>{};
26
27
3.60M
    auto is_valid_var   = [&](auto idx) { return idx >= 0 && idx < var_count; };
28
23.6k
    auto is_valid_index = [](auto& v) {
29
37.2k
        return [&](auto idx) { return idx >= 0 && idx < v.size(); };
30
23.6k
    };
31
44.8k
    auto is_valid_size = [](auto& v) {
32
52.1k
        return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
33
44.8k
    };
34
35
1.74M
    return fuzzer_input{data, size}.run([&](auto& in) {
36
1.74M
        enum ops
37
1.74M
        {
38
1.74M
            op_push_back,
39
1.74M
            op_update,
40
1.74M
            op_take,
41
1.74M
            op_push_back_move,
42
1.74M
            op_update_move,
43
1.74M
            op_take_move,
44
1.74M
        };
45
1.74M
        auto src = read<char>(in, is_valid_var);
46
1.74M
        auto dst = read<char>(in, is_valid_var);
47
1.74M
        switch (read<char>(in)) {
48
1.27M
        case op_push_back: {
49
1.27M
            vars[dst] = vars[src].push_back(42);
50
1.27M
            break;
51
0
        }
52
18.3k
        case op_update: {
53
18.3k
            auto idx  = read<size_t>(in, is_valid_index(vars[src]));
54
18.3k
            vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
55
18.3k
            break;
56
0
        }
57
13.0k
        case op_take: {
58
13.0k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
59
13.0k
            vars[dst] = vars[src].take(idx);
60
13.0k
            break;
61
0
        }
62
391k
        case op_push_back_move: {
63
391k
            vars[dst] = std::move(vars[src]).push_back(12);
64
391k
            break;
65
0
        }
66
5.34k
        case op_update_move: {
67
5.34k
            auto idx = read<size_t>(in, is_valid_index(vars[src]));
68
5.34k
            vars[dst] =
69
5.34k
                std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
70
5.34k
            break;
71
0
        }
72
31.8k
        case op_take_move: {
73
31.8k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
74
31.8k
            vars[dst] = std::move(vars[src]).take(idx);
75
31.8k
            break;
76
0
        }
77
6.96k
        default:
78
6.96k
            break;
79
1.74M
        };
80
1.74M
        return true;
81
1.74M
    });
82
2.32k
}