Coverage Report

Created: 2023-06-07 06:37

/src/immer/extra/fuzzer/fuzzer_input.hpp
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
#pragma once
10
11
#include <cstdint>
12
#include <memory>
13
#include <stdexcept>
14
15
#if defined(__GNUC__) && (__GNUC__ == 9 || __GNUC__ == 8 || __GNUC__ == 10)
16
#define IMMER_DISABLE_FUZZER_DUE_TO_GCC_BUG 1
17
#endif
18
19
struct no_more_input : std::exception
20
{};
21
22
constexpr auto fuzzer_input_max_size = 1 << 16;
23
24
struct fuzzer_input
25
{
26
    const std::uint8_t* data_;
27
    std::size_t size_;
28
29
    const std::uint8_t* next(std::size_t size)
30
8.66M
    {
31
8.66M
        if (size_ < size)
32
0
            throw no_more_input{};
33
8.66M
        auto r = data_;
34
8.66M
        data_ += size;
35
8.66M
        size_ -= size;
36
8.66M
        return r;
37
8.66M
    }
38
39
    const std::uint8_t* next(std::size_t size, std::size_t align)
40
8.67M
    {
41
8.67M
        auto& p = const_cast<void*&>(reinterpret_cast<const void*&>(data_));
42
8.67M
        auto r  = std::align(align, size, p, size_);
43
8.67M
        if (r == nullptr)
44
8.57k
            throw no_more_input{};
45
8.66M
        return next(size);
46
8.67M
    }
47
48
    template <typename Fn>
49
    int run(Fn step)
50
8.58k
    {
51
8.58k
        if (size_ > fuzzer_input_max_size)
52
8
            return 0;
53
8.57k
        try {
54
2.76M
            while (step(*this))
55
2.76M
                continue;
56
8.57k
        } catch (const no_more_input&) {};
57
8.57k
        return 0;
58
8.57k
    }
59
};
60
61
template <typename T>
62
const T& read(fuzzer_input& fz)
63
8.67M
{
64
8.67M
    return *reinterpret_cast<const T*>(fz.next(sizeof(T), alignof(T)));
65
8.67M
}
char const& read<char>(fuzzer_input&)
Line
Count
Source
63
8.53M
{
64
8.53M
    return *reinterpret_cast<const T*>(fz.next(sizeof(T), alignof(T)));
65
8.53M
}
unsigned char const& read<unsigned char>(fuzzer_input&)
Line
Count
Source
63
139k
{
64
139k
    return *reinterpret_cast<const T*>(fz.next(sizeof(T), alignof(T)));
65
139k
}
66
67
template <typename T, typename Cond>
68
T read(fuzzer_input& fz, Cond cond)
69
5.55M
{
70
5.55M
    auto x = read<T>(fz);
71
5.91M
    while (!cond(x))
72
361k
        x = read<T>(fz);
73
5.55M
    return x;
74
5.55M
}
flex-vector-gc.cpp:char read<char, LLVMFuzzerTestOneInput::$_0>(fuzzer_input&, LLVMFuzzerTestOneInput::$_0)
Line
Count
Source
69
3.12M
{
70
3.12M
    auto x = read<T>(fz);
71
3.39M
    while (!cond(x))
72
263k
        x = read<T>(fz);
73
3.12M
    return x;
74
3.12M
}
flex-vector-gc.cpp:unsigned char read<unsigned char, LLVMFuzzerTestOneInput::$_2::operator()<immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1}>(fuzzer_input&, LLVMFuzzerTestOneInput::$_2::operator()<immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1})
Line
Count
Source
69
8.05k
{
70
8.05k
    auto x = read<T>(fz);
71
9.09k
    while (!cond(x))
72
1.04k
        x = read<T>(fz);
73
8.05k
    return x;
74
8.05k
}
flex-vector-gc.cpp:unsigned char read<unsigned char, LLVMFuzzerTestOneInput::$_3::operator()<immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1}>(fuzzer_input&, LLVMFuzzerTestOneInput::$_3::operator()<immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1})
Line
Count
Source
69
38.7k
{
70
38.7k
    auto x = read<T>(fz);
71
42.1k
    while (!cond(x))
72
3.39k
        x = read<T>(fz);
73
38.7k
    return x;
74
38.7k
}
flex-vector-gc.cpp:unsigned char read<unsigned char, LLVMFuzzerTestOneInput::$_2::operator()<immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1}>(fuzzer_input&, LLVMFuzzerTestOneInput::$_2::operator()<immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1})
Line
Count
Source
69
10.1k
{
70
10.1k
    auto x = read<T>(fz);
71
45.7k
    while (!cond(x))
72
35.5k
        x = read<T>(fz);
73
10.1k
    return x;
74
10.1k
}
flex-vector-gc.cpp:unsigned char read<unsigned char, LLVMFuzzerTestOneInput::$_3::operator()<immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1}>(fuzzer_input&, LLVMFuzzerTestOneInput::$_3::operator()<immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u> >(immer::flex_vector_transient<int, immer::memory_policy<immer::heap_policy<immer::gc_heap>, immer::no_refcount_policy, immer::spinlock_policy, immer::gc_transience_policy, false, false>, 2u, 2u>&) const::{lambda(auto:1)#1})
Line
Count
Source
69
39.3k
{
70
39.3k
    auto x = read<T>(fz);
71
42.5k
    while (!cond(x))
72
3.13k
        x = read<T>(fz);
73
39.3k
    return x;
74
39.3k
}
flex-vector-gc.cpp:char read<char, LLVMFuzzerTestOneInput::$_1::operator()<char>(char) const::{lambda(auto:1)#1}>(fuzzer_input&, LLVMFuzzerTestOneInput::$_1::operator()<char>(char) const::{lambda(auto:1)#1})
Line
Count
Source
69
2.32M
{
70
2.32M
    auto x = read<T>(fz);
71
2.38M
    while (!cond(x))
72
55.2k
        x = read<T>(fz);
73
2.32M
    return x;
74
2.32M
}