/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 |