CBMC
flow_insensitive_analysis.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Flow Insensitive Static Analysis
4 
5 Author: Daniel Kroening, kroening@kroening.com
6  CM Wintersteiger
7 
8 \*******************************************************************/
9 
23 
24 #ifndef CPROVER_ANALYSES_FLOW_INSENSITIVE_ANALYSIS_H
25 #define CPROVER_ANALYSES_FLOW_INSENSITIVE_ANALYSIS_H
26 
27 #include <queue>
28 #include <map>
29 #include <iosfwd>
30 #include <unordered_set>
31 
33 
34 // don't use me -- I am just a base class
35 // please derive from me
37 {
38 public:
40  changed(false)
41  {
42  }
43 
45 
46  virtual void initialize(const namespacet &ns)=0;
47 
48  virtual bool transform(
49  const namespacet &ns,
50  const irep_idt &function_from,
51  locationt from,
52  const irep_idt &function_to,
53  locationt to) = 0;
54 
56  {
57  }
58 
59  virtual void output(
60  const namespacet &,
61  std::ostream &) const
62  {
63  }
64 
65  typedef std::unordered_set<exprt, irep_hash> expr_sett;
66 
67  virtual void get_reference_set(
68  const namespacet &,
69  const exprt &,
70  expr_sett &expr_set)
71  {
72  // dummy, overload me!
73  expr_set.clear();
74  }
75 
76  virtual void clear(void)=0;
77 
78 protected:
79  bool changed;
80  // utilities
81 
82  // get guard of a conditional edge
83  exprt get_guard(locationt from, locationt to) const;
84 
85  // get lhs that return value is assigned to
86  // for an edge that returns from a function
87  exprt get_return_lhs(locationt to) const;
88 };
89 
91 {
92 public:
95 
96  std::set<locationt> seen_locations;
97 
98  std::map<locationt, unsigned> statistics;
99 
100  bool seen(const locationt &l)
101  {
102  return (seen_locations.find(l)!=seen_locations.end());
103  }
104 
106  ns(_ns),
107  initialized(false)
108  {
109  }
110 
111  virtual void initialize(const goto_programt &)
112  {
113  if(!initialized)
114  {
115  initialized=true;
116  }
117  }
118 
119  virtual void initialize(const goto_functionst &)
120  {
121  if(!initialized)
122  {
123  initialized=true;
124  }
125  }
126 
127  virtual void update(const goto_programt &goto_program);
128 
129  virtual void update(const goto_functionst &goto_functions);
130 
131  virtual void
132  operator()(const irep_idt &function_id, const goto_programt &goto_program);
133 
134  virtual void operator()(
135  const goto_functionst &goto_functions);
136 
138  {
139  }
140 
141  virtual void clear()
142  {
143  initialized=false;
144  }
145 
146  virtual void output(
147  const goto_functionst &goto_functions,
148  std::ostream &out);
149 
150  virtual void output(
151  const irep_idt &function_id,
152  const goto_programt &goto_program,
153  std::ostream &out);
154 
155 protected:
156  const namespacet &ns;
157 
158  typedef std::priority_queue<locationt> working_sett;
159 
160  locationt get_next(working_sett &working_set);
161 
163  working_sett &working_set,
164  locationt l)
165  {
166  working_set.push(l);
167  }
168 
169  // true = found something new
170  bool fixedpoint(
171  const irep_idt &function_id,
172  const goto_programt &goto_program,
173  const goto_functionst &goto_functions);
174 
175  void fixedpoint(
176  const goto_functionst &goto_functions);
177 
178  // true = found something new
179  bool visit(
180  const irep_idt &function_id,
181  locationt l,
182  working_sett &working_set,
183  const goto_programt &goto_program,
184  const goto_functionst &goto_functions);
185 
187  {
188  l++;
189  return l;
190  }
191 
192  typedef std::set<irep_idt> functions_donet;
194 
195  typedef std::set<irep_idt> recursion_sett;
197 
199 
200  // function calls
202  const irep_idt &calling_function,
203  locationt l_call,
204  const exprt &function,
205  const exprt::operandst &arguments,
206  statet &new_state,
207  const goto_functionst &goto_functions);
208 
209  bool do_function_call(
210  const irep_idt &calling_function,
211  locationt l_call,
212  const goto_functionst &goto_functions,
213  const goto_functionst::function_mapt::const_iterator f_it,
214  const exprt::operandst &arguments,
215  statet &new_state);
216 
217  // abstract methods
218 
219  virtual statet &get_state()=0;
220  virtual const statet &get_state() const=0;
221 
223 
224  virtual void get_reference_set(
225  const exprt &expr,
226  expr_sett &expr_set)=0;
227 };
228 
229 
230 template<typename T>
232 {
233 public:
234  // constructor
237  {
238  }
239 
241 
242  virtual void clear()
243  {
244  state.clear();
246  }
247 
248  T &get_data() { return state; }
249  const T &get_data() const { return state; }
250 
251 protected:
252  T state; // one global state
253 
254  virtual statet &get_state() { return state; }
255 
256  virtual const statet &get_state() const { return state; }
257 
259  const exprt &expr,
260  expr_sett &expr_set)
261  {
262  state.get_reference_set(ns, expr, expr_set);
263  }
264 
265 private:
266  // to enforce that T is derived from abstract_domain_baset
267  void dummy(const T &s) { const statet &x=dummy1(s); (void)x; }
268 };
269 
270 #endif // CPROVER_ANALYSES_FLOW_INSENSITIVE_ANALYSIS_H
flow_insensitive_analysis_baset::update
virtual void update(const goto_programt &goto_program)
Definition: flow_insensitive_analysis.cpp:398
flow_insensitive_abstract_domain_baset::~flow_insensitive_abstract_domain_baset
virtual ~flow_insensitive_abstract_domain_baset()
Definition: flow_insensitive_analysis.h:55
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
flow_insensitive_analysist::locationt
goto_programt::const_targett locationt
Definition: flow_insensitive_analysis.h:240
flow_insensitive_analysis_baset::get_state
virtual statet & get_state()=0
flow_insensitive_analysis_baset::initialized
bool initialized
Definition: flow_insensitive_analysis.h:198
flow_insensitive_analysis_baset::visit
bool visit(const irep_idt &function_id, locationt l, working_sett &working_set, const goto_programt &goto_program, const goto_functionst &goto_functions)
Definition: flow_insensitive_analysis.cpp:125
flow_insensitive_analysis_baset::clear
virtual void clear()
Definition: flow_insensitive_analysis.h:141
flow_insensitive_analysist::get_data
T & get_data()
Definition: flow_insensitive_analysis.h:248
flow_insensitive_analysist::get_reference_set
void get_reference_set(const exprt &expr, expr_sett &expr_set)
Definition: flow_insensitive_analysis.h:258
flow_insensitive_analysist::flow_insensitive_analysist
flow_insensitive_analysist(const namespacet &_ns)
Definition: flow_insensitive_analysis.h:235
flow_insensitive_abstract_domain_baset::initialize
virtual void initialize(const namespacet &ns)=0
exprt
Base class for all expressions.
Definition: expr.h:55
flow_insensitive_analysis_baset::recursion_set
recursion_sett recursion_set
Definition: flow_insensitive_analysis.h:196
flow_insensitive_analysist::get_state
virtual const statet & get_state() const
Definition: flow_insensitive_analysis.h:256
flow_insensitive_analysis_baset::working_sett
std::priority_queue< locationt > working_sett
Definition: flow_insensitive_analysis.h:158
flow_insensitive_abstract_domain_baset::get_return_lhs
exprt get_return_lhs(locationt to) const
Definition: flow_insensitive_analysis.cpp:31
flow_insensitive_analysis_baset::initialize
virtual void initialize(const goto_programt &)
Definition: flow_insensitive_analysis.h:111
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
flow_insensitive_analysis_baset::seen_locations
std::set< locationt > seen_locations
Definition: flow_insensitive_analysis.h:96
flow_insensitive_abstract_domain_baset::output
virtual void output(const namespacet &, std::ostream &) const
Definition: flow_insensitive_analysis.h:59
flow_insensitive_analysis_baset::functions_donet
std::set< irep_idt > functions_donet
Definition: flow_insensitive_analysis.h:192
flow_insensitive_analysis_baset::do_function_call_rec
bool do_function_call_rec(const irep_idt &calling_function, locationt l_call, const exprt &function, const exprt::operandst &arguments, statet &new_state, const goto_functionst &goto_functions)
Definition: flow_insensitive_analysis.cpp:272
flow_insensitive_analysis_baset::fixedpoint
bool fixedpoint(const irep_idt &function_id, const goto_programt &goto_program, const goto_functionst &goto_functions)
Definition: flow_insensitive_analysis.cpp:96
flow_insensitive_analysis_baset::operator()
virtual void operator()(const irep_idt &function_id, const goto_programt &goto_program)
Definition: flow_insensitive_analysis.cpp:51
flow_insensitive_analysis_baset::get_reference_set
virtual void get_reference_set(const exprt &expr, expr_sett &expr_set)=0
flow_insensitive_abstract_domain_baset::locationt
goto_programt::const_targett locationt
Definition: flow_insensitive_analysis.h:44
flow_insensitive_analysis_baset::functions_done
functions_donet functions_done
Definition: flow_insensitive_analysis.h:193
flow_insensitive_analysis_baset
Definition: flow_insensitive_analysis.h:90
flow_insensitive_abstract_domain_baset::get_reference_set
virtual void get_reference_set(const namespacet &, const exprt &, expr_sett &expr_set)
Definition: flow_insensitive_analysis.h:67
flow_insensitive_abstract_domain_baset::expr_sett
std::unordered_set< exprt, irep_hash > expr_sett
Definition: flow_insensitive_analysis.h:65
flow_insensitive_analysis_baset::flow_insensitive_analysis_baset
flow_insensitive_analysis_baset(const namespacet &_ns)
Definition: flow_insensitive_analysis.h:105
flow_insensitive_analysis_baset::put_in_working_set
void put_in_working_set(working_sett &working_set, locationt l)
Definition: flow_insensitive_analysis.h:162
exprt::operandst
std::vector< exprt > operandst
Definition: expr.h:58
flow_insensitive_abstract_domain_baset::changed
bool changed
Definition: flow_insensitive_analysis.h:79
flow_insensitive_abstract_domain_baset::flow_insensitive_abstract_domain_baset
flow_insensitive_abstract_domain_baset()
Definition: flow_insensitive_analysis.h:39
flow_insensitive_analysis_baset::~flow_insensitive_analysis_baset
virtual ~flow_insensitive_analysis_baset()
Definition: flow_insensitive_analysis.h:137
flow_insensitive_analysis_baset::output
virtual void output(const goto_functionst &goto_functions, std::ostream &out)
Definition: flow_insensitive_analysis.cpp:58
flow_insensitive_analysis_baset::do_function_call
bool do_function_call(const irep_idt &calling_function, locationt l_call, const goto_functionst &goto_functions, const goto_functionst::function_mapt::const_iterator f_it, const exprt::operandst &arguments, statet &new_state)
Definition: flow_insensitive_analysis.cpp:190
flow_insensitive_analysis_baset::ns
const namespacet & ns
Definition: flow_insensitive_analysis.h:156
flow_insensitive_analysis_baset::statistics
std::map< locationt, unsigned > statistics
Definition: flow_insensitive_analysis.h:98
flow_insensitive_abstract_domain_baset::get_guard
exprt get_guard(locationt from, locationt to) const
Definition: flow_insensitive_analysis.cpp:19
flow_insensitive_analysist::state
T state
Definition: flow_insensitive_analysis.h:252
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
flow_insensitive_analysis_baset::locationt
goto_programt::const_targett locationt
Definition: flow_insensitive_analysis.h:94
flow_insensitive_analysis_baset::recursion_sett
std::set< irep_idt > recursion_sett
Definition: flow_insensitive_analysis.h:195
flow_insensitive_abstract_domain_baset::transform
virtual bool transform(const namespacet &ns, const irep_idt &function_from, locationt from, const irep_idt &function_to, locationt to)=0
flow_insensitive_analysis_baset::expr_sett
flow_insensitive_abstract_domain_baset::expr_sett expr_sett
Definition: flow_insensitive_analysis.h:222
flow_insensitive_analysist::dummy
void dummy(const T &s)
Definition: flow_insensitive_analysis.h:267
goto_functions.h
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:72
flow_insensitive_analysis_baset::statet
flow_insensitive_abstract_domain_baset statet
Definition: flow_insensitive_analysis.h:93
flow_insensitive_analysist::clear
virtual void clear()
Definition: flow_insensitive_analysis.h:242
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition: goto_program.h:587
flow_insensitive_abstract_domain_baset
Definition: flow_insensitive_analysis.h:36
flow_insensitive_analysis_baset::initialize
virtual void initialize(const goto_functionst &)
Definition: flow_insensitive_analysis.h:119
flow_insensitive_analysist::get_state
virtual statet & get_state()
Definition: flow_insensitive_analysis.h:254
flow_insensitive_analysis_baset::seen
bool seen(const locationt &l)
Definition: flow_insensitive_analysis.h:100
flow_insensitive_analysis_baset::get_next
locationt get_next(working_sett &working_set)
Definition: flow_insensitive_analysis.cpp:80
flow_insensitive_analysist::get_data
const T & get_data() const
Definition: flow_insensitive_analysis.h:249
flow_insensitive_analysist
Definition: flow_insensitive_analysis.h:231
flow_insensitive_abstract_domain_baset::clear
virtual void clear(void)=0
flow_insensitive_analysis_baset::successor
static locationt successor(locationt l)
Definition: flow_insensitive_analysis.h:186