CBMC
variable_sensitivity_dependence_graph.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3  Module: analyses variable-sensitivity variable-sensitivity-dependence-graph
4 
5  Author: Diffblue Ltd.
6 
7 \*******************************************************************/
8 
12 #ifndef CPROVER_ANALYSES_VARIABLE_SENSITIVITY_VARIABLE_SENSITIVITY_DEPENDENCE_GRAPH_H
13 #define CPROVER_ANALYSES_VARIABLE_SENSITIVITY_VARIABLE_SENSITIVITY_DEPENDENCE_GRAPH_H
14 
17 
19 #include <util/graph.h>
20 
21 #include <ostream>
22 
24 
26 {
27 public:
28  enum class kindt
29  {
30  NONE,
31  CTRL,
32  DATA,
33  BOTH
34  };
35 
36  void add(kindt _kind)
37  {
38  switch(kind)
39  {
40  case kindt::NONE:
41  kind = _kind;
42  break;
43  case kindt::DATA:
44  case kindt::CTRL:
45  if(kind != _kind)
46  kind = kindt::BOTH;
47  break;
48  case kindt::BOTH:
49  break;
50  }
51  }
52 
53  kindt get() const
54  {
55  return kind;
56  }
57 
58 protected:
60 };
61 
62 struct vs_dep_nodet : public graph_nodet<vs_dep_edget>
63 {
66 
68 };
69 
72 {
73 public:
75 
77  node_indext id,
79  const vsd_configt &configuration)
81  node_id(id),
82  has_values(false),
83  has_changed(false)
84  {
85  }
86 
87  void transform(
88  const irep_idt &function_from,
89  trace_ptrt trace_from,
90  const irep_idt &function_to,
91  trace_ptrt trace_to,
92  ai_baset &ai,
93  const namespacet &ns) override;
94 
95  void make_bottom() override
96  {
98  has_values = tvt(false);
99  has_changed = false;
100  domain_data_deps.clear();
101  control_deps.clear();
102  control_dep_candidates.clear();
103  control_dep_calls.clear();
105  }
106 
107  void make_top() override
108  {
110  has_values = tvt(true);
111  has_changed = false;
112  domain_data_deps.clear();
113  control_deps.clear();
114  control_dep_candidates.clear();
115  control_dep_calls.clear();
117  }
118 
119  void make_entry() override
120  {
121  make_top();
122  }
123 
124  bool is_bottom() const override
125  {
127  }
128 
129  bool is_top() const override
130  {
132  }
133 
134  bool merge(
136  trace_ptrt from,
137  trace_ptrt to) override;
138 
140  const ai_domain_baset &function_call,
141  const ai_domain_baset &function_start,
142  const ai_domain_baset &function_end,
143  const namespacet &ns) override;
144 
145  void output(std::ostream &out, const ai_baset &ai, const namespacet &ns)
146  const override;
147 
148  jsont output_json(const ai_baset &ai, const namespacet &ns) const override;
149 
150  void populate_dep_graph(
153 
155  {
157  node_id != std::numeric_limits<node_indext>::max(),
158  "Check for the old uninitialised value");
159  return node_id;
160  }
161 
162 private:
166 
168  {
169  public:
172  const goto_programt::const_targett &b) const
173  {
174  return a->location_number < b->location_number;
175  }
176  };
177  typedef std::
178  map<goto_programt::const_targett, std::set<exprt>, dependency_ordert>
181 
182  typedef std::map<goto_programt::const_targett, tvt> control_depst;
184 
185  typedef std::set<goto_programt::const_targett> control_dep_candidatest;
187 
188  typedef std::set<goto_programt::const_targett> control_dep_callst;
191 
192  void eval_data_deps(const exprt &expr, const namespacet &ns, data_depst &deps)
193  const;
194 
196  const irep_idt &from_function,
198  const irep_idt &to_function,
201 
202  void data_dependencies(
206  const namespacet &ns);
207 
209  const control_depst &other_control_deps,
210  const control_dep_candidatest &other_control_dep_candidates,
211  const control_dep_callst &other_control_dep_calls,
212  const control_dep_callst &other_control_dep_call_candidates);
213 };
214 
216 
218  public grapht<vs_dep_nodet>
219 {
220 protected:
221  using ai_baset::get_state;
222 
223  // Legacy-style mutable access to the storage
225  {
226  auto &s = dynamic_cast<location_sensitive_storaget &>(*storage);
227  return s.get_state(l, *domain_factory);
228  }
229 
231  {
232  return dynamic_cast<variable_sensitivity_dependence_domaint &>(
233  get_state(l));
234  }
235 
236 public:
238 
240 
241  typedef std::map<irep_idt, cfg_post_dominatorst> post_dominators_mapt;
242 
245  const namespacet &_ns,
247  const vsd_configt &_configuration,
249 
250  void
251  initialize(const irep_idt &function_id, const goto_programt &goto_program)
252  {
253  ai_recursive_interproceduralt::initialize(function_id, goto_program);
254  }
255 
256  void finalize()
257  {
258  for(const auto &location_state :
259  static_cast<location_sensitive_storaget &>(*storage).internal())
260  {
261  std::static_pointer_cast<variable_sensitivity_dependence_domaint>(
262  location_state.second)
263  ->populate_dep_graph(*this, location_state.first);
264  }
265  }
266 
267  void add_dep(
268  vs_dep_edget::kindt kind,
271 
273  {
274  return post_dominators;
275  }
276 
277 protected:
281  const namespacet &ns;
282 
284 };
285 
286 // NOLINTNEXTLINE(whitespace/line_length)
287 #endif // CPROVER_ANALYSES_VARIABLE_SENSITIVITY_VARIABLE_SENSITIVITY_DEPENDENCE_GRAPH_H
variable_sensitivity_dependence_domaint::node_id
node_indext node_id
Definition: variable_sensitivity_dependence_graph.h:163
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
variable_sensitivity_dependence_domaint::merge
bool merge(const variable_sensitivity_domaint &b, trace_ptrt from, trace_ptrt to) override
Computes the join between "this" and "b".
Definition: variable_sensitivity_dependence_graph.cpp:399
variable_sensitivity_dependence_domaint::make_bottom
void make_bottom() override
no states
Definition: variable_sensitivity_dependence_graph.h:95
variable_sensitivity_dependence_domaint::control_deps
control_depst control_deps
Definition: variable_sensitivity_dependence_graph.h:183
variable_sensitivity_dependence_grapht::add_dep
void add_dep(vs_dep_edget::kindt kind, goto_programt::const_targett from, goto_programt::const_targett to)
Definition: variable_sensitivity_dependence_graph.cpp:658
variable_sensitivity_dependence_domaint::data_dependencies
void data_dependencies(goto_programt::const_targett from, goto_programt::const_targett to, variable_sensitivity_dependence_grapht &dep_graph, const namespacet &ns)
Definition: variable_sensitivity_dependence_graph.cpp:135
ai_baset::locationt
goto_programt::const_targett locationt
Definition: ai.h:126
vs_dep_nodet
Definition: variable_sensitivity_dependence_graph.h:62
ai_three_way_merget
Definition: three_way_merge_abstract_interpreter.h:27
variable_sensitivity_dependence_domaint::output
void output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const override
Basic text output of the abstract domain.
Definition: variable_sensitivity_dependence_graph.cpp:470
variable_sensitivity_dependence_domaint::dependency_ordert::operator()
bool operator()(const goto_programt::const_targett &a, const goto_programt::const_targett &b) const
Definition: variable_sensitivity_dependence_graph.h:170
ai_baset::message_handler
message_handlert & message_handler
Definition: ai.h:523
variable_sensitivity_domaint::is_bottom
bool is_bottom() const override
Find out if the domain is currently unreachable.
Definition: variable_sensitivity_domain.cpp:272
grapht
A generic directed graph with a parametric node type.
Definition: graph.h:166
location_sensitive_storaget::internal
state_mapt & internal(void)
Definition: ai_storage.h:168
variable_sensitivity_dependence_domaint::control_dep_callst
std::set< goto_programt::const_targett > control_dep_callst
Definition: variable_sensitivity_dependence_graph.h:188
vs_dep_edget::kindt::BOTH
@ BOTH
variable_sensitivity_dependence_domaint::data_depst
std::map< goto_programt::const_targett, std::set< exprt >, dependency_ordert > data_depst
Definition: variable_sensitivity_dependence_graph.h:179
variable_sensitivity_dependence_grapht::variable_sensitivity_dependence_domain_factoryt
friend variable_sensitivity_dependence_domain_factoryt
Definition: variable_sensitivity_dependence_graph.h:278
variable_sensitivity_dependence_domaint::domain_data_deps
data_depst domain_data_deps
Definition: variable_sensitivity_dependence_graph.h:180
exprt
Base class for all expressions.
Definition: expr.h:55
three_way_merge_abstract_interpreter.h
vs_dep_edget::kindt::DATA
@ DATA
jsont
Definition: json.h:26
vsd_configt
Definition: variable_sensitivity_configuration.h:44
variable_sensitivity_dependence_domaint::is_top
bool is_top() const override
Definition: variable_sensitivity_dependence_graph.h:129
location_sensitive_storaget::get_state
statet & get_state(trace_ptrt p, const ai_domain_factory_baset &fac) override
Look up the analysis state for a given history, instantiating a new domain if required.
Definition: ai_storage.h:192
ai_domain_baset::trace_ptrt
ai_history_baset::trace_ptrt trace_ptrt
Definition: ai_domain.h:74
variable_sensitivity_dependence_grapht::goto_functions
const goto_functionst & goto_functions
Definition: variable_sensitivity_dependence_graph.h:280
vs_dep_nodet::edget
graph_nodet< vs_dep_edget >::edget edget
Definition: variable_sensitivity_dependence_graph.h:64
cfg_dominators.h
variable_sensitivity_dependence_grapht::finalize
void finalize()
Override this to add a cleanup or post-processing step after fixedpoint has run.
Definition: variable_sensitivity_dependence_graph.h:256
variable_sensitivity_dependence_domaint::make_entry
void make_entry() override
Make this domain a reasonable entry-point state.
Definition: variable_sensitivity_dependence_graph.h:119
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
variable_sensitivity_domaint::make_bottom
void make_bottom() override
Sets the domain to bottom (no states / unreachable).
Definition: variable_sensitivity_domain.cpp:209
vs_dep_edget::kindt
kindt
Definition: variable_sensitivity_dependence_graph.h:28
vs_dep_edget::get
kindt get() const
Definition: variable_sensitivity_dependence_graph.h:53
ai_baset::get_state
virtual statet & get_state(trace_ptrt p)
Get the state for the given history, creating it with the factory if it doesn't exist.
Definition: ai.h:517
variable_sensitivity_dependence_domaint::is_bottom
bool is_bottom() const override
Definition: variable_sensitivity_dependence_graph.h:124
vs_dep_edget::add
void add(kindt _kind)
Definition: variable_sensitivity_dependence_graph.h:36
DATA_INVARIANT
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
Definition: invariant.h:510
variable_sensitivity_dependence_grapht::variable_sensitivity_dependence_domaint
friend variable_sensitivity_dependence_domaint
Definition: variable_sensitivity_dependence_graph.h:279
vs_dep_nodet::PC
goto_programt::const_targett PC
Definition: variable_sensitivity_dependence_graph.h:67
variable_sensitivity_dependence_grapht::variable_sensitivity_dependence_grapht
variable_sensitivity_dependence_grapht(const goto_functionst &goto_functions, const namespacet &_ns, variable_sensitivity_object_factory_ptrt object_factory, const vsd_configt &_configuration, message_handlert &message_handler)
Definition: variable_sensitivity_dependence_graph.cpp:639
variable_sensitivity_dependence_domaint::make_top
void make_top() override
all states – the analysis doesn't use this, and domains may refuse to implement it.
Definition: variable_sensitivity_dependence_graph.h:107
variable_sensitivity_object_factory_ptrt
std::shared_ptr< variable_sensitivity_object_factoryt > variable_sensitivity_object_factory_ptrt
Definition: abstract_environment.h:30
ai_baset::domain_factory
std::unique_ptr< ai_domain_factory_baset > domain_factory
For creating domain objects.
Definition: ai.h:496
vs_dep_edget::kindt::CTRL
@ CTRL
variable_sensitivity_dependence_domaint::control_dep_candidatest
std::set< goto_programt::const_targett > control_dep_candidatest
Definition: variable_sensitivity_dependence_graph.h:185
object_factory
exprt object_factory(const typet &type, const irep_idt base_name, code_blockt &init_code, symbol_table_baset &symbol_table, java_object_factory_parameterst parameters, lifetimet lifetime, const source_locationt &loc, const select_pointer_typet &pointer_type_selector, message_handlert &log)
Similar to gen_nondet_init below, but instead of allocating and non-deterministically initializing th...
Definition: java_object_factory.cpp:1547
variable_sensitivity_dependence_domaint::control_dependencies
void control_dependencies(const irep_idt &from_function, goto_programt::const_targett from, const irep_idt &to_function, goto_programt::const_targett to, variable_sensitivity_dependence_grapht &dep_graph)
Definition: variable_sensitivity_dependence_graph.cpp:204
variable_sensitivity_dependence_domaint::eval_data_deps
void eval_data_deps(const exprt &expr, const namespacet &ns, data_depst &deps) const
Evaluate an expression and accumulate all the data dependencies involved in the evaluation.
Definition: variable_sensitivity_dependence_graph.cpp:27
variable_sensitivity_dependence_domaint::has_changed
bool has_changed
Definition: variable_sensitivity_dependence_graph.h:165
variable_sensitivity_dependence_grapht::initialize
void initialize(const irep_idt &function_id, const goto_programt &goto_program)
Initialize all the abstract states for a single function.
Definition: variable_sensitivity_dependence_graph.h:251
message_handlert
Definition: message.h:27
variable_sensitivity_dependence_grapht::post_dominators
post_dominators_mapt post_dominators
Definition: variable_sensitivity_dependence_graph.h:283
variable_sensitivity_domaint::is_top
bool is_top() const override
Is the domain completely top at this state.
Definition: variable_sensitivity_domain.cpp:277
variable_sensitivity_dependence_grapht
Definition: variable_sensitivity_dependence_graph.h:217
tvt::is_false
bool is_false() const
Definition: threeval.h:26
location_sensitive_storaget
The most conventional storage; one domain per location.
Definition: ai_storage.h:152
variable_sensitivity_dependence_grapht::cfg_post_dominators
post_dominators_mapt & cfg_post_dominators()
Definition: variable_sensitivity_dependence_graph.h:272
tvt
Definition: threeval.h:19
variable_sensitivity_dependence_domaint::control_depst
std::map< goto_programt::const_targett, tvt > control_depst
Definition: variable_sensitivity_dependence_graph.h:182
variable_sensitivity_dependence_domaint::node_indext
grapht< vs_dep_nodet >::node_indext node_indext
Definition: variable_sensitivity_dependence_graph.h:74
variable_sensitivity_dependence_domaint::merge_control_dependencies
bool merge_control_dependencies(const control_depst &other_control_deps, const control_dep_candidatest &other_control_dep_candidates, const control_dep_callst &other_control_dep_calls, const control_dep_callst &other_control_dep_call_candidates)
Definition: variable_sensitivity_dependence_graph.cpp:314
variable_sensitivity_dependence_domaint::populate_dep_graph
void populate_dep_graph(variable_sensitivity_dependence_grapht &, goto_programt::const_targett) const
Definition: variable_sensitivity_dependence_graph.cpp:593
ai_baset::initialize
virtual void initialize(const irep_idt &function_id, const goto_programt &goto_program)
Initialize all the abstract states for a single function.
Definition: ai.cpp:195
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
variable_sensitivity_dependence_domaint::output_json
jsont output_json(const ai_baset &ai, const namespacet &ns) const override
Outputs the current value of the domain.
Definition: variable_sensitivity_dependence_graph.cpp:540
graph.h
variable_sensitivity_dependence_domaint::variable_sensitivity_dependence_domaint
variable_sensitivity_dependence_domaint(node_indext id, variable_sensitivity_object_factory_ptrt object_factory, const vsd_configt &configuration)
Definition: variable_sensitivity_dependence_graph.h:76
vs_dep_edget
Definition: variable_sensitivity_dependence_graph.h:25
graph_nodet
This class represents a node in a directed graph.
Definition: graph.h:34
variable_sensitivity_domain.h
variable_sensitivity_dependence_domaint::has_values
tvt has_values
Definition: variable_sensitivity_dependence_graph.h:164
variable_sensitivity_dependence_domain_factoryt
This ensures that all domains are constructed with the node ID that links them to the graph part of t...
Definition: variable_sensitivity_dependence_graph.cpp:610
variable_sensitivity_dependence_domaint::get_node_id
node_indext get_node_id() const
Definition: variable_sensitivity_dependence_graph.h:154
ai_baset
This is the basic interface of the abstract interpreter with default implementations of the core func...
Definition: ai.h:118
variable_sensitivity_domaint
Definition: variable_sensitivity_domain.h:116
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:72
variable_sensitivity_dependence_domaint
Definition: variable_sensitivity_dependence_graph.h:70
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition: goto_program.h:587
variable_sensitivity_dependence_domaint::dependency_ordert
Definition: variable_sensitivity_dependence_graph.h:167
ai_domain_baset
The interface offered by a domain, allows code to manipulate domains without knowing their exact type...
Definition: ai_domain.h:54
vs_dep_nodet::edgest
graph_nodet< vs_dep_edget >::edgest edgest
Definition: variable_sensitivity_dependence_graph.h:65
vs_dep_edget::kind
kindt kind
Definition: variable_sensitivity_dependence_graph.h:59
variable_sensitivity_domaint::make_top
void make_top() override
Sets the domain to top (all states).
Definition: variable_sensitivity_domain.cpp:215
variable_sensitivity_dependence_domaint::merge_three_way_function_return
void merge_three_way_function_return(const ai_domain_baset &function_call, const ai_domain_baset &function_start, const ai_domain_baset &function_end, const namespacet &ns) override
Perform a context aware merge of the changes that have been applied between function_start and the cu...
Definition: variable_sensitivity_dependence_graph.cpp:448
vs_dep_edget::kindt::NONE
@ NONE
variable_sensitivity_dependence_domaint::transform
void transform(const irep_idt &function_from, trace_ptrt trace_from, const irep_idt &function_to, trace_ptrt trace_to, ai_baset &ai, const namespacet &ns) override
Compute the abstract transformer for a single instruction.
Definition: variable_sensitivity_dependence_graph.cpp:68
variable_sensitivity_dependence_domaint::control_dep_calls
control_dep_callst control_dep_calls
Definition: variable_sensitivity_dependence_graph.h:189
variable_sensitivity_dependence_grapht::post_dominators_mapt
std::map< irep_idt, cfg_post_dominatorst > post_dominators_mapt
Definition: variable_sensitivity_dependence_graph.h:241
variable_sensitivity_dependence_grapht::get_state
virtual statet & get_state(locationt l)
Definition: variable_sensitivity_dependence_graph.h:224
tvt::is_true
bool is_true() const
Definition: threeval.h:25
variable_sensitivity_dependence_grapht::ns
const namespacet & ns
Definition: variable_sensitivity_dependence_graph.h:281
variable_sensitivity_dependence_domaint::control_dep_candidates
control_dep_candidatest control_dep_candidates
Definition: variable_sensitivity_dependence_graph.h:186
variable_sensitivity_dependence_domaint::control_dep_call_candidates
control_dep_callst control_dep_call_candidates
Definition: variable_sensitivity_dependence_graph.h:190
variable_sensitivity_dependence_grapht::operator[]
variable_sensitivity_dependence_domaint & operator[](locationt l)
Definition: variable_sensitivity_dependence_graph.h:230