ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
goto_convert_class.h
Go to the documentation of this file.
1#ifndef CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
2#define CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
3
5#include <list>
6#include <optional>
7#include <queue>
8#include <set>
9#include <stack>
10#include <util/expr/expr_util.h>
11#include <irep2/irep2_guard.h>
13#include <util/config/options.h>
15#include <util/irep/std_code.h>
16
18{
19public:
20 void goto_convert(const codet &code, goto_programt &dest);
21
23 static bool is_atomic_symbol(const exprt &expr, const namespacet &ns);
24
28 static bool has_atomic_read(const exprt &expr, const namespacet &ns);
29
30 goto_convertt(contextt &_context, optionst &_options)
31 : context(_context),
32 options(_options),
33 ns(_context),
34 tmp_symbol("goto_convertt::")
35 {
36 }
37
38protected:
43
44 void goto_convert_rec(const codet &code, goto_programt &dest);
45
46 //
47 // tools for symbols
48 //
49 void new_name(symbolt &symbol);
50
51 symbolt &new_tmp_symbol(const typet &type);
53
54 //
55 // side effect removal
56 //
57 void make_temp_symbol(exprt &expr, goto_programt &dest);
58
59 // this produces if(guard) dest;
60 void guard_program(const guard2tc &guard, goto_programt &dest);
61
63 exprt &expr,
64 goto_programt &dest,
65 bool result_is_used = true);
66
67 // IREP2 dual-API seam (W1, esbmc/esbmc#4715): delegates to the legacy
68 // exprt overload above; behaviour-identical by construction.
70 expr2tc &expr,
71 goto_programt &dest,
72 bool result_is_used = true);
73
78 bool in_short_circuit = false;
79
80 // Recursively flatten a (possibly nested) &&/|| contract clause
81 // (__ESBMC_requires / __ESBMC_ensures), hoisting side effects (e.g.
82 // __ESBMC_old()) only at the leaves so no conjunct is dropped (#6298).
83 void flatten_contract_clause(exprt &clause, goto_programt &dest);
84
86
87 bool rewrite_vla_decl(typet &var_type, goto_programt &dest);
88 bool rewrite_vla_decl_size(exprt &size, goto_programt &dest);
90 exprt &var,
91 const locationt &loc,
92 goto_programt &dest,
93 bool allow_zero_size = false);
94
95 bool has_sideeffect(const exprt &expr);
96 // IREP2 overload (W1, esbmc/esbmc#4715): native recursive scan for a
97 // sideeffect2t node, mirroring the legacy exprt overload above.
98 bool has_sideeffect(const expr2tc &expr);
100 bool has_destructible_sideeffect(const exprt &expr);
101 bool splits_and_condition(const exprt &cond);
102
103 // Used by remove_sideeffects() to process a quantifier body expression.
104 // Recursively walks || and && sub-expressions without converting them to
105 // short-circuit ITE chains, so that bound variables remain reachable by
106 // replace_name_in_body() in smt_solver.cpp. @p bound_vars holds the
107 // identifiers bound by the enclosing quantifiers.
109 exprt &body,
110 const std::set<irep_idt> &bound_vars,
111 goto_programt &dest);
112 void inline_calls_in_quantifier_body(exprt &expr, unsigned depth);
113 bool try_inline_pure_call(const symbolt &fsym, const exprt &call, exprt &out);
114 // Summarize a callee with straight-line assignments, if/else, and
115 // constant-trip-count loops into a single side-effect-free expression so it
116 // can appear in a quantifier body. Returns false (leaving @p out untouched)
117 // for any shape it cannot soundly turn into a pure expression.
118 bool summarize_pure_call(const symbolt &fsym, const exprt &call, exprt &out);
119 // Why summarize_pure_call() gave up, keyed by callsite location, so that
120 // the rejection reported for a quantifier body can name the cause.
121 std::map<std::string, std::string> summary_reject_reasons;
123 const exprt &expr,
124 const std::set<irep_idt> &bound_vars);
126 // Rewrite __ESBMC_forall/__ESBMC_exists intrinsic calls into forall/exists
127 // expressions, summarizing calls in the body first, before any hoisting can
128 // freeze the bound variable. Bodies that cannot be made side-effect-free are
129 // left as calls for the skolemization / quantifier-body fallbacks.
131
132 void remove_assignment(exprt &expr, goto_programt &dest, bool result_is_used);
133 void remove_post(exprt &expr, goto_programt &dest, bool result_is_used);
134 void remove_pre(exprt &expr, goto_programt &dest, bool result_is_used);
135 void
136 remove_function_call(exprt &expr, goto_programt &dest, bool result_is_used);
137 void remove_cpp_new(exprt &expr, goto_programt &dest, bool result_is_used);
138 void remove_cpp_delete(exprt &expr, goto_programt &dest);
140 void drop_destructor(const symbol_exprt &object, std::size_t from);
143 exprt &expr,
144 goto_programt &dest,
145 bool result_is_used);
147
148 virtual void
149 do_cpp_new(const exprt &lhs, const exprt &rhs, goto_programt &dest);
150
151 static void replace_new_object(const exprt &object, exprt &dest);
152
153 void cpp_new_at(
154 const exprt &lhs,
155 const exprt &placement,
156 const locationt &location,
157 goto_programt &dest);
158
160 const exprt &lhs,
161 const exprt &rhs,
162 const exprt &elem_count,
163 goto_programt &dest);
164
166 const exprt &lhs,
167 const exprt &rhs,
168 const exprt &elem_count,
169 goto_programt &dest);
170
172 const exprt &base,
173 const exprt &offset,
174 const exprt &init,
175 const locationt &location,
176 const exprt &built,
177 code_blockt &out);
178
180 const exprt &lhs,
181 const exprt &rhs,
182 const exprt &init,
183 const exprt &elem_count,
184 const exprt &built,
185 code_blockt &out);
186
188 const exprt &base,
189 const exprt &built,
190 const codet &construction,
191 goto_programt &dest);
192
193 bool user_code_throws();
194 std::optional<bool> user_code_throws_cache;
195
196 //
197 // function calls
198 //
199
200 virtual void do_function_call(
201 const exprt &lhs,
202 const exprt &function,
203 const exprt::operandst &arguments,
204 const locationt &location,
205 goto_programt &dest);
206
207 virtual void do_function_call_if(
208 const exprt &lhs,
209 const exprt &function,
210 const exprt::operandst &arguments,
211 goto_programt &dest);
212
216 bool drop_inactive_contract_clause(bool is_clause) const;
217
218 virtual void do_function_call_symbol(
219 const exprt &lhs,
220 const exprt &function,
221 const exprt::operandst &arguments,
222 goto_programt &dest);
223
224 virtual void do_function_call_dereference(
225 const exprt &lhs,
226 const exprt &function,
227 const exprt::operandst &arguments,
228 goto_programt &dest);
229
230 //
231 // conversion
232 //
233 void convert_block(const codet &code, goto_programt &dest);
234 void convert_controlled(const codet &code, goto_programt &dest);
235 void convert_decl(const codet &code, goto_programt &dest);
236 void discard_comma_operands(exprt &initializer, goto_programt &dest);
237 void remove_comma_operand(exprt &operand, goto_programt &dest);
239 std::size_t stack_size,
240 const locationt &location,
241 goto_programt &dest);
243 std::set<irep_idt> comma_operand_temporaries;
245 const exprt &var,
246 exprt &initializer,
247 const codet &new_code,
248 const symbolt &s,
249 goto_programt &dest);
251 const exprt &object,
252 const exprt &initializer,
253 goto_programt &dest);
255 const exprt &object,
256 exprt &initializer,
257 goto_programt &dest);
259 const codet &decl,
260 const symbolt &s,
261 const symbolt &guard,
262 goto_programt &dest);
264 const exprt &base,
265 const typet &type,
267 goto_programt &dest);
268 void schedule_array_element_destructors(const exprt &base, const typet &type);
269
270 void convert_decl_block(const codet &code, goto_programt &dest);
271 void convert_expression(const codet &code, goto_programt &dest);
272 void convert_assign(const code_assignt &code, goto_programt &dest);
274 const exprt &lhs,
275 const exprt &rhs,
276 const locationt &location,
277 goto_programt &dest);
279 const exprt &lhs,
280 const exprt &rhs,
281 const locationt &location,
282 goto_programt &dest);
283 void convert_cpp_delete(const codet &code, goto_programt &dest);
284 void convert_for(const codet &code, goto_programt &dest);
285 void convert_while(const codet &code, goto_programt &dest);
286 void convert_dowhile(const codet &code, goto_programt &dest);
287 void convert_assume(const codet &code, goto_programt &dest);
288 void convert_assert(const codet &code, goto_programt &dest);
289 bool emits_assert(const locationt &location) const;
291 const expr2tc &guard,
292 const locationt &location,
293 goto_programt &dest);
294 void convert_switch(const codet &code, goto_programt &dest);
295 void convert_break(const code_breakt &code, goto_programt &dest);
296 void convert_return(const code_returnt &code, goto_programt &dest);
298 void convert_continue(const code_continuet &code, goto_programt &dest);
299 void convert_ifthenelse(const codet &code, goto_programt &dest);
300 void convert_init(const codet &code, goto_programt &dest);
301 void convert_goto(const codet &code, goto_programt &dest);
302 void convert_skip(const codet &code, goto_programt &dest);
303 void convert_non_deterministic_goto(const codet &code, goto_programt &dest);
304 void convert_label(const code_labelt &code, goto_programt &dest);
305 void convert_switch_case(const code_switch_caset &code, goto_programt &dest);
306 void
308 void convert_atomic_begin(const codet &code, goto_programt &dest);
309 void convert_atomic_end(const codet &code, goto_programt &dest);
310 void convert(const codet &code, goto_programt &dest);
311 void copy(
312 const codet &code,
314 goto_programt &dest);
315
316 typedef std::vector<codet> destructor_stackt;
317
320 void convert_full_expression(const codet &code, goto_programt &dest);
325 std::size_t stack_size,
326 const locationt &,
327 goto_programt &dest);
329 const exprt &initializer,
330 std::size_t stack_size);
332 const locationt &,
333 std::size_t stack_size,
334 goto_programt &dest);
336 const locationt &,
337 std::size_t stack_size,
338 goto_programt &dest,
339 destructor_stackt &stack);
343 const destructor_stackt &stack,
344 std::size_t from,
345 const locationt &location,
346 goto_programt &dest);
351 std::size_t switch_stack_size,
352 const locationt &location,
353 goto_programt &stubs);
356 static bool is_destructor_entry(const codet &entry);
363 std::size_t stack_size,
364 const locationt &location,
365 goto_programt &branch,
368 exprt &cond,
369 std::size_t true_size,
370 std::size_t false_size,
371 const locationt &location,
372 goto_programt &dest);
374
375 //
376 // Try-catch conversion
377 //
378
379 void convert_catch(const codet &code, goto_programt &dest);
380 void convert_throw(const exprt &expr, goto_programt &dest);
381
382 //
383 // gotos
384 //
385
386 void finish_gotos(goto_programt &dest);
388
389 typedef std::
390 map<irep_idt, std::pair<goto_programt::targett, destructor_stackt>>
392 typedef std::list<std::pair<goto_programt::targett, destructor_stackt>>
394 typedef std::list<goto_programt::targett> computed_gotost;
396 typedef std::list<std::pair<goto_programt::targett, caset>> casest;
397 typedef std::map<goto_programt::targett, casest::iterator> cases_mapt;
398 typedef std::map<goto_programt::targett, destructor_stackt> case_stackst;
399
400 struct targetst
401 {
404
409
414
417
420
435
437 {
438 break_set = true;
439 break_target = _break_target;
441 }
442
444 {
445 continue_set = true;
446 continue_target = _continue_target;
448 }
449
451 {
452 default_set = true;
453 default_target = _default_target;
454 }
455
457 {
458 return_set = true;
459 return_target = _return_target;
460 }
461
463 {
464 throw_set = true;
465 throw_target = _throw_target;
467 }
468
470 {
471 leave_set = true;
472 leave_target = _leave_target;
474 }
476
478 {
479 // for 'while', 'for', 'dowhile'
480
482 {
483 break_set = targets.break_set;
484 continue_set = targets.continue_set;
485 break_target = targets.break_target;
486 continue_target = targets.continue_target;
487 break_stack_size = targets.break_stack_size;
488 continue_stack_size = targets.continue_stack_size;
489 }
490
491 // An outer break or continue after this construct must unwind to the
492 // outer depth, not to this one's.
494 {
495 targets.break_set = break_set;
496 targets.continue_set = continue_set;
497 targets.break_target = break_target;
498 targets.continue_target = continue_target;
499 targets.break_stack_size = break_stack_size;
500 targets.continue_stack_size = continue_stack_size;
501 }
502
507 };
508
510 {
511 // for 'switch'
512
514 {
515 break_set = targets.break_set;
516 default_set = targets.default_set;
517 break_target = targets.break_target;
518 default_target = targets.default_target;
519 break_stack_size = targets.break_stack_size;
520 cases = targets.cases;
521 cases_map = targets.cases_map;
522 case_stacks = targets.case_stacks;
523 }
524
526 {
527 targets.break_set = break_set;
528 targets.default_set = default_set;
529 targets.break_target = break_target;
530 targets.default_target = default_target;
531 targets.break_stack_size = break_stack_size;
532 targets.cases = cases;
533 targets.cases_map = cases_map;
534 targets.case_stacks = case_stacks;
535 }
536
540 std::size_t break_stack_size;
541
545 };
546
548 {
549 // for 'try...catch' and the like
550
552 {
553 throw_set = targets.throw_set;
554 throw_target = targets.throw_target;
555 throw_stack_size = targets.destructor_stack.size();
556 }
557
559 {
560 targets.throw_set = throw_set;
561 targets.throw_target = throw_target;
562 }
563
566 std::size_t throw_stack_size;
567 };
568
569 void case_guard(const exprt &value, const caset &case_op, exprt &dest);
570 static exprt case_label(const exprt &lo, const exprt &hi);
571
572 // if(cond) { true_case } else { false_case }
574 const exprt &cond,
575 goto_programt &true_case,
576 goto_programt &false_case,
577 const locationt &location,
578 goto_programt &dest);
579
580 // if(guard) goto target_true; else goto target_false;
582 const exprt &guard,
583 goto_programt::targett target_true,
584 goto_programt::targett target_false,
585 const locationt &location,
586 goto_programt &dest);
587
588 // if(guard) goto target;
590 const exprt &guard,
591 goto_programt::targett target_true,
592 const locationt &location,
593 goto_programt &dest);
594
595 // turn a OP b OP c into a list a, b, c
596 static void collect_operands(
597 const exprt &expr,
598 const irep_idt &id,
599 std::list<exprt> &dest);
600
601 // Emit the post-noreturn truncation for __assert_fail-family calls
602 // (__assert_fail / __assert_rtn / FreeBSD __assert / _wassert) under
603 // --no-assertions. Fires only when --memory-leak-check is enabled
604 // (i.e. valid-memsafety / valid-memcleanup): the leak walker is
605 // invoked --- mirroring abort()'s body in
606 // src/c2goto/library/stdlib.c --- and then ASSUME false truncates
607 // the path. Otherwise the call is a no-op so user assert(cond)
608 // does not silently become assume(cond) under property modes that
609 // intentionally suppress assertions (no-data-race, plain
610 // --no-assertions). See PR #4442 review for the no-data-race
611 // regression that motivated the gate.
612 void
613 emit_assert_fail_noreturn(const locationt &location, goto_programt &dest);
614
615 // Lower a value-discarding `&&` / `||` as a statement; false when the caller
616 // should fall back to rewrite_short_circuit_as_ternary.
618 exprt &expr,
619 goto_programt &dest,
620 bool result_is_used);
621
623
624 // The same four hooks differ only in arity and in which argument carries the
625 // failing expression; `expr_arg` names the latter.
626 void do_assert_fail(
627 const exprt &function,
628 const exprt::operandst &arguments,
629 goto_programt &dest,
630 const irep_idt &base_name,
631 std::size_t arity,
632 std::size_t expr_arg);
633
634 // some built-in functions
636 const exprt &lhs,
637 const exprt &rhs,
638 const exprt::operandst &arguments,
639 goto_programt &dest);
640 void do_atomic_begin(
641 const exprt &lhs,
642 const exprt &rhs,
643 const exprt::operandst &arguments,
644 goto_programt &dest);
645 void do_atomic_end(
646 const exprt &lhs,
647 const exprt &rhs,
648 const exprt::operandst &arguments,
649 goto_programt &dest);
651 const exprt &lhs,
652 const exprt &rhs,
653 const exprt::operandst &arguments,
654 goto_programt &dest);
655 void do_malloc(
656 const exprt &lhs,
657 const exprt &rhs,
658 const exprt::operandst &arguments,
659 goto_programt &dest);
660 void do_realloc(
661 const exprt &lhs,
662 const exprt &rhs,
663 const exprt::operandst &arguments,
664 goto_programt &dest);
665 void do_alloca(
666 const exprt &lhs,
667 const exprt &rhs,
668 const exprt::operandst &arguments,
669 goto_programt &dest);
670 void do_free(
671 const exprt &lhs,
672 const exprt &rhs,
673 const exprt::operandst &arguments,
674 goto_programt &dest);
676 const exprt &lhs,
677 const exprt &rhs,
678 const exprt::operandst &arguments,
679 goto_programt &dest);
680 void do_exit(
681 const exprt &lhs,
682 const exprt &rhs,
683 const exprt::operandst &arguments,
684 goto_programt &dest);
685 void do_printf(
686 const exprt &lhs,
687 const exprt &rhs,
688 const exprt::operandst &arguments,
689 goto_programt &dest,
690 const std::string &bs_name);
691 void do_operator_new(
692 const exprt &lhs,
693 const exprt &function,
694 const exprt::operandst &arguments,
695 goto_programt &dest);
696 void do_mem(
697 bool is_malloc,
698 const exprt &lhs,
699 const exprt &rhs,
700 const exprt::operandst &arguments,
701 goto_programt &dest);
702 void get_alloc_size(typet &alloc_type, exprt &alloc_size);
703};
704
705#endif
static const twodig_t base
Definition bigint.cpp:28
Definition std_code.h:77
Definition std_code.h:49
Definition std_code.h:778
Definition std_code.h:798
A `switch' instruction */ class code_switcht : public codet { public: inline code_switcht() : codet("...
Definition std_code.h:574
Definition std_code.h:667
Definition std_code.h:630
A switch-case.
Definition std_code.h:710
Definition std_code.h:8
Definition context.h:57
Definition expr.h:34
std::vector< exprt > operandst
Definition expr.h:39
void remove_comma_operand(exprt &operand, goto_programt &dest)
A comma's operand is a discarded-value expression ([expr.comma]/1), but a temporary object it creates...
Definition goto_convert.cpp:1154
void do_exit(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:1152
virtual void do_function_call(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, const locationt &location, goto_programt &dest)
Definition goto_function.cpp:23
void do_operator_new(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Lower a call to operator new(n) into a cpp_new side effect.
Definition builtin_functions.cpp:1246
bool drop_inactive_contract_clause(bool is_clause) const
True when a contract clause should be dropped: no contract mode is active, so the clause states nothi...
Definition builtin_functions.cpp:1227
void cpp_new_at(const exprt &lhs, const exprt &placement, const locationt &location, goto_programt &dest)
Definition builtin_functions.cpp:608
void skolemize_asserted_foralls(exprt &expr, goto_programt &dest)
In an assertion, a __ESBMC_forall in positive polarity is equivalent to its body over a fresh unconst...
Definition goto_sideeffects.cpp:1175
void convert_throw(const exprt &expr, goto_programt &dest)
Definition goto_convert.cpp:475
void convert_decl_block(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1419
void optimize_guarded_gotos(goto_programt &dest)
Rewrite "if(x) goto z; goto y; z:" into "if(!x) goto y;" This only works if the "goto y" is not a bra...
Definition goto_convert.cpp:106
void make_temp_symbol(exprt &expr, goto_programt &dest)
Definition goto_sideeffects.cpp:1341
void convert_atomic_begin(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2447
virtual void do_function_call_if(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition goto_function.cpp:105
void convert_continue(const code_continuet &code, goto_programt &dest)
Definition goto_convert.cpp:2410
void record_exception_unwind(goto_programt::instructiont &call)
Attach to call the cleanup an exception leaving it runs: the automatic objects constructed since the ...
Definition goto_convert.cpp:440
bool has_destructible_sideeffect(const exprt &expr)
True if lowering expr may create a temporary with a destructor.
Definition goto_sideeffects.cpp:1362
void copy(const codet &code, goto_program_instruction_typet type, goto_programt &dest)
Definition goto_convert.cpp:162
void finish_gotos(goto_programt &dest)
Definition goto_convert.cpp:19
bool user_code_throws()
Definition builtin_functions.cpp:903
void goto_convert_rec(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:154
void do_create_thread(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void convert_assume(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1855
void construct_array_elements(const exprt &base, const typet &type, const side_effect_expr_function_callt &ctor, goto_programt &dest)
The frontend gives an array of a class one constructor call; every element is constructed by it,...
Definition goto_convert.cpp:954
void do_free(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:1165
void convert_assign_rmw_atomic(const exprt &lhs, const exprt &rhs, const locationt &location, goto_programt &dest)
Definition goto_convert.cpp:1516
void unwind_destructor_stack(const locationt &, std::size_t stack_size, goto_programt &dest)
Definition goto_convert.cpp:2896
void convert_init(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1604
void convert_return(const code_returnt &code, goto_programt &dest)
Definition goto_convert.cpp:2312
void assume_if_ends_path(const expr2tc &guard, const locationt &location, goto_programt &dest)
Definition goto_convert.cpp:1831
void convert_quantifier_calls(exprt &expr)
Definition goto_sideeffects.cpp:1221
std::optional< bool > user_code_throws_cache
Definition goto_convert_class.h:194
void convert_atomic_end(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2462
void convert_function_call(const code_function_callt &code, goto_programt &dest)
Definition goto_function.cpp:11
void do_mem(bool is_malloc, const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:345
virtual void do_cpp_new(const exprt &lhs, const exprt &rhs, goto_programt &dest)
Definition builtin_functions.cpp:483
struct goto_convertt::targetst targets
virtual void do_function_call_symbol(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:1317
void convert_ifthenelse(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2639
void remove_assignment(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2086
void convert_non_deterministic_goto(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2440
void case_guard(const exprt &value, const caset &case_op, exprt &dest)
Definition goto_convert.cpp:2128
std::set< irep_idt > comma_operand_temporaries
Temporaries created by a comma's discarded operands.
Definition goto_convert_class.h:243
void declare_skipped_locals(const destructor_stackt &stack, std::size_t from, const locationt &location, goto_programt &dest)
Declares the locals stack holds past its first from entries: a jump to where stack is live skips thei...
Definition goto_convert.cpp:63
bool in_short_circuit
Definition goto_convert_class.h:78
void remove_condition_sideeffects(exprt &cond, goto_programt &dest)
Lowers the condition of an if, loop, for or switch statement, a full-expression whose temporaries are...
Definition goto_sideeffects.cpp:1375
void goto_convert(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:149
bool emits_assert(const locationt &location) const
Definition goto_convert.cpp:1820
bool lower_discarded_short_circuit(exprt &expr, goto_programt &dest, bool result_is_used)
Lower a value-discarding A && B as if (A) B;, A || B as if (!A) B;.
Definition goto_sideeffects.cpp:1487
bool cpp_new_init_list(const exprt &lhs, const exprt &rhs, const exprt &init, const exprt &elem_count, const exprt &built, code_blockt &out)
Definition builtin_functions.cpp:844
void get_alloc_size(typet &alloc_type, exprt &alloc_size)
Definition builtin_functions.cpp:157
void convert_cpp_delete(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1619
void convert_label(const code_labelt &code, goto_programt &dest)
Definition goto_convert.cpp:172
void remove_sideeffects_for_quantifier_body(exprt &body, const std::set< irep_idt > &bound_vars, goto_programt &dest)
Definition goto_sideeffects.cpp:1251
static void collect_operands(const exprt &expr, const irep_idt &id, std::list< exprt > &dest)
Definition goto_convert.cpp:2701
void kill_condition_temporaries(std::size_t stack_size, const locationt &location, goto_programt &branch, goto_programt &exit)
End a loop condition's temporaries, pushed since stack_size, on both edges of its branch,...
Definition goto_convert.cpp:2869
void do_assert_fail(const exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &base_name, std::size_t arity, std::size_t expr_arg)
Definition builtin_functions.cpp:224
void flatten_contract_clause(exprt &clause, goto_programt &dest)
Recursively flatten a (possibly nested) &&/|| tree forming a contract clause, hoisting side effects (...
Definition goto_sideeffects.cpp:1443
goto_convertt(contextt &_context, optionst &_options)
Definition goto_convert_class.h:30
void do_malloc(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:425
void cpp_new_initializer(const exprt &lhs, const exprt &rhs, const exprt &elem_count, goto_programt &dest)
Definition builtin_functions.cpp:984
void drop_destructor(const symbol_exprt &object, std::size_t from)
Unschedule the destructor call on object among the scope-exit entries pushed since the stack held fro...
Definition goto_sideeffects.cpp:2633
symbolt & new_cftest_symbol(const typet &type)
void convert_assign(const code_assignt &code, goto_programt &dest)
Definition goto_convert.cpp:1535
void generate_dynamic_size_vla(exprt &var, const locationt &loc, goto_programt &dest, bool allow_zero_size=false)
Definition goto_convert.cpp:820
void generate_ifthenelse(const exprt &cond, goto_programt &true_case, goto_programt &false_case, const locationt &location, goto_programt &dest)
if(guard) true_case; else false_case;
Definition goto_convert.cpp:2475
void convert_dynamic_static_init(const codet &decl, const symbolt &s, const symbolt &guard, goto_programt &dest)
A C++ function-local static with a dynamic initializer is initialized the first time control passes i...
Definition goto_convert.cpp:990
void do_atomic_begin(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:286
bool rewrite_vla_decl_size(exprt &size, goto_programt &dest)
Definition goto_convert.cpp:752
std::size_t keep_reference_member_temporaries(const exprt &initializer, std::size_t stack_size)
A temporary bound to a reference member of a declared aggregate lives as long as the aggregate ([clas...
Definition goto_convert.cpp:1263
std::map< goto_programt::targett, casest::iterator > cases_mapt
Definition goto_convert_class.h:397
void do_atomic_end(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:323
void convert_assign_atomic(const exprt &lhs, const exprt &rhs, const locationt &location, goto_programt &dest)
Definition goto_convert.cpp:1468
void convert_assert(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1791
bool summarize_pure_call(const symbolt &fsym, const exprt &call, exprt &out)
Definition goto_sideeffects.cpp:1021
void emit_assert_fail_noreturn(const locationt &location, goto_programt &dest)
Definition builtin_functions.cpp:175
bool destroy_full_expression_temporaries(std::size_t stack_size, const locationt &, goto_programt &dest)
Emits the scope-exit entries pushed above stack_size when one of them is a destructor call,...
Definition goto_convert.cpp:2854
void convert_for(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1874
void convert_skip(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1846
bool splits_and_condition(const exprt &cond)
Definition goto_convert.cpp:2632
void destroy_comma_operand_temporaries(std::size_t stack_size, const locationt &location, goto_programt &dest)
A reference declaration keeps its initializer's temporaries to the end of the scope,...
Definition goto_convert.cpp:1227
virtual void do_function_call_dereference(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition goto_function.cpp:175
std::map< goto_programt::targett, destructor_stackt > case_stackst
Definition goto_convert_class.h:398
std::vector< codet > destructor_stackt
Definition goto_convert_class.h:316
void schedule_array_element_destructors(const exprt &base, const typet &type)
Push a destructor call for every element of an array of class objects, recursing through nested array...
Definition goto_convert.cpp:1388
static bool is_atomic_symbol(const exprt &expr, const namespacet &ns)
Returns true iff expr is a direct reference to a C11 _Atomic variable.
Definition goto_convert.cpp:1427
const exprt * find_sideeffect_on_bound_var(const exprt &expr, const std::set< irep_idt > &bound_vars)
Find a side effect that mentions one of bound_vars.
Definition goto_sideeffects.cpp:1142
std::map< irep_idt, std::pair< goto_programt::targett, destructor_stackt > > labelst
Definition goto_convert_class.h:391
void do_printf(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest, const std::string &bs_name)
Definition builtin_functions.cpp:256
void remove_return_value_sideeffects(exprt &value, goto_programt &dest)
Definition goto_convert.cpp:2274
bool try_inline_pure_call(const symbolt &fsym, const exprt &call, exprt &out)
Build the inlined form of call to fsym: the callee's body must be local declarations with initializer...
Definition goto_sideeffects.cpp:419
void remove_sideeffects(exprt &expr, goto_programt &dest, bool result_is_used=true)
Definition goto_sideeffects.cpp:1590
void do_abort(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void convert_cpp_new_elements(const exprt &base, const exprt &built, const codet &construction, goto_programt &dest)
Definition builtin_functions.cpp:937
void convert_dowhile(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2049
void convert_expression(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:680
contextt & context
Definition goto_convert_class.h:39
static bool is_destructor_entry(const codet &entry)
A destructor call on the destructor stack, possibly guarded by guard_arm_destructors; the other entri...
Definition goto_sideeffects.cpp:2040
namespacet ns
Definition goto_convert_class.h:41
void new_name(symbolt &symbol)
Definition goto_main.cpp:4
void do_realloc(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:434
void guard_arm_destructors(exprt &cond, std::size_t true_size, std::size_t false_size, const locationt &location, goto_programt &dest)
Definition goto_sideeffects.cpp:2050
goto_programt::targett case_entry(goto_programt::targett target, std::size_t switch_stack_size, const locationt &location, goto_programt &stubs)
Where a switch dispatch jumps to reach target: the target itself, or a stub in stubs that first decla...
Definition goto_convert.cpp:81
std::list< std::pair< goto_programt::targett, destructor_stackt > > gotost
Definition goto_convert_class.h:393
void convert_goto(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2429
void do_sync(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void convert_catch(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:557
void convert_decl(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1277
void guard_program(const guard2tc &guard, goto_programt &dest)
void inline_calls_in_quantifier_body(exprt &expr, unsigned depth)
Inline calls to pure single-return functions occurring under a quantifier binder, so that the bound v...
Definition goto_sideeffects.cpp:1108
bool construct_in_place(const exprt &object, const exprt &initializer, goto_programt &dest)
Construct object from initializer directly when it is a class temporary: a constructor call retargete...
Definition goto_convert.cpp:1037
void do_alloca(const exprt &lhs, const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition builtin_functions.cpp:416
void rewrite_short_circuit_as_ternary(exprt &expr)
Rebuild A && B as A ?
Definition goto_sideeffects.cpp:1535
static exprt case_label(const exprt &lo, const exprt &hi)
Definition goto_convert.cpp:2119
void remove_statement_expression(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2710
exprt::operandst caset
Definition goto_convert_class.h:395
void generate_conditional_branch(const exprt &guard, goto_programt::targett target_true, goto_programt::targett target_false, const locationt &location, goto_programt &dest)
Definition goto_convert.cpp:2749
void discard_comma_operands(exprt &initializer, goto_programt &dest)
A comma's left operands are discarded-value expressions and its right operand is its result ([expr....
Definition goto_convert.cpp:1136
void remove_temporary_object(exprt &expr, goto_programt &dest)
Definition goto_sideeffects.cpp:2653
void convert_controlled(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:659
symbol_generator tmp_symbol
Definition goto_convert_class.h:42
void remove_cpp_delete(exprt &expr, goto_programt &dest)
Definition goto_sideeffects.cpp:2595
void address_of_replace_objects(exprt &expr, goto_programt &dest)
void remove_function_call(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2434
static void replace_new_object(const exprt &object, exprt &dest)
Definition goto_sideeffects.cpp:2552
void convert_decl_initializer(const exprt &var, exprt &initializer, const codet &new_code, const symbolt &s, goto_programt &dest)
Lower the initializer of a declaration into dest.
Definition goto_convert.cpp:1179
void convert_while(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:1979
void convert_full_expression(const codet &code, goto_programt &dest)
Converts a statement that is a full-expression ([class.temporary]/4), so the temporaries it creates a...
Definition goto_convert.cpp:743
bool has_sideeffect(const exprt &expr)
Definition goto_sideeffects.cpp:1401
void remove_post(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2285
void convert(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:254
void remove_pre(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2186
optionst & options
Definition goto_convert_class.h:40
void convert_switch_case(const code_switch_caset &code, goto_programt &dest)
Definition goto_convert.cpp:213
void remove_gcc_conditional_expression(exprt &expr, goto_programt &dest)
Definition goto_sideeffects.cpp:2776
void cpp_new_store_element(const exprt &base, const exprt &offset, const exprt &init, const locationt &location, const exprt &built, code_blockt &out)
Definition builtin_functions.cpp:789
void remove_initializer_sideeffects(const exprt &object, exprt &initializer, goto_programt &dest)
Remove the side effects of initializer, the value of object.
Definition goto_convert.cpp:1075
void cpp_new_zero_fill(const exprt &lhs, const exprt &rhs, const exprt &elem_count, goto_programt &dest)
Definition builtin_functions.cpp:685
symbolt & new_tmp_symbol(const typet &type)
Definition goto_convert.cpp:2849
std::map< std::string, std::string > summary_reject_reasons
Definition goto_convert_class.h:121
void remove_operand_sideeffects(exprt &expr, goto_programt &dest)
Remove the side effects of expr's operands.
Definition goto_sideeffects.cpp:2614
void remove_cpp_new(exprt &expr, goto_programt &dest, bool result_is_used)
Definition goto_sideeffects.cpp:2561
static bool has_atomic_read(const exprt &expr, const namespacet &ns)
Returns true iff expr contains a direct read of any C11 _Atomic variable (does not recurse into addre...
Definition goto_convert.cpp:1437
std::list< goto_programt::targett > computed_gotost
Definition goto_convert_class.h:394
void convert_switch(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:2162
void convert_break(const code_breakt &code, goto_programt &dest)
Definition goto_convert.cpp:2258
std::list< std::pair< goto_programt::targett, caset > > casest
Definition goto_convert_class.h:396
bool rewrite_vla_decl(typet &var_type, goto_programt &dest)
Definition goto_convert.cpp:799
void convert_block(const codet &code, goto_programt &dest)
Definition goto_convert.cpp:619
Container for an instruction of the goto-program.
Definition goto_program.h:95
A generic container class for a control flow graph for one function, in the form of a goto-program.
Definition goto_program.h:63
instructionst::iterator targett
Definition goto_program.h:590
Path-condition guard container.
Definition irep2_guard.h:32
Definition irep_idt.h:12
Definition location.h:7
Definition namespace.h:10
Definition options.h:11
Definition std_code.h:905
Definition std_expr.h:58
Definition symbol_generator.h:7
Definition symbol.h:12
Definition type.h:9
Definition toml.hpp:1531
pthread_cond_t cond
Definition cuda.h:50
goto_program_instruction_typet
Definition goto_program.h:28
irep_container< expr2t > expr2tc
Definition irep2.h:431
unsigned stack_budget_guardt< Tag >::depth
Definition stack_budget.h:72
#define false
Definition stdbool.h:10
void exit(int status)
Definition stdlib.c:65
Definition module.h:12
std::size_t break_stack_size
Definition goto_convert_class.h:506
std::size_t continue_stack_size
Definition goto_convert_class.h:506
void restore(targetst &targets)
Definition goto_convert_class.h:493
goto_programt::targett break_target
Definition goto_convert_class.h:503
goto_programt::targett continue_target
Definition goto_convert_class.h:504
bool continue_set
Definition goto_convert_class.h:505
break_continue_targetst(const targetst &targets)
Definition goto_convert_class.h:481
bool break_set
Definition goto_convert_class.h:505
casest cases
Definition goto_convert_class.h:542
void restore(targetst &targets)
Definition goto_convert_class.h:525
bool default_set
Definition goto_convert_class.h:539
bool break_set
Definition goto_convert_class.h:539
goto_programt::targett break_target
Definition goto_convert_class.h:537
goto_programt::targett default_target
Definition goto_convert_class.h:538
case_stackst case_stacks
Definition goto_convert_class.h:544
break_switch_targetst(const targetst &targets)
Definition goto_convert_class.h:513
cases_mapt cases_map
Definition goto_convert_class.h:543
std::size_t break_stack_size
Definition goto_convert_class.h:540
Definition goto_convert_class.h:401
destructor_stackt destructor_stack
Definition goto_convert_class.h:408
std::size_t throw_stack_size
Definition goto_convert_class.h:418
bool return_set
Definition goto_convert_class.h:402
computed_gotost computed_gotos
Definition goto_convert_class.h:407
goto_programt::targett continue_target
Definition goto_convert_class.h:415
gotost gotos
Definition goto_convert_class.h:406
labelst labels
Definition goto_convert_class.h:405
bool throw_set
Definition goto_convert_class.h:403
void set_leave(goto_programt::targett _leave_target)
Definition goto_convert_class.h:469
cases_mapt cases_map
Definition goto_convert_class.h:411
void set_return(goto_programt::targett _return_target)
Definition goto_convert_class.h:456
bool default_set
Definition goto_convert_class.h:402
std::size_t leave_stack_size
Definition goto_convert_class.h:419
targetst()
Definition goto_convert_class.h:421
void set_break(goto_programt::targett _break_target)
Definition goto_convert_class.h:436
std::size_t continue_stack_size
Definition goto_convert_class.h:418
std::size_t break_stack_size
Definition goto_convert_class.h:418
bool break_set
Definition goto_convert_class.h:402
bool leave_set
Definition goto_convert_class.h:403
bool has_return_value
Definition goto_convert_class.h:402
goto_programt::targett default_target
Definition goto_convert_class.h:416
bool continue_set
Definition goto_convert_class.h:402
goto_programt::targett return_target
Definition goto_convert_class.h:415
goto_programt::targett leave_target
Definition goto_convert_class.h:416
void set_throw(goto_programt::targett _throw_target)
Definition goto_convert_class.h:462
case_stackst case_stacks
The destructor stack at each case and default label.
Definition goto_convert_class.h:413
void set_default(goto_programt::targett _default_target)
Definition goto_convert_class.h:450
void set_continue(goto_programt::targett _continue_target)
Definition goto_convert_class.h:443
goto_programt::targett throw_target
Definition goto_convert_class.h:416
goto_programt::targett break_target
Definition goto_convert_class.h:415
casest cases
Definition goto_convert_class.h:410
goto_programt::targett throw_target
Definition goto_convert_class.h:564
throw_targett(const targetst &targets)
Definition goto_convert_class.h:551
std::size_t throw_stack_size
Definition goto_convert_class.h:566
void restore(targetst &targets)
Definition goto_convert_class.h:558
bool throw_set
Definition goto_convert_class.h:565