CBMC
local_may_alias.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Field-insensitive, location-sensitive may-alias analysis
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_ANALYSES_LOCAL_MAY_ALIAS_H
13 #define CPROVER_ANALYSES_LOCAL_MAY_ALIAS_H
14 
15 #include <memory>
16 #include <stack>
17 
18 #include <util/union_find.h>
19 #include <util/make_unique.h>
20 
21 #include "locals.h"
22 #include "dirty.h"
23 #include "local_cfg.h"
24 
26 {
27 public:
29 
30  explicit local_may_aliast(
31  const goto_functiont &_goto_function):
32  dirty(_goto_function),
33  locals(_goto_function),
34  cfg(_goto_function.body)
35  {
36  build(_goto_function);
37  }
38 
39  void output(
40  std::ostream &out,
41  const goto_functiont &goto_function,
42  const namespacet &ns) const;
43 
47 
48  // given a pointer, returns possible aliases
49  std::set<exprt> get(
51  const exprt &src) const;
52 
53  // returns 'true' when pointers src1 and src2 may be aliases
54  bool aliases(
56  const exprt &src1, const exprt &src2) const;
57 
58 protected:
59  void build(const goto_functiont &goto_function);
60 
61  typedef std::stack<local_cfgt::node_nrt> work_queuet;
62 
64 
66 
67  // the information tracked per program location
68  class loc_infot
69  {
70  public:
72 
73  bool merge(const loc_infot &src);
74  };
75 
76  typedef std::vector<loc_infot> loc_infost;
78 
79  void assign_lhs(
80  const exprt &lhs,
81  const exprt &rhs,
82  const loc_infot &loc_info_src,
83  loc_infot &loc_info_dest);
84 
85  typedef std::set<unsigned> object_sett;
86 
87  void get_rec(
88  object_sett &dest,
89  const exprt &rhs,
90  const loc_infot &loc_info_src) const;
91 
92  unsigned unknown_object;
93 };
94 
96 {
97 public:
99  {
100  }
101 
102  void operator()(const goto_functionst &_goto_functions)
103  {
104  goto_functions=&_goto_functions;
105 
106  for(const auto &gf_entry : _goto_functions.function_map)
107  {
108  forall_goto_program_instructions(i_it, gf_entry.second.body)
109  target_map[i_it] = gf_entry.first;
110  }
111  }
112 
114  {
115  PRECONDITION(goto_functions!=nullptr);
116  fkt_mapt::iterator f_it=fkt_map.find(fkt);
117  if(f_it!=fkt_map.end())
118  return *f_it->second;
119 
120  goto_functionst::function_mapt::const_iterator f_it2=
121  goto_functions->function_map.find(fkt);
122  assert(f_it2!=goto_functions->function_map.end());
123  return *(fkt_map[fkt]=util_make_unique<local_may_aliast>(f_it2->second));
124  }
125 
127  {
128  target_mapt::const_iterator t_it=
129  target_map.find(t);
130  assert(t_it!=target_map.end());
131  return operator()(t_it->second);
132  }
133 
134  std::set<exprt> get(
136  const exprt &src) const;
137 
138 protected:
140  typedef std::map<irep_idt, std::unique_ptr<local_may_aliast> > fkt_mapt;
142 
143  typedef std::map<goto_programt::const_targett, irep_idt > target_mapt;
145 };
146 
147 #endif // CPROVER_ANALYSES_LOCAL_MAY_ALIAS_H
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
local_may_aliast::output
void output(std::ostream &out, const goto_functiont &goto_function, const namespacet &ns) const
Definition: local_may_alias.cpp:465
local_may_aliast::loc_infos
loc_infost loc_infos
Definition: local_may_alias.h:77
localst
Definition: locals.h:24
local_may_alias_factoryt::target_mapt
std::map< goto_programt::const_targett, irep_idt > target_mapt
Definition: local_may_alias.h:143
dirty.h
union_find.h
local_may_aliast::unknown_object
unsigned unknown_object
Definition: local_may_alias.h:92
local_may_aliast::alias_sett
unsigned_union_find alias_sett
Definition: local_may_alias.h:65
local_may_alias_factoryt::local_may_alias_factoryt
local_may_alias_factoryt()
Definition: local_may_alias.h:98
local_may_alias_factoryt::target_map
target_mapt target_map
Definition: local_may_alias.h:144
dirtyt
Dirty variables are ones which have their address taken so we can't reliably work out where they may ...
Definition: dirty.h:27
local_may_alias_factoryt::operator()
void operator()(const goto_functionst &_goto_functions)
Definition: local_may_alias.h:102
unsigned_union_find
Definition: union_find.h:22
local_may_alias_factoryt::fkt_map
fkt_mapt fkt_map
Definition: local_may_alias.h:141
numberingt< exprt, irep_hash >
local_may_aliast::dirty
dirtyt dirty
Definition: local_may_alias.h:44
exprt
Base class for all expressions.
Definition: expr.h:55
local_cfgt
Definition: local_cfg.h:19
goto_functionst::function_map
function_mapt function_map
Definition: goto_functions.h:29
local_may_aliast
Definition: local_may_alias.h:25
local_may_alias_factoryt::operator()
local_may_aliast & operator()(goto_programt::const_targett t)
Definition: local_may_alias.h:126
local_may_aliast::local_may_aliast
local_may_aliast(const goto_functiont &_goto_function)
Definition: local_may_alias.h:30
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
make_unique.h
local_may_aliast::loc_infost
std::vector< loc_infot > loc_infost
Definition: local_may_alias.h:76
local_may_aliast::locals
localst locals
Definition: local_may_alias.h:45
local_may_aliast::objects
numberingt< exprt, irep_hash > objects
Definition: local_may_alias.h:63
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
locals.h
local_cfg.h
local_may_aliast::aliases
bool aliases(const goto_programt::const_targett t, const exprt &src1, const exprt &src2) const
Definition: local_may_alias.cpp:141
local_may_aliast::build
void build(const goto_functiont &goto_function)
Definition: local_may_alias.cpp:322
local_may_alias_factoryt::goto_functions
const goto_functionst * goto_functions
Definition: local_may_alias.h:139
local_may_aliast::goto_functiont
goto_functionst::goto_functiont goto_functiont
Definition: local_may_alias.h:28
goto_functiont
A goto function, consisting of function body (see body) and parameter identifiers (see parameter_iden...
Definition: goto_function.h:23
local_may_aliast::work_queuet
std::stack< local_cfgt::node_nrt > work_queuet
Definition: local_may_alias.h:61
local_may_aliast::assign_lhs
void assign_lhs(const exprt &lhs, const exprt &rhs, const loc_infot &loc_info_src, loc_infot &loc_info_dest)
Definition: local_may_alias.cpp:44
local_may_alias_factoryt
Definition: local_may_alias.h:95
local_may_aliast::loc_infot::merge
bool merge(const loc_infot &src)
Definition: local_may_alias.cpp:25
local_may_aliast::loc_infot::aliases
alias_sett aliases
Definition: local_may_alias.h:71
goto_functionst::goto_functiont
::goto_functiont goto_functiont
Definition: goto_functions.h:27
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
local_may_alias_factoryt::get
std::set< exprt > get(const goto_programt::const_targett t, const exprt &src) const
local_may_aliast::object_sett
std::set< unsigned > object_sett
Definition: local_may_alias.h:85
local_may_aliast::cfg
local_cfgt cfg
Definition: local_may_alias.h:46
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition: goto_program.h:587
local_may_alias_factoryt::operator()
local_may_aliast & operator()(const irep_idt &fkt)
Definition: local_may_alias.h:113
local_may_alias_factoryt::fkt_mapt
std::map< irep_idt, std::unique_ptr< local_may_aliast > > fkt_mapt
Definition: local_may_alias.h:140
local_may_aliast::get
std::set< exprt > get(const goto_programt::const_targett t, const exprt &src) const
Definition: local_may_alias.cpp:115
local_may_aliast::loc_infot
Definition: local_may_alias.h:68
forall_goto_program_instructions
#define forall_goto_program_instructions(it, program)
Definition: goto_program.h:1229
local_may_aliast::get_rec
void get_rec(object_sett &dest, const exprt &rhs, const loc_infot &loc_info_src) const
Definition: local_may_alias.cpp:169