GCC Code Coverage Report


Directory: src/
File: script_lib/runtime.cpp
Date: 2024-12-30 15:39:09
Exec Total Coverage
Lines: 42 50 84.0%
Functions: 1 1 100.0%
Branches: 36 78 46.2%

Line Branch Exec Source
1 #include "script.h"
2 #include "tokens.h"
3 #include <cstring>
4
5 namespace script
6 {
7 4 std::string runtime(const std::vector<char>& bytecode,
8 std::function<void(const char* msg)> print)
9 {
10
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 if (bytecode.empty())
11
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 return "Empty source";
12
13 3 const auto size = bytecode.size();
14
15
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (size < 5)
16 return "Invalid code (1)";
17
18 // check ID
19
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 if (bytecode.at(0) != 't')
20 return "Invalid code (2)";
21
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 if (bytecode.at(1) != 'c')
22 return "Invalid code (2)";
23
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 if (bytecode.at(2) != 'b')
24 return "Invalid code (2)";
25
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 if (bytecode.at(3) != 'c')
26 return "Invalid code (2)";
27
28 // check version
29
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 if (bytecode.at(4) != 1)
30 return "Invalid version";
31
32 // validate
33
34 3 const auto payload_offset = 5 + sizeof(size_t);
35
36 {
37 3 size_t stored_hash = 0;
38 3 memcpy(&stored_hash, bytecode.data() + 5, sizeof(size_t));
39
40 3 std::vector<char> hash_argument;
41
42 std::vector<char>::const_iterator start =
43 3 bytecode.begin() + payload_offset;
44 3 std::vector<char>::const_iterator end = bytecode.end();
45
46
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 hash_argument.insert(hash_argument.end(), start, end);
47
48
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 hash_argument.insert(hash_argument.end(), secret_key.begin(),
49 secret_key.end());
50
51 vector_hash hasher;
52 3 const auto hash_value = hasher(hash_argument);
53
54
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if (hash_value != stored_hash)
55
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 return "Invalid code (3)";
56
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
3 }
57
58 2 std::string operand;
59
60
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 engine eng{print};
61
62
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2 times.
11 for (auto i = payload_offset; i < size; ++i)
63 {
64
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 const auto value = bytecode.at(i);
65
66 9 language_token t;
67
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
9 if (!get_from_byte_code(value, t))
68 return "Invalid byte code";
69
70
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 6 times.
9 if (t.has_operand)
71 {
72 // todo: add checks
73
74 3 const auto type_size = sizeof(unsigned int);
75 3 auto operand_size = 0u;
76 3 i++;
77 3 memcpy(&operand_size, bytecode.data() + i, type_size);
78
79 3 i = i + type_size;
80
81
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
9 operand = std::string(bytecode.begin() + i,
82 9 bytecode.begin() + i + operand_size);
83
84 3 i = i + operand_size - 1;
85 }
86
87
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 const auto res = eng.run(t.ID, operand);
88
89
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
9 if (!res.empty())
90 return res;
91
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
9 }
92
93
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 return "";
94 2 }
95 } // namespace script
96