CBMC
full_slicer_class.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Goto Program Slicing
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_GOTO_INSTRUMENT_FULL_SLICER_CLASS_H
13 #define CPROVER_GOTO_INSTRUMENT_FULL_SLICER_CLASS_H
14 
15 #include <stack>
16 #include <vector>
17 #include <list>
18 
20 #include <goto-programs/cfg.h>
21 
23 
24 #include "full_slicer.h"
25 
26 // #define DEBUG_FULL_SLICERT
27 #if 0
28 useful for debugging (remove NOLINT)
29 goto-instrument --full-slice a.out c.out
30 goto-instrument --show-goto-functions c.out > c.goto
31 echo 'digraph g {' > c.dot ; cat c.goto | \
32  NOLINT(*) grep 'ins:[[:digit:]]\+ req by' | grep '^[[:space:]]*//' | \
33  NOLINT(*) perl -n -e '/file .*(.) line (\d+) column ins:(\d+) req by:([\d,]+).*/; $f=$3; $t=$4; @tt=split(",",$t); print "n$f [label=\"$f\"];\n"; print "n$f -> n$_;\n" foreach(@tt);' >> c.dot ; \
34  echo '}' >> c.dot ; tred c.dot > c-red.dot ; \
35  dot -Tpdf -oc-red.pdf c-red.dot
36 #endif
37 
39 {
40 public:
41  void operator()(
42  goto_functionst &goto_functions,
43  const namespacet &ns,
44  const slicing_criteriont &criterion);
45 
46 protected:
47  struct cfg_nodet
48  {
50  {
51  }
52 
55 #ifdef DEBUG_FULL_SLICERT
56  std::set<unsigned> required_by;
57 #endif
58  };
59 
62 
63  typedef std::vector<cfgt::entryt> dep_node_to_cfgt;
64  typedef std::stack<cfgt::entryt> queuet;
65  typedef std::list<cfgt::entryt> jumpst;
66  typedef std::unordered_map<irep_idt, queuet> decl_deadt;
67 
68  void fixedpoint(
69  goto_functionst &goto_functions,
70  queuet &queue,
71  jumpst &jumps,
72  decl_deadt &decl_dead,
73  const dependence_grapht &dep_graph);
74 
75  void add_dependencies(
76  const cfgt::nodet &node,
77  queuet &queue,
78  const dependence_grapht &dep_graph,
79  const dep_node_to_cfgt &dep_node_to_cfg);
80 
81  void add_function_calls(
82  const cfgt::nodet &node,
83  queuet &queue,
84  const goto_functionst &goto_functions);
85 
86  void add_decl_dead(
87  const cfgt::nodet &node,
88  queuet &queue,
89  decl_deadt &decl_dead);
90 
91  void add_jumps(
92  queuet &queue,
93  jumpst &jumps,
94  const dependence_grapht::post_dominators_mapt &post_dominators);
95 
97  queuet &queue,
98  const cfgt::entryt &entry,
100  {
101 #ifdef DEBUG_FULL_SLICERT
102  cfg[entry].required_by.insert(reason->location_number);
103 #else
104  (void)reason; // unused parameter
105 #endif
106  queue.push(entry);
107  }
108 };
109 
111 {
112 public:
113  virtual bool
115  {
116  return target->is_assert();
117  }
118 };
119 
121 {
122 public:
123  explicit in_function_criteriont(const std::string &function_name)
124  : target_function(function_name)
125  {
126  }
127 
128  virtual bool
130  {
131  return function_id == target_function;
132  }
133 
134 protected:
136 };
137 
139 {
140 public:
142  const std::list<std::string> &properties):
143  property_ids(properties)
144  {
145  }
146 
147  virtual bool
149  {
150  if(!target->is_assert())
151  return false;
152 
153  const std::string &p_id =
154  id2string(target->source_location().get_property_id());
155 
156  for(std::list<std::string>::const_iterator
157  it=property_ids.begin();
158  it!=property_ids.end();
159  ++it)
160  if(p_id==*it)
161  return true;
162 
163  return false;
164  }
165 
166 protected:
167  const std::list<std::string> &property_ids;
168 };
169 
170 #endif // CPROVER_GOTO_INSTRUMENT_FULL_SLICER_CLASS_H
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
cfg.h
assert_criteriont::operator()
virtual bool operator()(const irep_idt &, goto_programt::const_targett target) const
Definition: full_slicer_class.h:114
dependence_grapht
Definition: dependence_graph.h:211
properties_criteriont::operator()
virtual bool operator()(const irep_idt &, goto_programt::const_targett target) const
Definition: full_slicer_class.h:148
slicing_criteriont
Definition: full_slicer.h:35
cfg_baset< cfg_nodet >::entryt
base_grapht::node_indext entryt
Definition: cfg.h:91
full_slicert::cfg_nodet::node_required
bool node_required
Definition: full_slicer_class.h:53
properties_criteriont
Definition: full_slicer_class.h:138
full_slicert::queuet
std::stack< cfgt::entryt > queuet
Definition: full_slicer_class.h:64
full_slicert::cfg
cfgt cfg
Definition: full_slicer_class.h:61
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
full_slicert::add_dependencies
void add_dependencies(const cfgt::nodet &node, queuet &queue, const dependence_grapht &dep_graph, const dep_node_to_cfgt &dep_node_to_cfg)
Definition: full_slicer.cpp:21
in_function_criteriont::operator()
virtual bool operator()(const irep_idt &function_id, goto_programt::const_targett) const
Definition: full_slicer_class.h:129
full_slicert
Definition: full_slicer_class.h:38
full_slicert::cfg_nodet::function_id
irep_idt function_id
Definition: full_slicer_class.h:54
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
properties_criteriont::properties_criteriont
properties_criteriont(const std::list< std::string > &properties)
Definition: full_slicer_class.h:141
slice
void slice(symex_bmct &symex, symex_target_equationt &symex_target_equation, const namespacet &ns, const optionst &options, ui_message_handlert &ui_message_handler)
Definition: bmc_util.cpp:199
dependence_grapht::post_dominators_mapt
std::map< irep_idt, cfg_post_dominatorst > post_dominators_mapt
Definition: dependence_graph.h:219
full_slicert::dep_node_to_cfgt
std::vector< cfgt::entryt > dep_node_to_cfgt
Definition: full_slicer_class.h:63
full_slicert::add_decl_dead
void add_decl_dead(const cfgt::nodet &node, queuet &queue, decl_deadt &decl_dead)
Definition: full_slicer.cpp:55
full_slicer.h
full_slicert::cfgt
cfg_baset< cfg_nodet > cfgt
Definition: full_slicer_class.h:60
full_slicert::operator()
void operator()(goto_functionst &goto_functions, const namespacet &ns, const slicing_criteriont &criterion)
Definition: full_slicer.cpp:255
full_slicert::add_jumps
void add_jumps(queuet &queue, jumpst &jumps, const dependence_grapht::post_dominators_mapt &post_dominators)
Definition: full_slicer.cpp:86
cfg_baset< cfg_nodet >
goto_functionst
A collection of goto functions.
Definition: goto_functions.h:24
cfg_baset< cfg_nodet >::nodet
base_grapht::nodet nodet
Definition: cfg.h:92
in_function_criteriont::in_function_criteriont
in_function_criteriont(const std::string &function_name)
Definition: full_slicer_class.h:123
full_slicert::fixedpoint
void fixedpoint(goto_functionst &goto_functions, queuet &queue, jumpst &jumps, decl_deadt &decl_dead, const dependence_grapht &dep_graph)
Definition: full_slicer.cpp:191
full_slicert::cfg_nodet::cfg_nodet
cfg_nodet()
Definition: full_slicer_class.h:49
in_function_criteriont::target_function
const irep_idt target_function
Definition: full_slicer_class.h:135
in_function_criteriont
Definition: full_slicer_class.h:120
properties_criteriont::property_ids
const std::list< std::string > & property_ids
Definition: full_slicer_class.h:167
goto_functions.h
goto_programt::const_targett
instructionst::const_iterator const_targett
Definition: goto_program.h:587
full_slicert::jumpst
std::list< cfgt::entryt > jumpst
Definition: full_slicer_class.h:65
full_slicert::decl_deadt
std::unordered_map< irep_idt, queuet > decl_deadt
Definition: full_slicer_class.h:66
full_slicert::add_function_calls
void add_function_calls(const cfgt::nodet &node, queuet &queue, const goto_functionst &goto_functions)
Definition: full_slicer.cpp:37
assert_criteriont
Definition: full_slicer_class.h:110
full_slicert::add_to_queue
void add_to_queue(queuet &queue, const cfgt::entryt &entry, goto_programt::const_targett reason)
Definition: full_slicer_class.h:96
full_slicert::cfg_nodet
Definition: full_slicer_class.h:47
dependence_graph.h