CBMC
goto_instruction_code.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Data structures representing instructions in a GOTO program
4 
5 Author: Daniel Kroening, dkr@amazon.com
6 
7 \*******************************************************************/
8 
9 #ifndef CPROVER_UTIL_GOTO_INSTRUCTION_CODE_H
10 #define CPROVER_UTIL_GOTO_INSTRUCTION_CODE_H
11 
12 #include <util/cprover_prefix.h>
13 #include <util/std_code_base.h>
14 #include <util/std_expr.h>
15 
17 
23 {
24 public:
26  {
27  operands().resize(2);
28  }
29 
31  : goto_instruction_codet(ID_assign, {std::move(lhs), std::move(rhs)})
32  {
33  }
34 
37  ID_assign,
38  {std::move(lhs), std::move(rhs)},
39  std::move(loc))
40  {
41  }
42 
44  {
45  return op0();
46  }
47 
49  {
50  return op1();
51  }
52 
53  const exprt &lhs() const
54  {
55  return op0();
56  }
57 
58  const exprt &rhs() const
59  {
60  return op1();
61  }
62 
63  static void check(
64  const goto_instruction_codet &code,
66  {
67  DATA_CHECK(
68  vm, code.operands().size() == 2, "assignment must have two operands");
69  }
70 
71  static void validate(
72  const goto_instruction_codet &code,
73  const namespacet &,
75  {
76  check(code, vm);
77 
78  DATA_CHECK(
79  vm,
80  code.op0().type() == code.op1().type(),
81  "lhs and rhs of assignment must have same type");
82  }
83 
84  static void validate_full(
85  const goto_instruction_codet &code,
86  const namespacet &ns,
88  {
89  for(const exprt &op : code.operands())
90  {
91  validate_full_expr(op, ns, vm);
92  }
93 
94  validate(code, ns, vm);
95  }
96 
97 protected:
102 };
103 
104 template <>
105 inline bool can_cast_expr<code_assignt>(const exprt &base)
106 {
107  return detail::can_cast_code_impl(base, ID_assign);
108 }
109 
110 inline void validate_expr(const code_assignt &x)
111 {
113 }
114 
116 {
117  PRECONDITION(code.get_statement() == ID_assign);
118  code_assignt::check(code);
119  return static_cast<const code_assignt &>(code);
120 }
121 
123 {
124  PRECONDITION(code.get_statement() == ID_assign);
125  code_assignt::check(code);
126  return static_cast<code_assignt &>(code);
127 }
128 
132 {
133 public:
135  : goto_instruction_codet(ID_dead, {std::move(symbol)})
136  {
137  }
138 
140  {
141  return static_cast<symbol_exprt &>(op0());
142  }
143 
144  const symbol_exprt &symbol() const
145  {
146  return static_cast<const symbol_exprt &>(op0());
147  }
148 
149  const irep_idt &get_identifier() const
150  {
151  return symbol().get_identifier();
152  }
153 
154  static void check(
155  const goto_instruction_codet &code,
157  {
158  DATA_CHECK(
159  vm,
160  code.operands().size() == 1,
161  "removal (code_deadt) must have one operand");
162  DATA_CHECK(
163  vm,
164  code.op0().id() == ID_symbol,
165  "removing a non-symbol: " + id2string(code.op0().id()) + "from scope");
166  }
167 
168 protected:
173 };
174 
175 template <>
176 inline bool can_cast_expr<code_deadt>(const exprt &base)
177 {
178  return detail::can_cast_code_impl(base, ID_dead);
179 }
180 
181 inline void validate_expr(const code_deadt &x)
182 {
184 }
185 
187 {
188  PRECONDITION(code.get_statement() == ID_dead);
189  code_deadt::check(code);
190  return static_cast<const code_deadt &>(code);
191 }
192 
194 {
195  PRECONDITION(code.get_statement() == ID_dead);
196  code_deadt::check(code);
197  return static_cast<code_deadt &>(code);
198 }
199 
205 {
206 public:
208  : goto_instruction_codet(ID_decl, {std::move(symbol)})
209  {
210  }
211 
213  {
214  return static_cast<symbol_exprt &>(op0());
215  }
216 
217  const symbol_exprt &symbol() const
218  {
219  return static_cast<const symbol_exprt &>(op0());
220  }
221 
222  const irep_idt &get_identifier() const
223  {
224  return symbol().get_identifier();
225  }
226 
227  static void check(
228  const goto_instruction_codet &code,
230  {
231  DATA_CHECK(
232  vm, code.operands().size() == 1, "declaration must have one operand");
233  DATA_CHECK(
234  vm,
235  code.op0().id() == ID_symbol,
236  "declaring a non-symbol: " +
238  }
239 };
240 
241 template <>
242 inline bool can_cast_expr<code_declt>(const exprt &base)
243 {
244  return detail::can_cast_code_impl(base, ID_decl);
245 }
246 
247 inline void validate_expr(const code_declt &x)
248 {
250 }
251 
253 {
254  PRECONDITION(code.get_statement() == ID_decl);
255  code_declt::check(code);
256  return static_cast<const code_declt &>(code);
257 }
258 
260 {
261  PRECONDITION(code.get_statement() == ID_decl);
262  code_declt::check(code);
263  return static_cast<code_declt &>(code);
264 }
265 
272 {
273 public:
274  explicit code_function_callt(exprt _function)
276  ID_function_call,
277  {nil_exprt(), std::move(_function), exprt(ID_arguments)})
278  {
279  }
280 
282 
283  code_function_callt(exprt _lhs, exprt _function, argumentst _arguments)
285  ID_function_call,
286  {std::move(_lhs), std::move(_function), exprt(ID_arguments)})
287  {
288  arguments() = std::move(_arguments);
289  }
290 
291  code_function_callt(exprt _function, argumentst _arguments)
292  : code_function_callt(std::move(_function))
293  {
294  arguments() = std::move(_arguments);
295  }
296 
298  {
299  return op0();
300  }
301 
302  const exprt &lhs() const
303  {
304  return op0();
305  }
306 
307  exprt &function()
308  {
309  return op1();
310  }
311 
312  const exprt &function() const
313  {
314  return op1();
315  }
316 
318  {
319  return op2().operands();
320  }
321 
322  const argumentst &arguments() const
323  {
324  return op2().operands();
325  }
326 
327  static void check(
328  const goto_instruction_codet &code,
330  {
331  DATA_CHECK(
332  vm,
333  code.operands().size() == 3,
334  "function calls must have three operands:\n1) expression to store the "
335  "returned values\n2) the function being called\n3) the vector of "
336  "arguments");
337  }
338 
339  static void validate(
340  const goto_instruction_codet &code,
341  const namespacet &,
343  {
344  check(code, vm);
345 
346  if(code.op0().id() != ID_nil)
347  DATA_CHECK(
348  vm,
349  code.op0().type() == to_code_type(code.op1().type()).return_type(),
350  "function returns expression of wrong type");
351  }
352 
353  static void validate_full(
354  const goto_instruction_codet &code,
355  const namespacet &ns,
357  {
358  for(const exprt &op : code.operands())
359  {
360  validate_full_expr(op, ns, vm);
361  }
362 
363  validate(code, ns, vm);
364  }
365 
366 protected:
371 };
372 
373 template <>
375 {
376  return detail::can_cast_code_impl(base, ID_function_call);
377 }
378 
379 inline void validate_expr(const code_function_callt &x)
380 {
382 }
383 
384 inline const code_function_callt &
386 {
387  PRECONDITION(code.get_statement() == ID_function_call);
389  return static_cast<const code_function_callt &>(code);
390 }
391 
393 {
394  PRECONDITION(code.get_statement() == ID_function_call);
396  return static_cast<code_function_callt &>(code);
397 }
398 
408 {
409 public:
413  explicit code_inputt(
414  std::vector<exprt> arguments,
415  optionalt<source_locationt> location = {});
416 
425  code_inputt(
426  const irep_idt &description,
427  exprt expression,
428  optionalt<source_locationt> location = {});
429 
430  static void check(
431  const goto_instruction_codet &code,
433 };
434 
435 template <>
436 inline bool can_cast_expr<code_inputt>(const exprt &base)
437 {
438  return detail::can_cast_code_impl(base, ID_input);
439 }
440 
441 inline void validate_expr(const code_inputt &input)
442 {
443  code_inputt::check(input);
444 }
445 
455 {
456 public:
460  explicit code_outputt(
461  std::vector<exprt> arguments,
462  optionalt<source_locationt> location = {});
463 
471  code_outputt(
472  const irep_idt &description,
473  exprt expression,
474  optionalt<source_locationt> location = {});
475 
476  static void check(
477  const goto_instruction_codet &code,
479 };
480 
481 template <>
482 inline bool can_cast_expr<code_outputt>(const exprt &base)
483 {
484  return detail::can_cast_code_impl(base, ID_output);
485 }
486 
487 inline void validate_expr(const code_outputt &output)
488 {
489  code_outputt::check(output);
490 }
491 
495 {
496 public:
497  explicit code_returnt(exprt _op)
498  : goto_instruction_codet(ID_return, {std::move(_op)})
499  {
500  }
501 
502  const exprt &return_value() const
503  {
504  return op0();
505  }
506 
508  {
509  return op0();
510  }
511 
512  static void check(
513  const goto_instruction_codet &code,
515  {
516  DATA_CHECK(vm, code.operands().size() == 1, "return must have one operand");
517  }
518 
519 protected:
524 };
525 
526 template <>
527 inline bool can_cast_expr<code_returnt>(const exprt &base)
528 {
529  return detail::can_cast_code_impl(base, ID_return);
530 }
531 
532 inline void validate_expr(const code_returnt &x)
533 {
535 }
536 
538 {
539  PRECONDITION(code.get_statement() == ID_return);
540  code_returnt::check(code);
541  return static_cast<const code_returnt &>(code);
542 }
543 
545 {
546  PRECONDITION(code.get_statement() == ID_return);
547  code_returnt::check(code);
548  return static_cast<code_returnt &>(code);
549 }
550 
562 inline code_function_callt
563 havoc_slice_call(const exprt &p, const exprt &size, const namespacet &ns);
564 
565 #endif // CPROVER_GOTO_PROGRAMS_GOTO_INSTRUCTION_CODE_H
exprt::op2
exprt & op2()
Definition: expr.h:131
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
DATA_CHECK
#define DATA_CHECK(vm, condition, message)
This macro takes a condition which denotes a well-formedness criterion on goto programs,...
Definition: validate.h:22
to_code_function_call
const code_function_callt & to_code_function_call(const goto_instruction_codet &code)
Definition: goto_instruction_code.h:385
exprt::op3
exprt & op3()
Definition: expr.h:134
code_outputt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.cpp:71
code_declt::symbol
const symbol_exprt & symbol() const
Definition: goto_instruction_code.h:217
codet::op0
exprt & op0()
Definition: expr.h:125
code_function_callt::code_function_callt
code_function_callt(exprt _function, argumentst _arguments)
Definition: goto_instruction_code.h:291
code_inputt::code_inputt
code_inputt(std::vector< exprt > arguments, optionalt< source_locationt > location={})
This constructor is for support of calls to __CPROVER_input in user code.
Definition: goto_instruction_code.cpp:21
code_assignt::rhs
exprt & rhs()
Definition: goto_instruction_code.h:48
code_assignt::code_assignt
code_assignt(exprt lhs, exprt rhs)
Definition: goto_instruction_code.h:30
code_assignt::lhs
const exprt & lhs() const
Definition: goto_instruction_code.h:53
to_code_dead
const code_deadt & to_code_dead(const goto_instruction_codet &code)
Definition: goto_instruction_code.h:186
code_declt
A goto_instruction_codet representing the declaration of a local variable.
Definition: goto_instruction_code.h:204
code_returnt::code_returnt
code_returnt(exprt _op)
Definition: goto_instruction_code.h:497
exprt::exprt
exprt()
Definition: expr.h:61
exprt
Base class for all expressions.
Definition: expr.h:55
exprt::op0
exprt & op0()
Definition: expr.h:125
to_code_decl
const code_declt & to_code_decl(const goto_instruction_codet &code)
Definition: goto_instruction_code.h:252
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
code_declt::get_identifier
const irep_idt & get_identifier() const
Definition: goto_instruction_code.h:222
code_function_callt::lhs
exprt & lhs()
Definition: goto_instruction_code.h:297
code_assignt::validate
static void validate(const goto_instruction_codet &code, const namespacet &, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:71
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
code_outputt
A goto_instruction_codet representing the declaration that an output of a particular description has ...
Definition: goto_instruction_code.h:454
code_deadt::code_deadt
code_deadt(symbol_exprt symbol)
Definition: goto_instruction_code.h:134
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
code_function_callt
goto_instruction_codet representation of a function call statement.
Definition: goto_instruction_code.h:271
code_outputt::code_outputt
code_outputt(std::vector< exprt > arguments, optionalt< source_locationt > location={})
This constructor is for support of calls to __CPROVER_output in user code.
Definition: goto_instruction_code.cpp:49
std_code_base.h
to_code_type
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
Definition: std_types.h:744
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition: std_expr.h:142
can_cast_expr< code_function_callt >
bool can_cast_expr< code_function_callt >(const exprt &base)
Definition: goto_instruction_code.h:374
nil_exprt
The NIL expression.
Definition: std_expr.h:3025
validate_expr
void validate_expr(const code_assignt &x)
Definition: goto_instruction_code.h:110
code_assignt::lhs
exprt & lhs()
Definition: goto_instruction_code.h:43
code_returnt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:512
exprt::op1
exprt & op1()
Definition: expr.h:128
code_function_callt::arguments
const argumentst & arguments() const
Definition: goto_instruction_code.h:322
to_symbol_expr
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition: std_expr.h:222
validation_modet
validation_modet
Definition: validation_mode.h:12
code_deadt::symbol
symbol_exprt & symbol()
Definition: goto_instruction_code.h:139
irept::id
const irep_idt & id() const
Definition: irep.h:396
code_assignt::code_assignt
code_assignt(exprt lhs, exprt rhs, source_locationt loc)
Definition: goto_instruction_code.h:35
exprt::operandst
std::vector< exprt > operandst
Definition: expr.h:58
code_function_callt::argumentst
exprt::operandst argumentst
Definition: goto_instruction_code.h:281
code_function_callt::validate
static void validate(const goto_instruction_codet &code, const namespacet &, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:339
can_cast_expr< code_assignt >
bool can_cast_expr< code_assignt >(const exprt &base)
Definition: goto_instruction_code.h:105
can_cast_expr< code_returnt >
bool can_cast_expr< code_returnt >(const exprt &base)
Definition: goto_instruction_code.h:527
code_deadt
A goto_instruction_codet representing the removal of a local variable going out of scope.
Definition: goto_instruction_code.h:131
cprover_prefix.h
code_function_callt::code_function_callt
code_function_callt(exprt _lhs, exprt _function, argumentst _arguments)
Definition: goto_instruction_code.h:283
code_function_callt::arguments
argumentst & arguments()
Definition: goto_instruction_code.h:317
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
code_declt::symbol
symbol_exprt & symbol()
Definition: goto_instruction_code.h:212
code_assignt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:63
code_function_callt::code_function_callt
code_function_callt(exprt _function)
Definition: goto_instruction_code.h:274
source_locationt
Definition: source_location.h:18
can_cast_expr< code_outputt >
bool can_cast_expr< code_outputt >(const exprt &base)
Definition: goto_instruction_code.h:482
code_function_callt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:327
code_declt::code_declt
code_declt(symbol_exprt symbol)
Definition: goto_instruction_code.h:207
code_returnt
goto_instruction_codet representation of a "return from a function" statement.
Definition: goto_instruction_code.h:494
can_cast_expr< code_deadt >
bool can_cast_expr< code_deadt >(const exprt &base)
Definition: goto_instruction_code.h:176
code_deadt::symbol
const symbol_exprt & symbol() const
Definition: goto_instruction_code.h:144
can_cast_expr< code_declt >
bool can_cast_expr< code_declt >(const exprt &base)
Definition: goto_instruction_code.h:242
code_inputt
A goto_instruction_codet representing the declaration that an input of a particular description has a...
Definition: goto_instruction_code.h:407
code_assignt::code_assignt
code_assignt()
Definition: goto_instruction_code.h:25
can_cast_expr< code_inputt >
bool can_cast_expr< code_inputt >(const exprt &base)
Definition: goto_instruction_code.h:436
validate_full_expr
void validate_full_expr(const exprt &expr, const namespacet &ns, const validation_modet vm)
Check that the given expression is well-formed (full check, including checks of all subexpressions an...
Definition: validate_expressions.cpp:114
code_declt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:227
code_typet::return_type
const typet & return_type() const
Definition: std_types.h:645
code_assignt::validate_full
static void validate_full(const goto_instruction_codet &code, const namespacet &ns, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:84
code_inputt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.cpp:43
exprt::operands
operandst & operands()
Definition: expr.h:94
codet::op1
exprt & op1()
Definition: expr.h:128
code_deadt::get_identifier
const irep_idt & get_identifier() const
Definition: goto_instruction_code.h:149
code_returnt::return_value
const exprt & return_value() const
Definition: goto_instruction_code.h:502
code_assignt
A goto_instruction_codet representing an assignment in the program.
Definition: goto_instruction_code.h:22
codet::get_statement
const irep_idt & get_statement() const
Definition: std_code_base.h:65
code_function_callt::lhs
const exprt & lhs() const
Definition: goto_instruction_code.h:302
havoc_slice_call
code_function_callt havoc_slice_call(const exprt &p, const exprt &size, const namespacet &ns)
Builds a code_function_callt to __CPROVER_havoc_slice(p, size).
Definition: goto_instruction_code.cpp:78
std_expr.h
code_deadt::check
static void check(const goto_instruction_codet &code, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:154
to_code_return
const code_returnt & to_code_return(const goto_instruction_codet &code)
Definition: goto_instruction_code.h:537
code_returnt::return_value
exprt & return_value()
Definition: goto_instruction_code.h:507
code_assignt::rhs
const exprt & rhs() const
Definition: goto_instruction_code.h:58
detail::can_cast_code_impl
bool can_cast_code_impl(const exprt &expr, const Tag &tag)
Definition: std_code_base.h:84
to_code_assign
const code_assignt & to_code_assign(const goto_instruction_codet &code)
Definition: goto_instruction_code.h:115
validation_modet::INVARIANT
@ INVARIANT
code_function_callt::validate_full
static void validate_full(const goto_instruction_codet &code, const namespacet &ns, const validation_modet vm=validation_modet::INVARIANT)
Definition: goto_instruction_code.h:353
codet
Data structure for representing an arbitrary statement in a program.
Definition: std_code_base.h:28