Coverage Report

Created: 2026-01-09 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/immer/extra/fuzzer/vector.cpp
Line
Count
Source
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
87.6k
{
18
87.6k
    constexpr auto var_count = 4;
19
87.6k
    constexpr auto bits      = 2;
20
21
87.6k
    using vector_t =
22
87.6k
        immer::vector<int, immer::default_memory_policy, bits, bits>;
23
87.6k
    using size_t = std::uint8_t;
24
25
87.6k
    auto vars = std::array<vector_t, var_count>{};
26
27
3.39M
    auto is_valid_var   = [&](auto idx) { return idx >= 0 && idx < var_count; };
28
87.6k
    auto is_valid_index = [](auto& v) {
29
42.3k
        return [&](auto idx) { return idx >= 0 && idx < v.size(); };
30
28.5k
    };
31
87.6k
    auto is_valid_size = [](auto& v) {
32
53.0k
        return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
33
44.4k
    };
34
35
1.65M
    return fuzzer_input{data, size}.run([&](auto& in) {
36
1.65M
        enum ops
37
1.65M
        {
38
1.65M
            op_push_back,
39
1.65M
            op_update,
40
1.65M
            op_take,
41
1.65M
            op_push_back_move,
42
1.65M
            op_update_move,
43
1.65M
            op_take_move,
44
1.65M
        };
45
1.65M
        auto src = read<char>(in, is_valid_var);
46
1.65M
        auto dst = read<char>(in, is_valid_var);
47
1.65M
        switch (read<char>(in)) {
48
1.21M
        case op_push_back: {
49
1.21M
            vars[dst] = vars[src].push_back(42);
50
1.21M
            break;
51
0
        }
52
22.5k
        case op_update: {
53
22.5k
            auto idx  = read<size_t>(in, is_valid_index(vars[src]));
54
22.5k
            vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
55
22.5k
            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
360k
        case op_push_back_move: {
63
360k
            vars[dst] = std::move(vars[src]).push_back(12);
64
360k
            break;
65
0
        }
66
5.98k
        case op_update_move: {
67
5.98k
            auto idx = read<size_t>(in, is_valid_index(vars[src]));
68
5.98k
            vars[dst] =
69
5.98k
                std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
70
5.98k
            break;
71
0
        }
72
31.3k
        case op_take_move: {
73
31.3k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
74
31.3k
            vars[dst] = std::move(vars[src]).take(idx);
75
31.3k
            break;
76
0
        }
77
6.46k
        default:
78
6.46k
            break;
79
1.65M
        };
80
1.65M
        return true;
81
1.65M
    });
82
87.6k
}