@@ -28,92 +28,124 @@ Date: May 2016
28
28
#include " cover_instrument.h"
29
29
30
30
void instrument_cover_goals (
31
- const symbol_tablet &symbol_table,
32
31
goto_programt &goto_program,
33
- coverage_criteriont criterion,
34
- message_handlert &message_handler,
35
- const goal_filterst &goal_filters)
32
+ const cover_instrumenterst &instrumenters,
33
+ message_handlert &message_handler)
36
34
{
37
- const namespacet ns (symbol_table);
38
35
cover_basic_blockst basic_blocks (goto_program);
39
36
basic_blocks.select_unique_java_bytecode_indices (
40
37
goto_program, message_handler);
41
38
basic_blocks.report_block_anomalies (goto_program, message_handler);
42
39
43
- Forall_goto_program_instructions (i_it, goto_program)
44
- {
45
- switch (criterion)
46
- {
47
- case coverage_criteriont::ASSERTION:
48
- cover_instrument_assertion (i_it);
49
- break ;
50
-
51
- case coverage_criteriont::COVER:
52
- cover_instrument_cover (ns, i_it);
53
- break ;
54
-
55
- case coverage_criteriont::LOCATION:
56
- cover_instrument_location (goto_program, i_it, basic_blocks, goal_filters);
57
- break ;
40
+ instrumenters (goto_program, basic_blocks);
41
+ }
58
42
59
- case coverage_criteriont::BRANCH:
60
- cover_instrument_branch (goto_program, i_it, basic_blocks);
61
- break ;
43
+ void instrument_cover_goals (
44
+ const symbol_tablet &symbol_table,
45
+ goto_programt &goto_program,
46
+ coverage_criteriont criterion,
47
+ message_handlert &message_handler)
48
+ {
49
+ goal_filterst goal_filters;
50
+ goal_filters.add (util_make_unique<internal_goals_filtert>(message_handler));
62
51
63
- case coverage_criteriont::CONDITION:
64
- cover_instrument_condition (ns, goto_program, i_it);
65
- break ;
52
+ cover_instrumenterst instrumenters;
53
+ instrumenters.add_from_criterion (criterion, symbol_table, goal_filters);
66
54
67
- case coverage_criteriont::DECISION:
68
- cover_instrument_decision (ns, goto_program, i_it);
69
- break ;
55
+ instrument_cover_goals (goto_program, instrumenters, message_handler);
56
+ }
70
57
71
- case coverage_criteriont::MCDC:
72
- cover_instrument_mcdc (ns, goto_program, i_it);
73
- break ;
58
+ void cover_instrumenterst::add_from_criterion (
59
+ coverage_criteriont criterion,
60
+ const symbol_tablet &symbol_table,
61
+ const goal_filterst &goal_filters)
62
+ {
63
+ switch (criterion)
64
+ {
65
+ case coverage_criteriont::LOCATION:
66
+ instrumenters.push_back (
67
+ util_make_unique<cover_location_instrumentert>(
68
+ symbol_table, goal_filters));
69
+ break ;
70
+ case coverage_criteriont::BRANCH:
71
+ instrumenters.push_back (
72
+ util_make_unique<cover_branch_instrumentert>(symbol_table, goal_filters));
73
+ break ;
74
+ case coverage_criteriont::DECISION:
75
+ instrumenters.push_back (
76
+ util_make_unique<cover_decision_instrumentert>(
77
+ symbol_table, goal_filters));
78
+ break ;
79
+ case coverage_criteriont::CONDITION:
80
+ instrumenters.push_back (
81
+ util_make_unique<cover_condition_instrumentert>(
82
+ symbol_table, goal_filters));
83
+ break ;
84
+ case coverage_criteriont::PATH:
85
+ instrumenters.push_back (
86
+ util_make_unique<cover_path_instrumentert>(symbol_table, goal_filters));
87
+ break ;
88
+ case coverage_criteriont::MCDC:
89
+ instrumenters.push_back (
90
+ util_make_unique<cover_mcdc_instrumentert>(symbol_table, goal_filters));
91
+ break ;
92
+ case coverage_criteriont::ASSERTION:
93
+ instrumenters.push_back (
94
+ util_make_unique<cover_assertion_instrumentert>(
95
+ symbol_table, goal_filters));
96
+ break ;
97
+ case coverage_criteriont::COVER:
98
+ instrumenters.push_back (
99
+ util_make_unique<cover_cover_instrumentert>(symbol_table, goal_filters));
100
+ }
101
+ }
74
102
75
- case coverage_criteriont::PATH:
76
- cover_instrument_path (i_it);
77
- break ;
78
- }
103
+ coverage_criteriont
104
+ parse_coverage_criterion (const std::string &criterion_string)
105
+ {
106
+ coverage_criteriont c;
107
+
108
+ if (criterion_string == " assertion" || criterion_string == " assertions" )
109
+ c = coverage_criteriont::ASSERTION;
110
+ else if (criterion_string == " path" || criterion_string == " paths" )
111
+ c = coverage_criteriont::PATH;
112
+ else if (criterion_string == " branch" || criterion_string == " branches" )
113
+ c = coverage_criteriont::BRANCH;
114
+ else if (criterion_string == " location" || criterion_string == " locations" )
115
+ c = coverage_criteriont::LOCATION;
116
+ else if (criterion_string == " decision" || criterion_string == " decisions" )
117
+ c = coverage_criteriont::DECISION;
118
+ else if (criterion_string == " condition" || criterion_string == " conditions" )
119
+ c = coverage_criteriont::CONDITION;
120
+ else if (criterion_string == " mcdc" )
121
+ c = coverage_criteriont::MCDC;
122
+ else if (criterion_string == " cover" )
123
+ c = coverage_criteriont::COVER;
124
+ else
125
+ {
126
+ std::stringstream s;
127
+ s << " unknown coverage criterion " << ' \' ' << criterion_string << ' \' ' ;
128
+ throw s.str ();
79
129
}
130
+
131
+ return c;
80
132
}
81
133
82
134
void instrument_cover_goals (
83
- const symbol_tablet &symbol_table,
84
135
goto_functionst &goto_functions,
85
- coverage_criteriont criterion,
86
- message_handlert &message_handler,
136
+ const cover_instrumenterst &instrumenters,
87
137
const function_filterst &function_filters,
88
- const goal_filterst &goal_filters )
138
+ message_handlert &message_handler )
89
139
{
90
140
Forall_goto_functions (f_it, goto_functions)
91
141
{
92
142
if (!function_filters (f_it->first , f_it->second ))
93
143
continue ;
94
144
95
- instrument_cover_goals (
96
- symbol_table,
97
- f_it->second .body ,
98
- criterion,
99
- message_handler,
100
- goal_filters);
145
+ instrument_cover_goals (f_it->second .body , instrumenters, message_handler);
101
146
}
102
147
}
103
148
104
- void instrument_cover_goals (
105
- const symbol_tablet &symbol_table,
106
- goto_programt &goto_program,
107
- coverage_criteriont criterion,
108
- message_handlert &message_handler)
109
- {
110
- goal_filterst goal_filters;
111
- goal_filters.add (util_make_unique<internal_goals_filtert>(message_handler));
112
-
113
- instrument_cover_goals (
114
- symbol_table, goto_program, criterion, message_handler, goal_filters);
115
- }
116
-
117
149
bool instrument_cover_goals (
118
150
const cmdlinet &cmdline,
119
151
const symbol_tablet &symbol_table,
@@ -129,42 +161,27 @@ bool instrument_cover_goals(
129
161
goal_filterst goal_filters;
130
162
goal_filters.add (util_make_unique<internal_goals_filtert>(message_handler));
131
163
164
+ cover_instrumenterst instrumenters;
165
+
132
166
std::list<std::string> criteria_strings=cmdline.get_values (" cover" );
133
- std::set<coverage_criteriont> criteria;
134
167
bool keep_assertions=false ;
135
168
136
169
for (const auto &criterion_string : criteria_strings)
137
170
{
138
- coverage_criteriont c;
139
-
140
- if (criterion_string==" assertion" || criterion_string==" assertions" )
171
+ try
141
172
{
142
- keep_assertions=true ;
143
- c=coverage_criteriont::ASSERTION;
173
+ coverage_criteriont c = parse_coverage_criterion (criterion_string);
174
+
175
+ if (c == coverage_criteriont::ASSERTION)
176
+ keep_assertions = true ;
177
+
178
+ instrumenters.add_from_criterion (c, symbol_table, goal_filters);
144
179
}
145
- else if (criterion_string==" path" || criterion_string==" paths" )
146
- c=coverage_criteriont::PATH;
147
- else if (criterion_string==" branch" || criterion_string==" branches" )
148
- c=coverage_criteriont::BRANCH;
149
- else if (criterion_string==" location" || criterion_string==" locations" )
150
- c=coverage_criteriont::LOCATION;
151
- else if (criterion_string==" decision" || criterion_string==" decisions" )
152
- c=coverage_criteriont::DECISION;
153
- else if (criterion_string==" condition" || criterion_string==" conditions" )
154
- c=coverage_criteriont::CONDITION;
155
- else if (criterion_string==" mcdc" )
156
- c=coverage_criteriont::MCDC;
157
- else if (criterion_string==" cover" )
158
- c=coverage_criteriont::COVER;
159
- else
180
+ catch (const std::string &e)
160
181
{
161
- msg.error () << " unknown coverage criterion "
162
- << ' \' ' << criterion_string << ' \' '
163
- << messaget::eom;
182
+ msg.error () << e << messaget::eom;
164
183
return true ;
165
184
}
166
-
167
- criteria.insert (c);
168
185
}
169
186
170
187
if (keep_assertions && criteria_strings.size ()>1 )
@@ -203,8 +220,9 @@ bool instrument_cover_goals(
203
220
}
204
221
if (!cover_include_pattern.empty ())
205
222
{
206
- function_filters.add (util_make_unique<include_pattern_filtert>(
207
- message_handler, cover_include_pattern));
223
+ function_filters.add (
224
+ util_make_unique<include_pattern_filtert>(
225
+ message_handler, cover_include_pattern));
208
226
}
209
227
210
228
if (cmdline.isset (" no-trivial-tests" ))
@@ -213,16 +231,8 @@ bool instrument_cover_goals(
213
231
214
232
msg.status () << " Instrumenting coverage goals" << messaget::eom;
215
233
216
- for (const auto &criterion : criteria)
217
- {
218
- instrument_cover_goals (
219
- symbol_table,
220
- goto_functions,
221
- criterion,
222
- message_handler,
223
- function_filters,
224
- goal_filters);
225
- }
234
+ instrument_cover_goals (
235
+ goto_functions, instrumenters, function_filters, message_handler);
226
236
227
237
function_filters.report_anomalies ();
228
238
goal_filters.report_anomalies ();
0 commit comments