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