Coverage Report

Created: 2024-11-21 06:52

/src/LAME-fuzzers/fuzzing-headers/include/fuzzing/datasource/datasource.hpp
Line
Count
Source (jump to first uncovered line)
1
#ifndef FUZZING_DATASOURCE_DATASOURCE_HPP
2
#define FUZZING_DATASOURCE_DATASOURCE_HPP
3
4
#include <fuzzing/exception.hpp>
5
#include <fuzzing/types.hpp>
6
#include <cstddef>
7
#include <cstdint>
8
#include <cstdlib>
9
#include <cstring>
10
#include <string>
11
#include <vector>
12
13
namespace fuzzing {
14
namespace datasource  {
15
16
class Base
17
{
18
    protected:
19
        virtual std::vector<uint8_t> get(const size_t min, const size_t max, const uint64_t id = 0) = 0;
20
    public:
21
7.31k
        Base(void) = default;
22
7.31k
        virtual ~Base(void) = default;
23
24
        template<class T> T Get(const uint64_t id = 0);
25
        uint16_t GetChoice(const uint64_t id = 0);
26
        std::vector<uint8_t> GetData(const uint64_t id, const size_t min = 0, const size_t max = 0);
27
        template <class T> std::vector<T> GetVector(const uint64_t id = 0);
28
29
        class OutOfData : public fuzzing::exception::FlowException {
30
            public:
31
3.22k
                OutOfData() = default;
32
        };
33
34
        class DeserializationFailure : public fuzzing::exception::FlowException {
35
            public:
36
                DeserializationFailure() = default;
37
        };
38
};
39
40
#ifndef FUZZING_HEADERS_NO_IMPL
41
template<class T> T Base::Get(const uint64_t id)
42
46.3k
{
43
46.3k
    T ret;
44
46.3k
    const auto v = get(sizeof(ret), sizeof(ret), id);
45
46.3k
    memcpy(&ret, v.data(), sizeof(ret));
46
46.3k
    return ret;
47
46.3k
}
Unexecuted instantiation: unsigned short fuzzing::datasource::Base::Get<unsigned short>(unsigned long)
unsigned int fuzzing::datasource::Base::Get<unsigned int>(unsigned long)
Line
Count
Source
42
22.1k
{
43
22.1k
    T ret;
44
22.1k
    const auto v = get(sizeof(ret), sizeof(ret), id);
45
22.1k
    memcpy(&ret, v.data(), sizeof(ret));
46
22.1k
    return ret;
47
22.1k
}
unsigned char fuzzing::datasource::Base::Get<unsigned char>(unsigned long)
Line
Count
Source
42
24.2k
{
43
24.2k
    T ret;
44
24.2k
    const auto v = get(sizeof(ret), sizeof(ret), id);
45
24.2k
    memcpy(&ret, v.data(), sizeof(ret));
46
24.2k
    return ret;
47
24.2k
}
48
49
template <> bool Base::Get<bool>(const uint64_t id)
50
559k
{
51
559k
    uint8_t ret;
52
559k
    const auto v = get(sizeof(ret), sizeof(ret), id);
53
559k
    memcpy(&ret, v.data(), sizeof(ret));
54
559k
    return (ret % 2) ? true : false;
55
559k
}
56
57
template <> std::string Base::Get<std::string>(const uint64_t id)
58
1.58k
{
59
1.58k
    auto data = GetData(id);
60
1.58k
    return std::string(data.data(), data.data() + data.size());
61
1.58k
}
62
63
template <> std::vector<std::string> Base::Get<std::vector<std::string>>(const uint64_t id)
64
0
{
65
0
    std::vector<std::string> ret;
66
0
    while ( true ) {
67
0
        auto data = GetData(id);
68
0
        ret.push_back( std::string(data.data(), data.data() + data.size()) );
69
0
        if ( Get<bool>(id) == false ) {
70
0
            break;
71
0
        }
72
0
    }
73
0
    return ret;
74
0
}
75
76
uint16_t Base::GetChoice(const uint64_t id)
77
0
{
78
0
    return Get<uint16_t>(id);
79
0
}
80
81
std::vector<uint8_t> Base::GetData(const uint64_t id, const size_t min, const size_t max)
82
427k
{
83
427k
    return get(min, max, id);
84
427k
}
85
86
87
0
template <> types::String<> Base::Get<types::String<>>(const uint64_t id) {
88
0
    const auto data = GetData(id);
89
0
    types::String<> ret(data.data(), data.size());
90
0
    return ret;
91
0
}
92
93
0
template <> types::Data<> Base::Get<types::Data<>>(const uint64_t id) {
94
0
    const auto data = GetData(id);
95
0
    types::Data<> ret(data.data(), data.size());
96
0
    return ret;
97
0
}
98
99
template <class T>
100
std::vector<T> Base::GetVector(const uint64_t id) {
101
    std::vector<T> ret;
102
103
    while ( Get<bool>(id) == true ) {
104
        ret.push_back( Get<T>(id) );
105
    }
106
107
    return ret;
108
}
109
#endif
110
111
class Datasource : public Base
112
{
113
    private:
114
        const uint8_t* data;
115
        const size_t size;
116
        size_t idx;
117
        size_t left;
118
        std::vector<uint8_t> get(const size_t min, const size_t max, const uint64_t id = 0) override;
119
    public:
120
        Datasource(const uint8_t* _data, const size_t _size);
121
};
122
123
#ifndef FUZZING_HEADERS_NO_IMPL
124
Datasource::Datasource(const uint8_t* _data, const size_t _size) :
125
7.31k
    Base(), data(_data), size(_size), idx(0), left(size)
126
7.31k
{
127
7.31k
}
128
129
1.03M
std::vector<uint8_t> Datasource::get(const size_t min, const size_t max, const uint64_t id) {
130
1.03M
    (void)id;
131
132
1.03M
    uint32_t getSize;
133
1.03M
    if ( left < sizeof(getSize) ) {
134
3.04k
        throw OutOfData();
135
3.04k
    }
136
1.03M
    memcpy(&getSize, data + idx, sizeof(getSize));
137
1.03M
    idx += sizeof(getSize);
138
1.03M
    left -= sizeof(getSize);
139
140
1.03M
    if ( getSize < min ) {
141
18.4k
        getSize = min;
142
18.4k
    }
143
1.03M
    if ( max && getSize > max ) {
144
583k
        getSize = max;
145
583k
    }
146
147
1.03M
    if ( left < getSize ) {
148
178
        throw OutOfData();
149
178
    }
150
151
1.03M
    std::vector<uint8_t> ret(getSize);
152
153
1.03M
    memcpy(ret.data(), data + idx, getSize);
154
1.03M
    idx += getSize;
155
1.03M
    left -= getSize;
156
157
1.03M
    return ret;
158
1.03M
}
159
#endif
160
161
} /* namespace datasource */
162
} /* namespace fuzzing */
163
164
#endif