CBMC
havoc_loops.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Havoc Loops
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #include "havoc_loops.h"
13 
14 #include <analyses/natural_loops.h>
16 
18 
19 #include "function_assigns.h"
20 #include "havoc_utils.h"
21 #include "loop_utils.h"
22 
24 {
25 public:
27 
29  function_assignst &_function_assigns,
30  goto_functiont &_goto_function,
31  const namespacet &ns)
32  : goto_function(_goto_function),
33  local_may_alias(_goto_function),
34  function_assigns(_function_assigns),
35  natural_loops(_goto_function.body),
36  ns(ns)
37  {
38  havoc_loops();
39  }
40 
41 protected:
46  const namespacet &ns;
47 
48  typedef std::set<exprt> assignst;
50 
51  void havoc_loops();
52 
53  void havoc_loop(
54  const goto_programt::targett loop_head,
55  const loopt &);
56 
57  void get_assigns(const loopt &, assignst &);
58 };
59 
61  const goto_programt::targett loop_head,
62  const loopt &loop)
63 {
64  PRECONDITION(!loop.empty());
65 
66  // first find out what can get changed in the loop
67  assignst assigns;
68  get_assigns(loop, assigns);
69 
70  // build the havocking code
71  goto_programt havoc_code;
72  havoc_utilst havoc_gen(assigns, ns);
73  havoc_gen.append_full_havoc_code(loop_head->source_location(), havoc_code);
74 
75  // Now havoc at the loop head. Use insert_swap to
76  // preserve jumps to loop head.
77  goto_function.body.insert_before_swap(loop_head, havoc_code);
78 
79  // compute the loop exit
80  goto_programt::targett loop_exit=
81  get_loop_exit(loop);
82 
83  // divert all gotos to the loop head to the loop exit
84  for(loopt::const_iterator
85  l_it=loop.begin(); l_it!=loop.end(); l_it++)
86  {
87  goto_programt::instructiont &instruction=**l_it;
88  if(instruction.is_goto())
89  {
90  for(goto_programt::targetst::iterator
91  t_it=instruction.targets.begin();
92  t_it!=instruction.targets.end();
93  t_it++)
94  {
95  if(*t_it==loop_head)
96  *t_it=loop_exit; // divert
97  }
98  }
99  }
100 
101  // remove skips
103 }
104 
105 void havoc_loopst::get_assigns(const loopt &loop, assignst &assigns)
106 {
107  for(const auto &instruction_it : loop)
108  function_assigns.get_assigns(local_may_alias, instruction_it, assigns);
109 }
110 
112 {
113  // iterate over the (natural) loops in the function
114 
115  for(const auto &loop : natural_loops.loop_map)
116  havoc_loop(loop.first, loop.second);
117 }
118 
119 void havoc_loops(goto_modelt &goto_model)
120 {
121  function_assignst function_assigns(goto_model.goto_functions);
122 
123  for(auto &gf_entry : goto_model.goto_functions.function_map)
124  {
125  havoc_loopst(
126  function_assigns, gf_entry.second, namespacet{goto_model.symbol_table});
127  }
128 }
void get_assigns(const local_may_aliast &local_may_alias, const goto_programt::const_targett, assignst &)
function_mapt function_map
::goto_functiont goto_functiont
A goto function, consisting of function body (see body) and parameter identifiers (see parameter_iden...
Definition: goto_function.h:24
goto_programt body
Definition: goto_function.h:26
goto_functionst goto_functions
GOTO functions.
Definition: goto_model.h:34
This class represents an instruction in the GOTO intermediate representation.
Definition: goto_program.h:181
targetst targets
The list of successor instructions.
Definition: goto_program.h:414
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:73
void insert_before_swap(targett target)
Insertion that preserves jumps to "target".
Definition: goto_program.h:643
instructionst::iterator targett
Definition: goto_program.h:614
void havoc_loops()
const natural_loops_mutablet::natural_loopt loopt
Definition: havoc_loops.cpp:49
void havoc_loop(const goto_programt::targett loop_head, const loopt &)
Definition: havoc_loops.cpp:60
void get_assigns(const loopt &, assignst &)
goto_functiont & goto_function
Definition: havoc_loops.cpp:42
havoc_loopst(function_assignst &_function_assigns, goto_functiont &_goto_function, const namespacet &ns)
Definition: havoc_loops.cpp:28
local_may_aliast local_may_alias
Definition: havoc_loops.cpp:43
goto_functionst::goto_functiont goto_functiont
Definition: havoc_loops.cpp:26
function_assignst & function_assigns
Definition: havoc_loops.cpp:44
natural_loops_mutablet natural_loops
Definition: havoc_loops.cpp:45
std::set< exprt > assignst
Definition: havoc_loops.cpp:48
const namespacet & ns
Definition: havoc_loops.cpp:46
void append_full_havoc_code(const source_locationt location, goto_programt &dest)
Append goto instructions to havoc the full assigns set.
Definition: havoc_utils.cpp:21
loop_mapt loop_map
Definition: loop_analysis.h:88
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:94
Compute objects assigned to in a function.
void havoc_loops(goto_modelt &goto_model)
Havoc Loops.
Utilities for building havoc code for expressions.
Field-insensitive, location-sensitive may-alias analysis.
goto_programt::targett get_loop_exit(const loopt &loop)
Definition: loop_utils.cpp:21
Helper functions for k-induction and loop invariants.
Compute natural loops in a goto_function.
void remove_skip(goto_programt &goto_program, goto_programt::targett begin, goto_programt::targett end)
remove unnecessary skip statements
Definition: remove_skip.cpp:87
Program Transformation.
#define PRECONDITION(CONDITION)
Definition: invariant.h:463