Skip to content

Commit 5987030

Browse files
Merge pull request diffblue#261 from danpoe/feature/control-deps-of-function-body-instructions-on-calls-vs
Control dependencies of function body instructions to function calls for variable sensitivity dependence graph
2 parents 0828aff + a1c84ee commit 5987030

File tree

4 files changed

+77
-26
lines changed

4 files changed

+77
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
void main(void)
2+
{
3+
int a;
4+
5+
if(a)
6+
{
7+
a = 1;
8+
}
9+
10+
a = 2;
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--show --dependence-graph-vs
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
Control dependencies: [0-9]+ \[TRUE\]\n.*\n.*\n\s+a = 1;
8+
Control dependencies: [0-9]+ \[UNCONDITIONAL\]\n.*\n.*\n\s+a = 2;
9+
10+
--
11+
^warning: ignoring

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.cpp

+48-25
Original file line numberDiff line numberDiff line change
@@ -70,25 +70,6 @@ void variable_sensitivity_dependence_domaint::transform(
7070
dynamic_cast<variable_sensitivity_dependence_grapht*>(&ai);
7171
assert(dep_graph!=nullptr);
7272

73-
// We do not propagate control dependencies on function calls, i.e., only the
74-
// entry point of a function should have a control dependency on the call
75-
if(!control_deps.empty())
76-
{
77-
const goto_programt::const_targett &dep = control_deps.begin()->first;
78-
if(dep->is_function_call())
79-
{
80-
INVARIANT(
81-
std::all_of(
82-
std::next(control_deps.begin()),
83-
control_deps.end(),
84-
[](const std::pair<const goto_programt::const_targett, tvt> &d)
85-
{ return d.first->is_function_call(); }),
86-
"All entries must be function calls");
87-
88-
control_deps.clear();
89-
}
90-
}
91-
9273
// propagate control dependencies across function calls
9374
if(from->is_function_call())
9475
{
@@ -115,13 +96,15 @@ void variable_sensitivity_dependence_domaint::transform(
11596
// modify abstract state of return location
11697
if(s->merge_control_dependencies(
11798
control_deps,
118-
control_dep_candidates))
99+
control_dep_candidates,
100+
control_dep_calls))
119101
s->has_changed=true;
120102

121103
control_deps.clear();
122-
control_deps.insert(std::make_pair(from, tvt::unknown()));
123-
124104
control_dep_candidates.clear();
105+
106+
control_dep_calls.clear();
107+
control_dep_calls.insert(from);
125108
}
126109
}
127110
else
@@ -178,7 +161,9 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
178161
control_dep_candidates.insert(from);
179162
else if(from->is_end_function())
180163
{
164+
control_deps.clear();
181165
control_dep_candidates.clear();
166+
control_dep_calls.clear();
182167
return;
183168
}
184169

@@ -253,6 +238,7 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
253238
}
254239

255240
control_deps.insert(std::make_pair(cd, branch));
241+
control_dep_calls.clear();
256242
}
257243
}
258244

@@ -263,7 +249,8 @@ void variable_sensitivity_dependence_domaint::control_dependencies(
263249

264250
bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
265251
const control_depst &other_control_deps,
266-
const control_dep_candidatest &other_control_dep_candidates)
252+
const control_dep_candidatest &other_control_dep_candidates,
253+
const control_dep_callst &other_control_dep_calls)
267254
{
268255
bool changed=false;
269256

@@ -312,6 +299,16 @@ bool variable_sensitivity_dependence_domaint::merge_control_dependencies(
312299

313300
changed|=n!=control_dep_candidates.size();
314301

302+
// Merge call control dependencies
303+
304+
n=control_dep_calls.size();
305+
306+
control_dep_calls.insert(
307+
other_control_dep_calls.begin(),
308+
other_control_dep_calls.end());
309+
310+
changed|=n!=control_dep_calls.size();
311+
315312
return changed;
316313
}
317314

@@ -349,7 +346,8 @@ bool variable_sensitivity_dependence_domaint::merge(
349346

350347
changed |= merge_control_dependencies(
351348
cast_b.control_deps,
352-
cast_b.control_dep_candidates);
349+
cast_b.control_dep_candidates,
350+
cast_b.control_dep_calls);
353351

354352
has_changed=false;
355353
has_values=tvt::unknown();
@@ -398,7 +396,7 @@ void variable_sensitivity_dependence_domaint::output(
398396
const ai_baset &ai,
399397
const namespacet &ns) const
400398
{
401-
if(!control_deps.empty())
399+
if(!control_deps.empty() || !control_dep_calls.empty())
402400
{
403401
out << "Control dependencies: ";
404402
for(control_depst::const_iterator
@@ -414,6 +412,18 @@ void variable_sensitivity_dependence_domaint::output(
414412

415413
out << cd->location_number << " [" << branch << "]";
416414
}
415+
416+
for(control_dep_callst::const_iterator
417+
it=control_dep_calls.begin();
418+
it!=control_dep_calls.end();
419+
++it)
420+
{
421+
if(!control_deps.empty() || it!=control_dep_calls.begin())
422+
out << ",";
423+
424+
out << (*it)->location_number << " [UNCONDITIONAL]";
425+
}
426+
417427
out << "\n";
418428
}
419429

@@ -473,6 +483,16 @@ jsont variable_sensitivity_dependence_domaint::output_json(
473483
link["branch"]=json_stringt(branch.to_string());
474484
}
475485

486+
for(const auto &target : control_dep_calls)
487+
{
488+
json_objectt &link=graph.push_back().make_object();
489+
link["locationNumber"]=
490+
json_numbert(std::to_string(target->location_number));
491+
link["sourceLocation"]=json(target->source_location);
492+
link["type"]=json_stringt("control");
493+
link["branch"]=json_stringt("UNCONDITIONAL");
494+
}
495+
476496
for(const auto &dep : domain_data_deps)
477497
{
478498
json_objectt &link=graph.push_back().make_object();
@@ -503,6 +523,9 @@ void variable_sensitivity_dependence_domaint::populate_dep_graph(
503523
for(const auto &c_dep : control_deps)
504524
dep_graph.add_dep(vs_dep_edget::kindt::CTRL, c_dep.first, this_loc);
505525

526+
for(const auto &c_dep : control_dep_calls)
527+
dep_graph.add_dep(vs_dep_edget::kindt::CTRL, c_dep, this_loc);
528+
506529
for(const auto &d_dep : domain_data_deps)
507530
dep_graph.add_dep(vs_dep_edget::kindt::DATA, d_dep.first, this_loc);
508531
}

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class variable_sensitivity_dependence_domaint:
8282
domain_data_deps.clear();
8383
control_deps.clear();
8484
control_dep_candidates.clear();
85+
control_dep_calls.clear();
8586
}
8687

8788
virtual void make_top() override
@@ -92,6 +93,7 @@ class variable_sensitivity_dependence_domaint:
9293
domain_data_deps.clear();
9394
control_deps.clear();
9495
control_dep_candidates.clear();
96+
control_dep_calls.clear();
9597
}
9698

9799
virtual void make_entry() override
@@ -171,6 +173,9 @@ class variable_sensitivity_dependence_domaint:
171173
typedef std::set<goto_programt::const_targett> control_dep_candidatest;
172174
control_dep_candidatest control_dep_candidates;
173175

176+
typedef std::set<goto_programt::const_targett> control_dep_callst;
177+
control_dep_callst control_dep_calls;
178+
174179
void eval_data_deps(
175180
const exprt &expr, const namespacet &ns, data_depst &deps) const;
176181

@@ -187,7 +192,8 @@ class variable_sensitivity_dependence_domaint:
187192

188193
bool merge_control_dependencies(
189194
const control_depst &other_control_deps,
190-
const control_dep_candidatest &other_control_dep_candidates);
195+
const control_dep_candidatest &other_control_dep_candidates,
196+
const control_dep_callst &other_control_dep_calls);
191197
};
192198

193199
class variable_sensitivity_dependence_grapht:

0 commit comments

Comments
 (0)