Coverage Report

Created: 2026-07-30 06:16

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
86.0k
{
18
86.0k
    constexpr auto var_count = 4;
19
86.0k
    constexpr auto bits      = 2;
20
21
86.0k
    using vector_t =
22
86.0k
        immer::vector<int, immer::default_memory_policy, bits, bits>;
23
86.0k
    using size_t = std::uint8_t;
24
25
86.0k
    auto vars = std::array<vector_t, var_count>{};
26
27
3.38M
    auto is_valid_var   = [&](auto idx) { return idx >= 0 && idx < var_count; };
28
86.0k
    auto is_valid_index = [](auto& v) {
29
35.3k
        return [&](auto idx) { return idx >= 0 && idx < v.size(); };
30
26.1k
    };
31
86.0k
    auto is_valid_size = [](auto& v) {
32
53.4k
        return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
33
45.0k
    };
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.18M
        case op_push_back: {
49
1.18M
            vars[dst] = vars[src].push_back(42);
50
1.18M
            break;
51
0
        }
52
20.2k
        case op_update: {
53
20.2k
            auto idx  = read<size_t>(in, is_valid_index(vars[src]));
54
20.2k
            vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
55
20.2k
            break;
56
0
        }
57
14.1k
        case op_take: {
58
14.1k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
59
14.1k
            vars[dst] = vars[src].take(idx);
60
14.1k
            break;
61
0
        }
62
389k
        case op_push_back_move: {
63
389k
            vars[dst] = std::move(vars[src]).push_back(12);
64
389k
            break;
65
0
        }
66
5.89k
        case op_update_move: {
67
5.89k
            auto idx = read<size_t>(in, is_valid_index(vars[src]));
68
5.89k
            vars[dst] =
69
5.89k
                std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
70
5.89k
            break;
71
0
        }
72
30.9k
        case op_take_move: {
73
30.9k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
74
30.9k
            vars[dst] = std::move(vars[src]).take(idx);
75
30.9k
            break;
76
0
        }
77
6.50k
        default:
78
6.50k
            break;
79
1.65M
        };
80
1.65M
        return true;
81
1.65M
    });
82
86.0k
}