Coverage Report

Created: 2026-06-09 06:07

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
85.2k
{
18
85.2k
    constexpr auto var_count = 4;
19
85.2k
    constexpr auto bits      = 2;
20
21
85.2k
    using vector_t =
22
85.2k
        immer::vector<int, immer::default_memory_policy, bits, bits>;
23
85.2k
    using size_t = std::uint8_t;
24
25
85.2k
    auto vars = std::array<vector_t, var_count>{};
26
27
3.42M
    auto is_valid_var   = [&](auto idx) { return idx >= 0 && idx < var_count; };
28
85.2k
    auto is_valid_index = [](auto& v) {
29
35.9k
        return [&](auto idx) { return idx >= 0 && idx < v.size(); };
30
27.7k
    };
31
85.2k
    auto is_valid_size = [](auto& v) {
32
49.0k
        return [&](auto idx) { return idx >= 0 && idx <= v.size(); };
33
40.8k
    };
34
35
1.67M
    return fuzzer_input{data, size}.run([&](auto& in) {
36
1.67M
        enum ops
37
1.67M
        {
38
1.67M
            op_push_back,
39
1.67M
            op_update,
40
1.67M
            op_take,
41
1.67M
            op_push_back_move,
42
1.67M
            op_update_move,
43
1.67M
            op_take_move,
44
1.67M
        };
45
1.67M
        auto src = read<char>(in, is_valid_var);
46
1.67M
        auto dst = read<char>(in, is_valid_var);
47
1.67M
        switch (read<char>(in)) {
48
1.22M
        case op_push_back: {
49
1.22M
            vars[dst] = vars[src].push_back(42);
50
1.22M
            break;
51
0
        }
52
20.0k
        case op_update: {
53
20.0k
            auto idx  = read<size_t>(in, is_valid_index(vars[src]));
54
20.0k
            vars[dst] = vars[src].update(idx, [](auto x) { return x + 1; });
55
20.0k
            break;
56
0
        }
57
13.1k
        case op_take: {
58
13.1k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
59
13.1k
            vars[dst] = vars[src].take(idx);
60
13.1k
            break;
61
0
        }
62
369k
        case op_push_back_move: {
63
369k
            vars[dst] = std::move(vars[src]).push_back(12);
64
369k
            break;
65
0
        }
66
7.73k
        case op_update_move: {
67
7.73k
            auto idx = read<size_t>(in, is_valid_index(vars[src]));
68
7.73k
            vars[dst] =
69
7.73k
                std::move(vars[src]).update(idx, [](auto x) { return x + 1; });
70
7.73k
            break;
71
0
        }
72
27.7k
        case op_take_move: {
73
27.7k
            auto idx  = read<size_t>(in, is_valid_size(vars[src]));
74
27.7k
            vars[dst] = std::move(vars[src]).take(idx);
75
27.7k
            break;
76
0
        }
77
6.52k
        default:
78
6.52k
            break;
79
1.67M
        };
80
1.67M
        return true;
81
1.67M
    });
82
85.2k
}