Coverage Report

Created: 2025-10-27 06:55

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