/src/glaze/fuzzing/cbor_roundtrip_int.cpp
Line | Count | Source |
1 | | #include <cassert> |
2 | | #include <cstddef> |
3 | | #include <cstdint> |
4 | | #include <cstring> |
5 | | #include <glaze/cbor.hpp> |
6 | | #include <glaze/glaze.hpp> |
7 | | #include <vector> |
8 | | |
9 | | // must be outside test() to work in gcc<14 |
10 | | template <typename T> |
11 | | struct Value |
12 | | { |
13 | | T value{}; |
14 | | }; |
15 | | |
16 | | template <typename T> |
17 | | void test(const uint8_t* Data, size_t Size) |
18 | 4.21k | { |
19 | 4.21k | using S = Value<T>; |
20 | 4.21k | S s{}; |
21 | | |
22 | 4.21k | if (Size >= sizeof(T)) { |
23 | 4.15k | std::memcpy(&s.value, Data, sizeof(T)); |
24 | 4.15k | } |
25 | 56 | else { |
26 | 56 | return; |
27 | 56 | } |
28 | 4.15k | std::string buffer{}; |
29 | 4.15k | auto write_ec = glz::write_cbor(s, buffer); |
30 | 4.15k | if (write_ec) { |
31 | 0 | return; |
32 | 0 | } |
33 | 4.15k | auto restored = glz::read_cbor<S>(buffer); |
34 | 4.15k | assert(restored); |
35 | 4.15k | assert(restored.value().value == s.value); |
36 | 4.15k | } void test<short>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 210 | { | 19 | 210 | using S = Value<T>; | 20 | 210 | S s{}; | 21 | | | 22 | 210 | if (Size >= sizeof(T)) { | 23 | 208 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 208 | } | 25 | 2 | else { | 26 | 2 | return; | 27 | 2 | } | 28 | 208 | std::string buffer{}; | 29 | 208 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 208 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 208 | auto restored = glz::read_cbor<S>(buffer); | 34 | 208 | assert(restored); | 35 | 208 | assert(restored.value().value == s.value); | 36 | 208 | } |
void test<unsigned short>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 210 | { | 19 | 210 | using S = Value<T>; | 20 | 210 | S s{}; | 21 | | | 22 | 210 | if (Size >= sizeof(T)) { | 23 | 208 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 208 | } | 25 | 2 | else { | 26 | 2 | return; | 27 | 2 | } | 28 | 208 | std::string buffer{}; | 29 | 208 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 208 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 208 | auto restored = glz::read_cbor<S>(buffer); | 34 | 208 | assert(restored); | 35 | 208 | assert(restored.value().value == s.value); | 36 | 208 | } |
void test<int>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 427 | { | 19 | 427 | using S = Value<T>; | 20 | 427 | S s{}; | 21 | | | 22 | 427 | if (Size >= sizeof(T)) { | 23 | 421 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 421 | } | 25 | 6 | else { | 26 | 6 | return; | 27 | 6 | } | 28 | 421 | std::string buffer{}; | 29 | 421 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 421 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 421 | auto restored = glz::read_cbor<S>(buffer); | 34 | 421 | assert(restored); | 35 | 421 | assert(restored.value().value == s.value); | 36 | 421 | } |
void test<unsigned int>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 427 | { | 19 | 427 | using S = Value<T>; | 20 | 427 | S s{}; | 21 | | | 22 | 427 | if (Size >= sizeof(T)) { | 23 | 421 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 421 | } | 25 | 6 | else { | 26 | 6 | return; | 27 | 6 | } | 28 | 421 | std::string buffer{}; | 29 | 421 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 421 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 421 | auto restored = glz::read_cbor<S>(buffer); | 34 | 421 | assert(restored); | 35 | 421 | assert(restored.value().value == s.value); | 36 | 421 | } |
void test<long>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 733 | { | 19 | 733 | using S = Value<T>; | 20 | 733 | S s{}; | 21 | | | 22 | 733 | if (Size >= sizeof(T)) { | 23 | 723 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 723 | } | 25 | 10 | else { | 26 | 10 | return; | 27 | 10 | } | 28 | 723 | std::string buffer{}; | 29 | 723 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 723 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 723 | auto restored = glz::read_cbor<S>(buffer); | 34 | 723 | assert(restored); | 35 | 723 | assert(restored.value().value == s.value); | 36 | 723 | } |
void test<unsigned long>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 733 | { | 19 | 733 | using S = Value<T>; | 20 | 733 | S s{}; | 21 | | | 22 | 733 | if (Size >= sizeof(T)) { | 23 | 723 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 723 | } | 25 | 10 | else { | 26 | 10 | return; | 27 | 10 | } | 28 | 723 | std::string buffer{}; | 29 | 723 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 723 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 723 | auto restored = glz::read_cbor<S>(buffer); | 34 | 723 | assert(restored); | 35 | 723 | assert(restored.value().value == s.value); | 36 | 723 | } |
void test<long long>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 736 | { | 19 | 736 | using S = Value<T>; | 20 | 736 | S s{}; | 21 | | | 22 | 736 | if (Size >= sizeof(T)) { | 23 | 726 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 726 | } | 25 | 10 | else { | 26 | 10 | return; | 27 | 10 | } | 28 | 726 | std::string buffer{}; | 29 | 726 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 726 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 726 | auto restored = glz::read_cbor<S>(buffer); | 34 | 726 | assert(restored); | 35 | 726 | assert(restored.value().value == s.value); | 36 | 726 | } |
void test<unsigned long long>(unsigned char const*, unsigned long) Line | Count | Source | 18 | 736 | { | 19 | 736 | using S = Value<T>; | 20 | 736 | S s{}; | 21 | | | 22 | 736 | if (Size >= sizeof(T)) { | 23 | 726 | std::memcpy(&s.value, Data, sizeof(T)); | 24 | 726 | } | 25 | 10 | else { | 26 | 10 | return; | 27 | 10 | } | 28 | 726 | std::string buffer{}; | 29 | 726 | auto write_ec = glz::write_cbor(s, buffer); | 30 | 726 | if (write_ec) { | 31 | 0 | return; | 32 | 0 | } | 33 | 726 | auto restored = glz::read_cbor<S>(buffer); | 34 | 726 | assert(restored); | 35 | 726 | assert(restored.value().value == s.value); | 36 | 726 | } |
|
37 | | |
38 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) |
39 | 4.19k | { |
40 | 4.19k | if (Size < 2) { |
41 | 3 | return 0; |
42 | 3 | } |
43 | 4.19k | const auto action = Data[0]; |
44 | 4.19k | ++Data; |
45 | 4.19k | --Size; |
46 | | |
47 | 4.19k | switch (action & 0b11) { |
48 | 341 | case 0: |
49 | 341 | test<short>(Data, Size); |
50 | 341 | test<unsigned short>(Data, Size); |
51 | 341 | break; |
52 | 789 | case 1: |
53 | 789 | test<int>(Data, Size); |
54 | 789 | test<unsigned int>(Data, Size); |
55 | 789 | break; |
56 | 1.52k | case 2: |
57 | 1.52k | test<long>(Data, Size); |
58 | 1.52k | test<unsigned long>(Data, Size); |
59 | 1.52k | break; |
60 | 1.53k | case 3: |
61 | 1.53k | test<long long>(Data, Size); |
62 | 1.53k | test<unsigned long long>(Data, Size); |
63 | 1.53k | break; |
64 | 4.19k | } |
65 | | |
66 | 4.19k | return 0; |
67 | 4.19k | } |