Coverage Report

Created: 2026-10-28 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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.19k
{
19
4.19k
   using S = Value<T>;
20
4.19k
   S s{};
21
22
4.19k
   if (Size >= sizeof(T)) {
23
4.14k
      std::memcpy(&s.value, Data, sizeof(T));
24
4.14k
   }
25
56
   else {
26
56
      return;
27
56
   }
28
4.14k
   std::string buffer{};
29
4.14k
   auto write_ec = glz::write_cbor(s, buffer);
30
4.14k
   if (write_ec) {
31
0
      return;
32
0
   }
33
4.14k
   auto restored = glz::read_cbor<S>(buffer);
34
4.14k
   assert(restored);
35
4.14k
   assert(restored.value().value == s.value);
36
4.14k
}
void test<short>(unsigned char const*, unsigned long)
Line
Count
Source
18
208
{
19
208
   using S = Value<T>;
20
208
   S s{};
21
22
208
   if (Size >= sizeof(T)) {
23
206
      std::memcpy(&s.value, Data, sizeof(T));
24
206
   }
25
2
   else {
26
2
      return;
27
2
   }
28
206
   std::string buffer{};
29
206
   auto write_ec = glz::write_cbor(s, buffer);
30
206
   if (write_ec) {
31
0
      return;
32
0
   }
33
206
   auto restored = glz::read_cbor<S>(buffer);
34
206
   assert(restored);
35
206
   assert(restored.value().value == s.value);
36
206
}
void test<unsigned short>(unsigned char const*, unsigned long)
Line
Count
Source
18
208
{
19
208
   using S = Value<T>;
20
208
   S s{};
21
22
208
   if (Size >= sizeof(T)) {
23
206
      std::memcpy(&s.value, Data, sizeof(T));
24
206
   }
25
2
   else {
26
2
      return;
27
2
   }
28
206
   std::string buffer{};
29
206
   auto write_ec = glz::write_cbor(s, buffer);
30
206
   if (write_ec) {
31
0
      return;
32
0
   }
33
206
   auto restored = glz::read_cbor<S>(buffer);
34
206
   assert(restored);
35
206
   assert(restored.value().value == s.value);
36
206
}
void test<int>(unsigned char const*, unsigned long)
Line
Count
Source
18
411
{
19
411
   using S = Value<T>;
20
411
   S s{};
21
22
411
   if (Size >= sizeof(T)) {
23
405
      std::memcpy(&s.value, Data, sizeof(T));
24
405
   }
25
6
   else {
26
6
      return;
27
6
   }
28
405
   std::string buffer{};
29
405
   auto write_ec = glz::write_cbor(s, buffer);
30
405
   if (write_ec) {
31
0
      return;
32
0
   }
33
405
   auto restored = glz::read_cbor<S>(buffer);
34
405
   assert(restored);
35
405
   assert(restored.value().value == s.value);
36
405
}
void test<unsigned int>(unsigned char const*, unsigned long)
Line
Count
Source
18
411
{
19
411
   using S = Value<T>;
20
411
   S s{};
21
22
411
   if (Size >= sizeof(T)) {
23
405
      std::memcpy(&s.value, Data, sizeof(T));
24
405
   }
25
6
   else {
26
6
      return;
27
6
   }
28
405
   std::string buffer{};
29
405
   auto write_ec = glz::write_cbor(s, buffer);
30
405
   if (write_ec) {
31
0
      return;
32
0
   }
33
405
   auto restored = glz::read_cbor<S>(buffer);
34
405
   assert(restored);
35
405
   assert(restored.value().value == s.value);
36
405
}
void test<long>(unsigned char const*, unsigned long)
Line
Count
Source
18
749
{
19
749
   using S = Value<T>;
20
749
   S s{};
21
22
749
   if (Size >= sizeof(T)) {
23
739
      std::memcpy(&s.value, Data, sizeof(T));
24
739
   }
25
10
   else {
26
10
      return;
27
10
   }
28
739
   std::string buffer{};
29
739
   auto write_ec = glz::write_cbor(s, buffer);
30
739
   if (write_ec) {
31
0
      return;
32
0
   }
33
739
   auto restored = glz::read_cbor<S>(buffer);
34
739
   assert(restored);
35
739
   assert(restored.value().value == s.value);
36
739
}
void test<unsigned long>(unsigned char const*, unsigned long)
Line
Count
Source
18
749
{
19
749
   using S = Value<T>;
20
749
   S s{};
21
22
749
   if (Size >= sizeof(T)) {
23
739
      std::memcpy(&s.value, Data, sizeof(T));
24
739
   }
25
10
   else {
26
10
      return;
27
10
   }
28
739
   std::string buffer{};
29
739
   auto write_ec = glz::write_cbor(s, buffer);
30
739
   if (write_ec) {
31
0
      return;
32
0
   }
33
739
   auto restored = glz::read_cbor<S>(buffer);
34
739
   assert(restored);
35
739
   assert(restored.value().value == s.value);
36
739
}
void test<long long>(unsigned char const*, unsigned long)
Line
Count
Source
18
731
{
19
731
   using S = Value<T>;
20
731
   S s{};
21
22
731
   if (Size >= sizeof(T)) {
23
721
      std::memcpy(&s.value, Data, sizeof(T));
24
721
   }
25
10
   else {
26
10
      return;
27
10
   }
28
721
   std::string buffer{};
29
721
   auto write_ec = glz::write_cbor(s, buffer);
30
721
   if (write_ec) {
31
0
      return;
32
0
   }
33
721
   auto restored = glz::read_cbor<S>(buffer);
34
721
   assert(restored);
35
721
   assert(restored.value().value == s.value);
36
721
}
void test<unsigned long long>(unsigned char const*, unsigned long)
Line
Count
Source
18
731
{
19
731
   using S = Value<T>;
20
731
   S s{};
21
22
731
   if (Size >= sizeof(T)) {
23
721
      std::memcpy(&s.value, Data, sizeof(T));
24
721
   }
25
10
   else {
26
10
      return;
27
10
   }
28
721
   std::string buffer{};
29
721
   auto write_ec = glz::write_cbor(s, buffer);
30
721
   if (write_ec) {
31
0
      return;
32
0
   }
33
721
   auto restored = glz::read_cbor<S>(buffer);
34
721
   assert(restored);
35
721
   assert(restored.value().value == s.value);
36
721
}
37
38
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
39
4.11k
{
40
4.11k
   if (Size < 2) {
41
3
      return 0;
42
3
   }
43
4.11k
   const auto action = Data[0];
44
4.11k
   ++Data;
45
4.11k
   --Size;
46
47
4.11k
   switch (action & 0b11) {
48
340
   case 0:
49
340
      test<short>(Data, Size);
50
340
      test<unsigned short>(Data, Size);
51
340
      break;
52
756
   case 1:
53
756
      test<int>(Data, Size);
54
756
      test<unsigned int>(Data, Size);
55
756
      break;
56
1.53k
   case 2:
57
1.53k
      test<long>(Data, Size);
58
1.53k
      test<unsigned long>(Data, Size);
59
1.53k
      break;
60
1.48k
   case 3:
61
1.48k
      test<long long>(Data, Size);
62
1.48k
      test<unsigned long long>(Data, Size);
63
1.48k
      break;
64
4.11k
   }
65
66
4.11k
   return 0;
67
4.11k
}