Coverage Report

Created: 2026-08-31 06:23

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.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
}