CBMC
invariant_set_domain.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Invariant Set Domain
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #include "invariant_set_domain.h"
13 
14 #include <util/expr_util.h>
15 #include <util/simplify_expr.h>
16 
18  const irep_idt &function_from,
19  trace_ptrt trace_from,
20  const irep_idt &function_to,
21  trace_ptrt trace_to,
22  ai_baset &ai,
23  const namespacet &ns)
24 {
25  locationt from_l(trace_from->current_location());
26  locationt to_l(trace_to->current_location());
27 
28  switch(from_l->type())
29  {
30  case GOTO:
31  {
32  // Comparing iterators is safe as the target must be within the same list
33  // of instructions because this is a GOTO.
34  exprt tmp(from_l->condition());
35 
36  if(std::next(from_l) == to_l)
37  tmp = boolean_negate(tmp);
38 
39  simplify(tmp, ns);
41  }
42  break;
43 
44  case ASSERT:
45  case ASSUME:
46  {
47  exprt tmp(from_l->condition());
48  simplify(tmp, ns);
50  }
51  break;
52 
53  case SET_RETURN_VALUE:
54  // ignore
55  break;
56 
57  case ASSIGN:
58  invariant_set.assignment(from_l->assign_lhs(), from_l->assign_rhs());
59  break;
60 
61  case OTHER:
62  if(from_l->get_other().is_not_nil())
63  invariant_set.apply_code(from_l->code());
64  break;
65 
66  case DECL:
67  invariant_set.apply_code(from_l->code());
68  break;
69 
70  case FUNCTION_CALL:
71  invariant_set.apply_code(from_l->code());
72  break;
73 
74  case START_THREAD:
76  break;
77 
78  case CATCH:
79  case THROW:
80  DATA_INVARIANT(false, "Exceptions must be removed before analysis");
81  break;
82  case DEAD: // No action required
83  case ATOMIC_BEGIN: // Ignoring is a valid over-approximation
84  case ATOMIC_END: // Ignoring is a valid over-approximation
85  case END_FUNCTION: // No action required
86  case LOCATION: // No action required
87  case END_THREAD: // Require a concurrent analysis at higher level
88  case SKIP: // No action required
89  break;
90  case INCOMPLETE_GOTO:
92  DATA_INVARIANT(false, "Only complete instructions can be analyzed");
93  break;
94  }
95 }
invariant_sett::strengthen
void strengthen(const exprt &expr)
Definition: invariant_set.cpp:375
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
SET_RETURN_VALUE
@ SET_RETURN_VALUE
Definition: goto_program.h:45
invariant_set_domain.h
invariant_sett::make_threaded
void make_threaded()
Definition: invariant_set.h:135
exprt
Base class for all expressions.
Definition: expr.h:55
ai_domain_baset::trace_ptrt
ai_history_baset::trace_ptrt trace_ptrt
Definition: ai_domain.h:74
invariant_sett::apply_code
void apply_code(const codet &code)
Definition: invariant_set.cpp:1046
coverage_criteriont::ASSUME
@ ASSUME
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
THROW
@ THROW
Definition: goto_program.h:50
coverage_criteriont::LOCATION
@ LOCATION
GOTO
@ GOTO
Definition: goto_program.h:34
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
boolean_negate
exprt boolean_negate(const exprt &src)
negate a Boolean expression, possibly removing a not_exprt, and swapping false and true
Definition: expr_util.cpp:127
simplify
bool simplify(exprt &expr, const namespacet &ns)
Definition: simplify_expr.cpp:2926
NO_INSTRUCTION_TYPE
@ NO_INSTRUCTION_TYPE
Definition: goto_program.h:33
OTHER
@ OTHER
Definition: goto_program.h:37
END_FUNCTION
@ END_FUNCTION
Definition: goto_program.h:42
SKIP
@ SKIP
Definition: goto_program.h:38
simplify_expr.h
expr_util.h
Deprecated expression utility functions.
ASSIGN
@ ASSIGN
Definition: goto_program.h:46
ai_domain_baset::locationt
goto_programt::const_targett locationt
Definition: ai_domain.h:73
invariant_set_domaint::invariant_set
invariant_sett invariant_set
Definition: invariant_set_domain.h:32
CATCH
@ CATCH
Definition: goto_program.h:51
DECL
@ DECL
Definition: goto_program.h:47
invariant_sett::assignment
void assignment(const exprt &lhs, const exprt &rhs)
Definition: invariant_set.cpp:1029
ai_baset
This is the basic interface of the abstract interpreter with default implementations of the core func...
Definition: ai.h:118
START_THREAD
@ START_THREAD
Definition: goto_program.h:39
FUNCTION_CALL
@ FUNCTION_CALL
Definition: goto_program.h:49
ATOMIC_END
@ ATOMIC_END
Definition: goto_program.h:44
DEAD
@ DEAD
Definition: goto_program.h:48
ATOMIC_BEGIN
@ ATOMIC_BEGIN
Definition: goto_program.h:43
ASSERT
@ ASSERT
Definition: goto_program.h:36
invariant_set_domaint::transform
virtual 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) final override
how function calls are treated: a) there is an edge from each call site to the function head b) there...
Definition: invariant_set_domain.cpp:17
END_THREAD
@ END_THREAD
Definition: goto_program.h:40
INCOMPLETE_GOTO
@ INCOMPLETE_GOTO
Definition: goto_program.h:52