Coverage Report

Created: 2026-09-14 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/glaze/fuzzing/msgpack_roundtrip_int.cpp
Line
Count
Source
1
#include <cassert>
2
#include <cstddef>
3
#include <cstdint>
4
#include <cstring>
5
#include <glaze/glaze.hpp>
6
#include <glaze/msgpack.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.18k
{
19
4.18k
   using S = Value<T>;
20
4.18k
   S s{};
21
22
4.18k
   if (Size >= sizeof(T)) {
23
4.12k
      std::memcpy(&s.value, Data, sizeof(T));
24
4.12k
   }
25
58
   else {
26
58
      return;
27
58
   }
28
4.12k
   std::string buffer{};
29
4.12k
   auto write_ec = glz::write_msgpack(s, buffer);
30
4.12k
   if (write_ec) {
31
0
      return;
32
0
   }
33
4.12k
   auto restored = glz::read_msgpack<S>(buffer);
34
4.12k
   assert(restored);
35
4.12k
   assert(restored.value().value == s.value);
36
4.12k
}
void test<short>(unsigned char const*, unsigned long)
Line
Count
Source
18
220
{
19
220
   using S = Value<T>;
20
220
   S s{};
21
22
220
   if (Size >= sizeof(T)) {
23
218
      std::memcpy(&s.value, Data, sizeof(T));
24
218
   }
25
2
   else {
26
2
      return;
27
2
   }
28
218
   std::string buffer{};
29
218
   auto write_ec = glz::write_msgpack(s, buffer);
30
218
   if (write_ec) {
31
0
      return;
32
0
   }
33
218
   auto restored = glz::read_msgpack<S>(buffer);
34
218
   assert(restored);
35
218
   assert(restored.value().value == s.value);
36
218
}
void test<unsigned short>(unsigned char const*, unsigned long)
Line
Count
Source
18
220
{
19
220
   using S = Value<T>;
20
220
   S s{};
21
22
220
   if (Size >= sizeof(T)) {
23
218
      std::memcpy(&s.value, Data, sizeof(T));
24
218
   }
25
2
   else {
26
2
      return;
27
2
   }
28
218
   std::string buffer{};
29
218
   auto write_ec = glz::write_msgpack(s, buffer);
30
218
   if (write_ec) {
31
0
      return;
32
0
   }
33
218
   auto restored = glz::read_msgpack<S>(buffer);
34
218
   assert(restored);
35
218
   assert(restored.value().value == s.value);
36
218
}
void test<int>(unsigned char const*, unsigned long)
Line
Count
Source
18
419
{
19
419
   using S = Value<T>;
20
419
   S s{};
21
22
419
   if (Size >= sizeof(T)) {
23
413
      std::memcpy(&s.value, Data, sizeof(T));
24
413
   }
25
6
   else {
26
6
      return;
27
6
   }
28
413
   std::string buffer{};
29
413
   auto write_ec = glz::write_msgpack(s, buffer);
30
413
   if (write_ec) {
31
0
      return;
32
0
   }
33
413
   auto restored = glz::read_msgpack<S>(buffer);
34
413
   assert(restored);
35
413
   assert(restored.value().value == s.value);
36
413
}
void test<unsigned int>(unsigned char const*, unsigned long)
Line
Count
Source
18
419
{
19
419
   using S = Value<T>;
20
419
   S s{};
21
22
419
   if (Size >= sizeof(T)) {
23
413
      std::memcpy(&s.value, Data, sizeof(T));
24
413
   }
25
6
   else {
26
6
      return;
27
6
   }
28
413
   std::string buffer{};
29
413
   auto write_ec = glz::write_msgpack(s, buffer);
30
413
   if (write_ec) {
31
0
      return;
32
0
   }
33
413
   auto restored = glz::read_msgpack<S>(buffer);
34
413
   assert(restored);
35
413
   assert(restored.value().value == s.value);
36
413
}
void test<long>(unsigned char const*, unsigned long)
Line
Count
Source
18
722
{
19
722
   using S = Value<T>;
20
722
   S s{};
21
22
722
   if (Size >= sizeof(T)) {
23
712
      std::memcpy(&s.value, Data, sizeof(T));
24
712
   }
25
10
   else {
26
10
      return;
27
10
   }
28
712
   std::string buffer{};
29
712
   auto write_ec = glz::write_msgpack(s, buffer);
30
712
   if (write_ec) {
31
0
      return;
32
0
   }
33
712
   auto restored = glz::read_msgpack<S>(buffer);
34
712
   assert(restored);
35
712
   assert(restored.value().value == s.value);
36
712
}
void test<unsigned long>(unsigned char const*, unsigned long)
Line
Count
Source
18
722
{
19
722
   using S = Value<T>;
20
722
   S s{};
21
22
722
   if (Size >= sizeof(T)) {
23
712
      std::memcpy(&s.value, Data, sizeof(T));
24
712
   }
25
10
   else {
26
10
      return;
27
10
   }
28
712
   std::string buffer{};
29
712
   auto write_ec = glz::write_msgpack(s, buffer);
30
712
   if (write_ec) {
31
0
      return;
32
0
   }
33
712
   auto restored = glz::read_msgpack<S>(buffer);
34
712
   assert(restored);
35
712
   assert(restored.value().value == s.value);
36
712
}
void test<long long>(unsigned char const*, unsigned long)
Line
Count
Source
18
730
{
19
730
   using S = Value<T>;
20
730
   S s{};
21
22
730
   if (Size >= sizeof(T)) {
23
719
      std::memcpy(&s.value, Data, sizeof(T));
24
719
   }
25
11
   else {
26
11
      return;
27
11
   }
28
719
   std::string buffer{};
29
719
   auto write_ec = glz::write_msgpack(s, buffer);
30
719
   if (write_ec) {
31
0
      return;
32
0
   }
33
719
   auto restored = glz::read_msgpack<S>(buffer);
34
719
   assert(restored);
35
719
   assert(restored.value().value == s.value);
36
719
}
void test<unsigned long long>(unsigned char const*, unsigned long)
Line
Count
Source
18
730
{
19
730
   using S = Value<T>;
20
730
   S s{};
21
22
730
   if (Size >= sizeof(T)) {
23
719
      std::memcpy(&s.value, Data, sizeof(T));
24
719
   }
25
11
   else {
26
11
      return;
27
11
   }
28
719
   std::string buffer{};
29
719
   auto write_ec = glz::write_msgpack(s, buffer);
30
719
   if (write_ec) {
31
0
      return;
32
0
   }
33
719
   auto restored = glz::read_msgpack<S>(buffer);
34
719
   assert(restored);
35
719
   assert(restored.value().value == s.value);
36
719
}
37
38
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
39
4.18k
{
40
4.18k
   if (Size < 2) {
41
3
      return 0;
42
3
   }
43
4.18k
   const auto action = Data[0];
44
4.18k
   ++Data;
45
4.18k
   --Size;
46
47
4.18k
   switch (action & 0b11) {
48
353
   case 0:
49
353
      test<short>(Data, Size);
50
353
      test<unsigned short>(Data, Size);
51
353
      break;
52
781
   case 1:
53
781
      test<int>(Data, Size);
54
781
      test<unsigned int>(Data, Size);
55
781
      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.52k
   case 3:
61
1.52k
      test<long long>(Data, Size);
62
1.52k
      test<unsigned long long>(Data, Size);
63
1.52k
      break;
64
4.18k
   }
65
66
4.18k
   return 0;
67
4.18k
}