asar coverage - build #325


src/asar/
File: src/asar/warnings.cpp
Date: 2025-11-04 16:32:25
Lines:
66/67
98.5%
Functions:
11/11
100.0%
Branches:
80/109
73.4%

Line Branch Exec Source
1 #include <vector>
2 #include "libstr.h"
3
4 // construct a mapping between warning ids and warning names.
5 struct warn_t;
6 std::vector<warn_t> all_warnings;
7 int warning_id_end = 0;
8 struct warn_t {
9 string name;
10 bool exists;
11 bool is_default_enabled;
12 102 warn_t() : name(nullptr), exists(false), is_default_enabled(false) {}
13 96 warn_t(int id, const char *name_in, bool is_default_enabled)
14 96 : exists(true), is_default_enabled(is_default_enabled) {
15
2/4
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
96 if((int)all_warnings.size() <= id) all_warnings.resize(id + 1);
16 // convert warn_xxx -> Wxxx
17
3/6
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
96 name = STR "W" + (name_in + 5);
18
2/4
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 80 times.
✗ Branch 3 not taken.
96 all_warnings[id] = *this;
19 96 warning_id_end = all_warnings.size();
20 96 }
21 };
22
23 // i love this fucking language
24 #define CAT(a,b) a##b
25 #define CAT2(a,b) CAT(a,b)
26 #define SAVE_WARN_NAME(id, name, is_enabled) static warn_t CAT2(_useless_,__LINE__) { id, name, is_enabled }
27 #include "warnings.h"
28
29 #include "asar.h"
30 #include <cassert>
31 #include <cstdarg>
32
33 #include "interface-shared.h"
34
35 struct warnings_state
36 {
37 std::vector<bool> enabled;
38
2/4
✓ Branch 0 taken 396 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 501 times.
✗ Branch 3 not taken.
2295 warnings_state() : enabled(all_warnings.size(), false) {}
39 };
40
41 static warnings_state current_warnings_state;
42 static autoarray<warnings_state> warnings_state_stack;
43 static warnings_state main_warnings_state;
44
45 814 void warn_impl(int warnid, const char* fmt, int whichpass, ...)
46 {
47
2/2
✓ Branch 0 taken 408 times.
✓ Branch 1 taken 406 times.
814 if (pass == whichpass)
48 {
49
3/4
✓ Branch 0 taken 408 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 208 times.
✓ Branch 3 taken 200 times.
408 assert(warnid >= 0 && warnid < warning_id_end);
50
51
6/7
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 208 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 180 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 22 times.
✓ Branch 6 taken 186 times.
408 if (current_warnings_state.enabled[warnid])
52 {
53 22 char warning_buffer[1024];
54 22 va_list args;
55 42 va_start(args, whichpass);
56
57
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 22 times.
42 vsnprintf(warning_buffer, sizeof(warning_buffer), fmt, args);
58
59 42 va_end(args);
60
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 warn((int)warnid, warning_buffer);
61 }
62 }
63 814 }
64
65 42 const char* get_warning_name(asar_warning_id warnid)
66 {
67
3/4
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 20 times.
42 assert(warnid >= 0 && warnid < warning_id_end);
68
69 42 const warn_t& warning = all_warnings[warnid];
70
3/5
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 22 times.
42 assert(warning.exists);
71
72 42 return warning.name.data();
73 }
74
75
76
77 68 void set_warning_enabled(asar_warning_id warnid, bool enabled)
78 {
79
3/4
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✓ Branch 3 taken 33 times.
68 assert(warnid >= 0 && warnid < warning_id_end);
80
3/5
✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
✓ Branch 2 taken 35 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35 times.
68 assert(all_warnings[warnid].exists);
81
82
2/3
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
68 current_warnings_state.enabled[warnid] = enabled;
83 68 }
84
85 86 asar_warning_id parse_warning_id_from_string(const char* string)
86 {
87 86 const char* pos = string;
88
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 86 times.
86 if (pos == nullptr)
90 {
91 return warning_id_end;
92 }
93
94
95
6/6
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 44 times.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 35 times.
✓ Branch 5 taken 9 times.
86 if (pos[0] == 'w' || pos[0] == 'W')
96 {
97 68 ++pos;
98 }
99
2/2
✓ Branch 0 taken 1213 times.
✓ Branch 1 taken 18 times.
1231 for(int i = 0; i < warning_id_end; i++)
100 {
101
10/13
✓ Branch 0 taken 555 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 649 times.
✓ Branch 3 taken 1094 times.
✓ Branch 4 taken 77 times.
✓ Branch 5 taken 564 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 35 times.
✓ Branch 10 taken 537 times.
✓ Branch 11 taken 35 times.
✓ Branch 12 taken 581 times.
1213 if(all_warnings[i].exists && !stricmpwithlower(pos, all_warnings[i].name.data()+1))
102 {
103 68 return asar_warning_id(i);
104 }
105 }
106
107 18 return warning_id_end;
108 }
109
110 292 void reset_warnings_to_default()
111 {
112
2/2
✓ Branch 0 taken 4964 times.
✓ Branch 1 taken 292 times.
5256 for (int i = 0; i < (int)warning_id_end; ++i)
113 {
114 4964 const warn_t& warning = all_warnings[i];
115
116
3/4
✓ Branch 0 taken 2210 times.
✓ Branch 1 taken 2754 times.
✓ Branch 2 taken 2754 times.
✗ Branch 3 not taken.
4964 current_warnings_state.enabled[i] = warning.is_default_enabled;
117 }
118 292 }
119
120 871 void push_warnings(bool warnings_command)
121 {
122
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 847 times.
871 if (warnings_command)
123 {
124 24 warnings_state_stack.append(current_warnings_state);
125 }
126 else
127 {
128 847 main_warnings_state = current_warnings_state;
129 }
130 871 }
131
132 861 void pull_warnings(bool warnings_command)
133 {
134
4/4
✓ Branch 0 taken 843 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 837 times.
✓ Branch 3 taken 6 times.
861 if (warnings_state_stack.count > 0 || !warnings_command)
135 {
136
2/3
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 474 times.
✗ Branch 2 not taken.
855 warnings_state prev_state;
137
138
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 837 times.
855 if (warnings_command)
139 {
140
3/5
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
18 prev_state = warnings_state_stack[warnings_state_stack.count - 1];
141 }
142 else
143 {
144
1/2
✓ Branch 0 taken 837 times.
✗ Branch 1 not taken.
837 prev_state = main_warnings_state;
145 }
146
147
1/2
✓ Branch 0 taken 855 times.
✗ Branch 1 not taken.
855 current_warnings_state = prev_state;
148
149
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 837 times.
855 if (warnings_command)
150 {
151 18 warnings_state_stack.remove(warnings_state_stack.count - 1);
152 }
153 855 }
154 else
155 {
156 6 throw_err_block(0, err_pullwarnings_without_pushwarnings);
157 }
158 855 }
159
160 837 void verify_warnings()
161 {
162
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 831 times.
837 if (warnings_state_stack.count > 0)
163 {
164 6 throw_err_null(0, err_pushwarnings_without_pullwarnings);
165
166 6 warnings_state_stack.reset();
167 }
168 837 }
169