Skip to content

Commit b20345b

Browse files
authored
Merge pull request diffblue#490 from diffblue/extends_stats_by_instrumenter
SEC-517: Extends stats by instrumenter
2 parents b951bcb + 7c94bfe commit b20345b

10 files changed

+193
-0
lines changed

src/taint-analysis/taint_statistics.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,46 @@ void taint_statisticst::on_taint_analysis_apply_sink_rule(
559559
it->second.on_application_of_sink_rule(rule_id);
560560
}
561561

562+
void taint_statisticst::begin_search_for_rule_applications()
563+
{
564+
time_point_begin_search_for_rule_applications = get_current_time();
565+
}
566+
567+
void taint_statisticst::end_search_for_rule_applications()
568+
{
569+
time_point_end_search_for_rule_applications = get_current_time();
570+
}
571+
572+
void taint_statisticst::begin_propagation_chains()
573+
{
574+
time_point_begin_propagation_chains = get_current_time();
575+
}
576+
577+
void taint_statisticst::end_propagation_chains()
578+
{
579+
time_point_end_propagation_chains = get_current_time();
580+
}
581+
582+
void taint_statisticst::begin_instrumentation_props()
583+
{
584+
time_point_begin_instrumentation_props = get_current_time();
585+
}
586+
587+
void taint_statisticst::end_instrumentation_props()
588+
{
589+
time_point_end_instrumentation_props = get_current_time();
590+
}
591+
592+
void taint_statisticst::begin_slicing_tasks_build()
593+
{
594+
time_point_begin_slicing_tasks_build = get_current_time();
595+
}
596+
597+
void taint_statisticst::end_slicing_tasks_build()
598+
{
599+
time_point_end_slicing_tasks_build = get_current_time();
600+
}
601+
562602
void taint_statisticst::begin_error_traces_recognition()
563603
{
564604
time_point_begin_error_traces_recognition = get_current_time();
@@ -653,6 +693,42 @@ taint_statisticst::get_duration_of_loading_taint_database() const
653693
time_point_end_load_taint_database);
654694
}
655695

696+
697+
taint_statisticst::durationt
698+
taint_statisticst::get_duration_of_taint_slicer_and_instrumenter() const
699+
{
700+
return get_duration(time_point_begin_search_for_rule_applications,
701+
time_point_end_slicing_tasks_build);
702+
}
703+
704+
taint_statisticst::durationt
705+
taint_statisticst::get_duration_of_search_for_rule_applications() const
706+
{
707+
return get_duration(time_point_begin_search_for_rule_applications,
708+
time_point_end_search_for_rule_applications);
709+
}
710+
711+
taint_statisticst::durationt
712+
taint_statisticst::get_duration_of_propagation_chains() const
713+
{
714+
return get_duration(time_point_begin_propagation_chains,
715+
time_point_end_propagation_chains);
716+
}
717+
718+
taint_statisticst::durationt
719+
taint_statisticst::get_duration_of_instrumentation_props() const
720+
{
721+
return get_duration(time_point_begin_instrumentation_props,
722+
time_point_end_instrumentation_props);
723+
}
724+
725+
taint_statisticst::durationt
726+
taint_statisticst::get_duration_of_slicing_tasks_build() const
727+
{
728+
return get_duration(time_point_begin_slicing_tasks_build,
729+
time_point_end_slicing_tasks_build);
730+
}
731+
656732
taint_statisticst::durationt
657733
taint_statisticst::get_duration_of_error_traces_recognition() const
658734
{

src/taint-analysis/taint_statistics.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,15 @@ class taint_statisticst
254254
const std::size_t rule_id,
255255
const unsigned int location_number);
256256

257+
void begin_search_for_rule_applications();
258+
void end_search_for_rule_applications();
259+
void begin_propagation_chains();
260+
void end_propagation_chains();
261+
void begin_instrumentation_props();
262+
void end_instrumentation_props();
263+
void begin_slicing_tasks_build();
264+
void end_slicing_tasks_build();
265+
257266
void begin_error_traces_recognition();
258267
void end_error_traces_recognition();
259268

@@ -280,6 +289,11 @@ class taint_statisticst
280289
durationt get_duration_of_program_info_collecting() const;
281290
durationt get_duration_of_loading_lvsa_database() const;
282291
durationt get_duration_of_loading_taint_database() const;
292+
durationt get_duration_of_taint_slicer_and_instrumenter() const;
293+
durationt get_duration_of_search_for_rule_applications() const;
294+
durationt get_duration_of_propagation_chains() const;
295+
durationt get_duration_of_instrumentation_props() const;
296+
durationt get_duration_of_slicing_tasks_build() const;
283297
durationt get_duration_of_error_traces_recognition() const;
284298
durationt get_duration_of_dump_of_taint_html_summaries() const;
285299
durationt get_duration_of_dump_of_taint_json_summaries() const;
@@ -317,6 +331,15 @@ class taint_statisticst
317331
time_pointt time_point_begin_load_taint_database;
318332
time_pointt time_point_end_load_taint_database;
319333

334+
time_pointt time_point_begin_search_for_rule_applications;
335+
time_pointt time_point_end_search_for_rule_applications;
336+
time_pointt time_point_begin_propagation_chains;
337+
time_pointt time_point_end_propagation_chains;
338+
time_pointt time_point_begin_instrumentation_props;
339+
time_pointt time_point_end_instrumentation_props;
340+
time_pointt time_point_begin_slicing_tasks_build;
341+
time_pointt time_point_end_slicing_tasks_build;
342+
320343
time_pointt time_point_begin_error_traces_recognition;
321344
time_pointt time_point_end_error_traces_recognition;
322345

src/taint-analysis/taint_statistics_dump_json.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ static void taint_dump_phases_table(
5454
table["TA-summary-save-in-JSON"] =
5555
json_numbert(msgstream() <<
5656
S.get_duration_of_dump_of_taint_json_summaries());
57+
table["taint-slicer-instrumenter-search-for-rule-applications"] =
58+
json_numbert(msgstream() <<
59+
S.get_duration_of_search_for_rule_applications());
60+
table["taint-slicer-instrumenter-propagation-chains"] =
61+
json_numbert(msgstream() <<
62+
S.get_duration_of_propagation_chains());
63+
table["taint-slicer-instrumenter-instrumentation-props"] =
64+
json_numbert(msgstream() <<
65+
S.get_duration_of_instrumentation_props());
66+
table["taint-slicer-instrumenter-slicing-tasks-build"] =
67+
json_numbert(msgstream() <<
68+
S.get_duration_of_slicing_tasks_build());
5769
table["error-traces-save-in-HTML"] =
5870
json_numbert(msgstream() <<
5971
S.get_duration_of_dump_of_taint_html_traces());

src/taint-slicer/instrumentation_props.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <java_bytecode/expr2java.h>
1919
#include <util/prefix.h>
2020
#include <util/msgstream.h>
21+
#include <util/tmprof.h>
2122
#include <deque>
2223

2324
bool is_primitive_type(const typet &type)
@@ -74,6 +75,8 @@ static void perform_BFS(
7475
const std::set<taint_function_idt> &functions,
7576
std::set<taint_propagation_chainst::node_idt> &reachable)
7677
{
78+
TMPROF_BLOCK();
79+
7780
std::deque<taint_propagation_chainst::node_idt> work;
7881
for(const auto nid :
7982
do_fwd_search ? chains.get_sources() :
@@ -112,6 +115,8 @@ taint_instrumentation_propst::taint_instrumentation_propst(
112115
, use_data_flow_insensitive_version(
113116
use_data_flow_insensitive_instrumentation)
114117
{
118+
TMPROF_BLOCK();
119+
115120
// First we compute "valid" nodes of the propagation chaint w.r.t. the root
116121
// function. We find these nodes by 2 BFSs: one from sources and one from
117122
// sinks. During both searches we have to stay inside the set of passed
@@ -155,6 +160,8 @@ void taint_instrumentation_propst::build_map_from_typenames_to_tokennames(
155160
const taint_propagation_chainst &chains,
156161
const taint_programt &program)
157162
{
163+
TMPROF_BLOCK();
164+
158165
for(const auto &loc : get_location_props())
159166
{
160167
const goto_programt::instructiont &I=*loc.get_instruction_id();
@@ -223,6 +230,8 @@ void taint_build_instrumentation_props(
223230
std::vector<taint_instrumentation_propst> &output,
224231
const bool use_data_flow_insensitive_instrumentation)
225232
{
233+
TMPROF_BLOCK();
234+
226235
// First we collect all functions mentioned in the graph of chains.
227236
std::set<irep_idt> functions;
228237
{
@@ -336,6 +345,8 @@ void taint_build_instrumentation_props(
336345

337346
void dump_as_json(const taint_instrumentation_propst &props, json_objectt &out)
338347
{
348+
TMPROF_BLOCK();
349+
339350
out["data_flow_insensitive_instrumentation_applied"]=jsont::json_boolean(
340351
props.data_flow_insensitive_version_applied());
341352
{

src/taint-slicer/instrumenter.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <util/arith_tools.h>
1717
#include <util/pointer_offset_size.h>
1818
#include <util/msgstream.h>
19+
#include <util/tmprof.h>
1920
#include <util/std_expr.h>
2021

2122
const c_bool_typet &get_shadow_variable_type()
@@ -133,6 +134,8 @@ exprt make_or_update_initialiser(
133134
const std::set<taint_instrumentert::automaton_variable_idt> &
134135
names_of_shadow_variables)
135136
{
137+
TMPROF_BLOCK();
138+
136139
if(new_type.id() != ID_struct)
137140
{
138141
// Rewrite type regardless, for example to turn (array*)null into
@@ -205,6 +208,8 @@ static void get_access_paths_to_shadow_vars(
205208
const symbol_tablet &instrumented_symbols_table,
206209
const std::set<taint_instrumented_variable_idt> &names_of_shadow_variables)
207210
{
211+
TMPROF_BLOCK();
212+
208213
// The only expected type of the dereferenced lhs of MALLOC
209214
// statement is ID_struct. Arrays are not supported yet.
210215
PRECONDITION(expr.type().id()==ID_struct);
@@ -245,6 +250,8 @@ static exprt get_super_if_subclassed(
245250
&inverse_substitutions,
246251
const symbol_tablet &symbol_table)
247252
{
253+
TMPROF_BLOCK();
254+
248255
namespacet ns(symbol_table);
249256
const typet &expr_type=ns.follow(expr.type());
250257

@@ -327,6 +334,8 @@ static bool is_unary_expression(const exprt &expr)
327334
exprt taint_instrumentert::drive_access_path_through_super_classes(
328335
const exprt &access_path) const
329336
{
337+
TMPROF_BLOCK();
338+
330339
const irept fixed_type_irep=
331340
instrument(access_path.type(), std::bind(
332341
&substitute_subclassed_types,
@@ -499,6 +508,8 @@ void taint_instrumentert::instrument_instructions_with_shadow_variables(
499508
goto_programt &program_to_be_instrumented,
500509
const taint_instrumentation_propst &props) const
501510
{
511+
TMPROF_BLOCK();
512+
502513
goto_programt::instructionst &instructions_to_be_instrumented=
503514
program_to_be_instrumented.instructions;
504515
const namespacet ns(get_instrumented_symbol_table());
@@ -773,6 +784,8 @@ taint_instrumentert::taint_instrumentert(
773784
/// individual elements of props.get_location_props().
774785
void taint_instrumentert::run()
775786
{
787+
TMPROF_BLOCK();
788+
776789
PRECONDITION(program!=nullptr);
777790
PRECONDITION(statistics!=nullptr);
778791

@@ -924,6 +937,8 @@ void taint_instrumentert::run()
924937
void taint_instrumentert::instrument_data_types(
925938
const taint_instrumentation_propst &props)
926939
{
940+
TMPROF_BLOCK();
941+
927942
std::set<irep_idt> new_type_names;
928943
for(const auto &id_info : props.get_datatypes())
929944
{
@@ -1066,6 +1081,8 @@ static exprt make_accessor_expression_to_shadow_variable(
10661081
const std::string &shadow_variable_name,
10671082
const symbol_tablet &symbol_table)
10681083
{
1084+
TMPROF_BLOCK();
1085+
10691086
namespacet ns(symbol_table);
10701087
const typet &arg_type = ns.follow(argument.type());
10711088
if(arg_type.id() == ID_pointer)
@@ -1108,6 +1125,8 @@ void taint_instrumentert::instrument_location(
11081125
const taint_mutable_instruction_idt rule_instruction_ptr,
11091126
const taint_instrumentation_propst &props)
11101127
{
1128+
TMPROF_BLOCK();
1129+
11111130
const taint_instrumentation_propst::location_propst &loc=
11121131
props.get_location_props().at(lid);
11131132

@@ -1178,6 +1197,8 @@ void taint_instrumentert::instrument_location(
11781197
const irep_idt function_id,
11791198
goto_programt &instrumentation_code)
11801199
{
1200+
TMPROF_BLOCK();
1201+
11811202
for(const auto &arg_token : args_and_tokens)
11821203
{
11831204
const exprt acc_path=
@@ -1231,6 +1252,8 @@ void taint_instrumentert::instrument_location_data_flow_insensitive(
12311252
const taint_mutable_instruction_idt instrumention_tail_instruction,
12321253
const taint_instrumentation_propst &props)
12331254
{
1255+
TMPROF_BLOCK();
1256+
12341257
const taint_instrumentation_propst::location_propst &loc=
12351258
props.get_location_props().at(lid);
12361259
goto_functionst::goto_functiont &instrumented_function=

src/taint-slicer/irept_instrument.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Date: May 2017
1212
\*******************************************************************/
1313

1414
#include <taint-slicer/irept_instrument.h>
15+
#include <util/tmprof.h>
1516

1617
#include <cassert>
1718

@@ -22,6 +23,8 @@ Date: May 2017
2223

2324
irept instrument(const irept irep, const instrumenter_fnt &instrumenter)
2425
{
26+
TMPROF_BLOCK();
27+
2528
bool modified=false;
2629

2730
irept::subt new_sub;
@@ -76,6 +79,8 @@ irept instrument_using_guide(
7679
const irept irep,
7780
const guide_instrumenter_fnt &instrumenter)
7881
{
82+
TMPROF_BLOCK();
83+
7984
bool modified=false;
8085

8186
irept::subt new_sub;

0 commit comments

Comments
 (0)