CBMC
stack_depth.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Stack depth checks
4 
5 Author: Daniel Kroening, Michael Tautschnig
6 
7 Date: November 2011
8 
9 \*******************************************************************/
10 
13 
14 #include "stack_depth.h"
15 
16 #include <util/arith_tools.h>
17 #include <util/bitvector_types.h>
18 
21 
23 
25  goto_modelt &goto_model,
26  message_handlert &message_handler)
27 {
28  const irep_idt identifier="$stack_depth";
29  unsignedbv_typet type(sizeof(std::size_t)*8);
30 
31  symbolt new_symbol;
32  new_symbol.name=identifier;
33  new_symbol.base_name=identifier;
34  new_symbol.pretty_name=identifier;
35  new_symbol.type=type;
36  new_symbol.is_static_lifetime=true;
37  new_symbol.value=from_integer(0, type);
38  new_symbol.mode=ID_C;
39  new_symbol.is_thread_local=true;
40  new_symbol.is_lvalue=true;
41 
42  bool failed = goto_model.symbol_table.add(new_symbol);
44 
45  if(goto_model.goto_functions.function_map.erase(INITIALIZE_FUNCTION) != 0)
46  {
48  goto_model.symbol_table,
52  goto_model.symbol_table,
53  goto_model.goto_functions,
54  message_handler);
55  goto_model.goto_functions.update();
56  }
57 
58  return new_symbol.symbol_expr();
59 }
60 
61 static void stack_depth(
62  goto_programt &goto_program,
63  const symbol_exprt &symbol,
64  const std::size_t i_depth,
65  const exprt &max_depth)
66 {
67  assert(!goto_program.instructions.empty());
68 
69  goto_programt::targett first=goto_program.instructions.begin();
70 
71  binary_relation_exprt guard(symbol, ID_le, max_depth);
72  goto_programt::targett assert_ins = goto_program.insert_before(
73  first, goto_programt::make_assertion(guard, first->source_location()));
74 
75  assert_ins->source_location_nonconst().set_comment(
76  "Stack depth exceeds " + std::to_string(i_depth));
77  assert_ins->source_location_nonconst().set_property_class("stack-depth");
78 
79  goto_program.insert_before(
80  first,
82  code_assignt(symbol, plus_exprt(symbol, from_integer(1, symbol.type()))),
83  first->source_location()));
84 
85  goto_programt::targett last=--goto_program.instructions.end();
86  assert(last->is_end_function());
87 
89  code_assignt(symbol, minus_exprt(symbol, from_integer(1, symbol.type()))),
90  last->source_location());
91 
92  goto_program.insert_before_swap(last, minus_ins);
93 }
94 
96  goto_modelt &goto_model,
97  const std::size_t depth,
98  message_handlert &message_handler)
99 {
100  const symbol_exprt sym = add_stack_depth_symbol(goto_model, message_handler);
101 
102  const exprt depth_expr(from_integer(depth, sym.type()));
103 
104  for(auto &gf_entry : goto_model.goto_functions.function_map)
105  {
106  if(
107  gf_entry.second.body_available() &&
108  gf_entry.first != INITIALIZE_FUNCTION &&
109  gf_entry.first != goto_functionst::entry_point())
110  {
111  stack_depth(gf_entry.second.body, sym, depth, depth_expr);
112  }
113  }
114 
115  // update counters etc.
116  goto_model.goto_functions.update();
117 }
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
symbol_table_baset::lookup_ref
const symbolt & lookup_ref(const irep_idt &name) const
Find a symbol in the symbol table for read-only access.
Definition: symbol_table_base.h:104
arith_tools.h
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
symbolt::type
typet type
Type of symbol.
Definition: symbol.h:31
goto_model.h
plus_exprt
The plus expression Associativity is not specified.
Definition: std_expr.h:946
exprt
Base class for all expressions.
Definition: expr.h:55
goto_modelt
Definition: goto_model.h:25
symbolt::base_name
irep_idt base_name
Base (non-scoped) name.
Definition: symbol.h:46
to_string
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Definition: string_constraint.cpp:58
goto_functionst::function_map
function_mapt function_map
Definition: goto_functions.h:29
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
goto_programt::make_assignment
static instructiont make_assignment(const code_assignt &_code, const source_locationt &l=source_locationt::nil())
Create an assignment instruction.
Definition: goto_program.h:1056
unsignedbv_typet
Fixed-width bit-vector with unsigned binary interpretation.
Definition: bitvector_types.h:158
symbolt::pretty_name
irep_idt pretty_name
Language-specific display name.
Definition: symbol.h:52
goto_convert
void goto_convert(const codet &code, symbol_table_baset &symbol_table, goto_programt &dest, message_handlert &message_handler, const irep_idt &mode)
Definition: goto_convert.cpp:1905
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
symbolt::is_thread_local
bool is_thread_local
Definition: symbol.h:65
goto_programt::insert_before
targett insert_before(const_targett target)
Insertion before the instruction pointed-to by the given instruction iterator target.
Definition: goto_program.h:662
goto_programt::make_assertion
static instructiont make_assertion(const exprt &g, const source_locationt &l=source_locationt::nil())
Definition: goto_program.h:924
symbolt::mode
irep_idt mode
Language mode.
Definition: symbol.h:49
failed
static bool failed(bool error_indicator)
Definition: symtab2gb_parse_options.cpp:39
add_stack_depth_symbol
static symbol_exprt add_stack_depth_symbol(goto_modelt &goto_model, message_handlert &message_handler)
Definition: stack_depth.cpp:24
bitvector_types.h
symbolt::symbol_expr
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
Definition: symbol.cpp:121
INITIALIZE_FUNCTION
#define INITIALIZE_FUNCTION
Definition: static_lifetime_init.h:22
stack_depth
static void stack_depth(goto_programt &goto_program, const symbol_exprt &symbol, const std::size_t i_depth, const exprt &max_depth)
Definition: stack_depth.cpp:61
message_handlert
Definition: message.h:27
minus_exprt
Binary minus.
Definition: std_expr.h:1005
symbol_table_baset::add
bool add(const symbolt &symbol)
Add a new symbol to the symbol table.
Definition: symbol_table_base.cpp:18
goto_programt::instructions
instructionst instructions
The list of instructions in the goto program.
Definition: goto_program.h:592
symbolt::value
exprt value
Initial value of symbol.
Definition: symbol.h:34
stack_depth.h
goto_modelt::goto_functions
goto_functionst goto_functions
GOTO functions.
Definition: goto_model.h:33
symbolt::location
source_locationt location
Source code location of definition of symbol.
Definition: symbol.h:37
symbolt
Symbol table entry.
Definition: symbol.h:27
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
static_lifetime_init
static optionalt< codet > static_lifetime_init(const irep_idt &identifier, symbol_tablet &symbol_table)
Definition: static_lifetime_init.cpp:22
binary_relation_exprt
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition: std_expr.h:706
goto_functionst::update
void update()
Definition: goto_functions.h:83
symbolt::is_static_lifetime
bool is_static_lifetime
Definition: symbol.h:65
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:72
symbolt::is_lvalue
bool is_lvalue
Definition: symbol.h:66
goto_functionst::entry_point
static irep_idt entry_point()
Get the identifier of the entry point to a goto model.
Definition: goto_functions.h:92
goto_convert_functions.h
static_lifetime_init.h
goto_programt::insert_before_swap
void insert_before_swap(targett target)
Insertion that preserves jumps to "target".
Definition: goto_program.h:613
code_assignt
A goto_instruction_codet representing an assignment in the program.
Definition: goto_instruction_code.h:22
goto_programt::instructiont
This class represents an instruction in the GOTO intermediate representation.
Definition: goto_program.h:180
exprt::source_location
const source_locationt & source_location() const
Definition: expr.h:211
goto_modelt::symbol_table
symbol_tablet symbol_table
Symbol table.
Definition: goto_model.h:30
symbolt::name
irep_idt name
The unique identifier.
Definition: symbol.h:40
goto_programt::targett
instructionst::iterator targett
Definition: goto_program.h:586