CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
symex_target_equation.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Symbolic Execution
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
12
14
15#include <util/std_expr.h>
16
17#include "solver_hardness.h"
18#include "ssa_step.h"
19
20#include <chrono> // IWYU pragma: keep
21
22static std::function<void(solver_hardnesst &)>
24{
25 return [step_index, &step](solver_hardnesst &hardness) {
26 hardness.register_ssa(step_index, step.cond_expr, step.source.pc);
27 };
28}
29
31 const exprt &guard,
32 const ssa_exprt &ssa_object,
33 unsigned atomic_section_id,
34 const sourcet &source)
35{
37 SSA_stept &SSA_step=SSA_steps.back();
38
39 SSA_step.guard=guard;
40 SSA_step.ssa_lhs=ssa_object;
41 SSA_step.atomic_section_id=atomic_section_id;
42
43 merge_ireps(SSA_step);
44}
45
47 const exprt &guard,
48 const ssa_exprt &ssa_object,
49 unsigned atomic_section_id,
50 const sourcet &source)
51{
53 SSA_stept &SSA_step=SSA_steps.back();
54
55 SSA_step.guard=guard;
56 SSA_step.ssa_lhs=ssa_object;
57 SSA_step.atomic_section_id=atomic_section_id;
58
59 merge_ireps(SSA_step);
60}
61
64 const exprt &guard,
65 const sourcet &source)
66{
67 SSA_steps.emplace_back(source, goto_trace_stept::typet::SPAWN);
68 SSA_stept &SSA_step=SSA_steps.back();
69 SSA_step.guard=guard;
70
71 merge_ireps(SSA_step);
72}
73
75 const exprt &guard,
76 const sourcet &source)
77{
79 SSA_stept &SSA_step=SSA_steps.back();
80 SSA_step.guard=guard;
81
82 merge_ireps(SSA_step);
83}
84
87 const exprt &guard,
88 unsigned atomic_section_id,
89 const sourcet &source)
90{
92 SSA_stept &SSA_step=SSA_steps.back();
93 SSA_step.guard=guard;
94 SSA_step.atomic_section_id=atomic_section_id;
95
96 merge_ireps(SSA_step);
97}
98
101 const exprt &guard,
102 unsigned atomic_section_id,
103 const sourcet &source)
104{
106 SSA_stept &SSA_step=SSA_steps.back();
107 SSA_step.guard=guard;
108 SSA_step.atomic_section_id=atomic_section_id;
109
110 merge_ireps(SSA_step);
111}
112
114 const exprt &guard,
115 const ssa_exprt &ssa_lhs,
116 const exprt &ssa_full_lhs,
117 const exprt &original_full_lhs,
118 const exprt &ssa_rhs,
119 const sourcet &source,
120 assignment_typet assignment_type)
121{
122 PRECONDITION(ssa_lhs.is_not_nil());
123
124 SSA_steps.emplace_back(SSA_assignment_stept{source,
125 guard,
126 ssa_lhs,
127 ssa_full_lhs,
128 original_full_lhs,
129 ssa_rhs,
130 assignment_type});
131
132 merge_ireps(SSA_steps.back());
133}
134
136 const exprt &guard,
137 const ssa_exprt &ssa_lhs,
138 const exprt &initializer,
139 const sourcet &source,
140 assignment_typet assignment_type)
141{
142 PRECONDITION(ssa_lhs.is_not_nil());
143
144 SSA_steps.emplace_back(source, goto_trace_stept::typet::DECL);
145 SSA_stept &SSA_step=SSA_steps.back();
146
147 SSA_step.guard=guard;
148 SSA_step.ssa_lhs=ssa_lhs;
149 SSA_step.ssa_full_lhs = initializer;
150 SSA_step.original_full_lhs=ssa_lhs.get_original_expr();
151 SSA_step.hidden=(assignment_type!=assignment_typet::STATE);
152
153 // the condition is trivially true, and only
154 // there so we see the symbols
155 SSA_step.cond_expr=equal_exprt(SSA_step.ssa_lhs, SSA_step.ssa_lhs);
156
157 merge_ireps(SSA_step);
158}
159
162 const exprt &,
163 const ssa_exprt &,
164 const sourcet &)
165{
166 // we currently don't record these
167}
168
170 const exprt &guard,
171 const sourcet &source)
172{
173 SSA_steps.emplace_back(source, goto_trace_stept::typet::LOCATION);
174 SSA_stept &SSA_step=SSA_steps.back();
175
176 SSA_step.guard=guard;
177
178 merge_ireps(SSA_step);
179}
180
182 const exprt &guard,
183 const irep_idt &function_id,
184 const std::vector<renamedt<exprt, L2>> &function_arguments,
185 const sourcet &source,
186 const bool hidden)
187{
189 SSA_stept &SSA_step=SSA_steps.back();
190
191 SSA_step.guard = guard;
192 SSA_step.called_function = function_id;
193 for(const auto &arg : function_arguments)
194 SSA_step.ssa_function_arguments.emplace_back(arg.get());
195 SSA_step.hidden = hidden;
196
197 merge_ireps(SSA_step);
198}
199
201 const exprt &guard,
202 const irep_idt &function_id,
203 const sourcet &source,
204 const bool hidden)
205{
207 SSA_stept &SSA_step=SSA_steps.back();
208
209 SSA_step.guard = guard;
210 SSA_step.called_function = function_id;
211 SSA_step.hidden = hidden;
212
213 merge_ireps(SSA_step);
214}
215
217 const exprt &guard,
218 const sourcet &source,
219 const irep_idt &output_id,
220 const std::list<renamedt<exprt, L2>> &args)
221{
222 SSA_steps.emplace_back(source, goto_trace_stept::typet::OUTPUT);
223 SSA_stept &SSA_step=SSA_steps.back();
224
225 SSA_step.guard=guard;
226 for(const auto &arg : args)
227 SSA_step.io_args.emplace_back(arg.get());
228 SSA_step.io_id=output_id;
229
230 merge_ireps(SSA_step);
231}
232
234 const exprt &guard,
235 const sourcet &source,
236 const irep_idt &output_id,
237 const irep_idt &fmt,
238 const std::list<exprt> &args)
239{
240 SSA_steps.emplace_back(source, goto_trace_stept::typet::OUTPUT);
241 SSA_stept &SSA_step=SSA_steps.back();
242
243 SSA_step.guard=guard;
244 SSA_step.io_args=args;
245 SSA_step.io_id=output_id;
246 SSA_step.formatted=true;
247 SSA_step.format_string=fmt;
248
249 merge_ireps(SSA_step);
250}
251
253 const exprt &guard,
254 const sourcet &source,
255 const irep_idt &input_id,
256 const std::list<exprt> &args)
257{
258 SSA_steps.emplace_back(source, goto_trace_stept::typet::INPUT);
259 SSA_stept &SSA_step=SSA_steps.back();
260
261 SSA_step.guard=guard;
262 SSA_step.io_args=args;
263 SSA_step.io_id=input_id;
264
265 merge_ireps(SSA_step);
266}
267
269 const exprt &guard,
270 const exprt &cond,
271 const sourcet &source)
272{
273 SSA_steps.emplace_back(source, goto_trace_stept::typet::ASSUME);
274 SSA_stept &SSA_step=SSA_steps.back();
275
276 SSA_step.guard=guard;
277 SSA_step.cond_expr=cond;
278
279 merge_ireps(SSA_step);
280}
281
283 const exprt &guard,
284 const exprt &cond,
285 const irep_idt &property_id,
286 const std::string &msg,
287 const sourcet &source)
288{
289 SSA_steps.emplace_back(source, goto_trace_stept::typet::ASSERT);
290 SSA_stept &SSA_step=SSA_steps.back();
291
292 SSA_step.guard=guard;
293 SSA_step.cond_expr=cond;
294 SSA_step.comment=msg;
295 SSA_step.property_id = property_id;
296
297 merge_ireps(SSA_step);
298}
299
301 const exprt &guard,
302 const renamedt<exprt, L2> &cond,
303 const sourcet &source)
304{
305 SSA_steps.emplace_back(source, goto_trace_stept::typet::GOTO);
306 SSA_stept &SSA_step=SSA_steps.back();
307
308 SSA_step.guard=guard;
309 SSA_step.cond_expr = cond.get();
310
311 merge_ireps(SSA_step);
312}
313
315 const exprt &cond,
316 const std::string &msg,
317 const sourcet &source)
318{
319 // like assumption, but with global effect
321 SSA_stept &SSA_step=SSA_steps.back();
322
323 SSA_step.guard=true_exprt();
324 SSA_step.cond_expr=cond;
325 SSA_step.comment=msg;
326
327 merge_ireps(SSA_step);
328}
329
331 decision_proceduret &decision_procedure)
332{
333 with_solver_hardness(decision_procedure, [&](solver_hardnesst &hardness) {
334 hardness.register_ssa_size(SSA_steps.size());
335 });
336
337 convert_guards(decision_procedure);
338 convert_assignments(decision_procedure);
339 convert_decls(decision_procedure);
340 convert_assumptions(decision_procedure);
341 convert_goto_instructions(decision_procedure);
342 convert_function_calls(decision_procedure);
343 convert_io(decision_procedure);
344 convert_constraints(decision_procedure);
345}
346
348{
349 const auto convert_SSA_start = std::chrono::steady_clock::now();
350
351 convert_without_assertions(decision_procedure);
352 convert_assertions(decision_procedure);
353
354 const auto convert_SSA_stop = std::chrono::steady_clock::now();
355 std::chrono::duration<double> convert_SSA_runtime =
356 std::chrono::duration<double>(convert_SSA_stop - convert_SSA_start);
357 log.statistics() << "Runtime Convert SSA: " << convert_SSA_runtime.count()
358 << "s" << messaget::eom;
359}
360
362 decision_proceduret &decision_procedure)
363{
364 std::size_t step_index = 0;
365 for(auto &step : SSA_steps)
366 {
367 if(step.is_assignment() && !step.ignore && !step.converted)
368 {
369 log.conditional_output(log.debug(), [&step](messaget::mstreamt &mstream) {
370 step.output(mstream);
371 mstream << messaget::eom;
372 });
373
374 decision_procedure.set_to_true(step.cond_expr);
375 step.converted = true;
377 decision_procedure, hardness_register_ssa(step_index, step));
378 }
379 ++step_index;
380 }
381}
382
384 decision_proceduret &decision_procedure)
385{
386 std::size_t step_index = 0;
387 for(auto &step : SSA_steps)
388 {
389 if(step.is_decl() && !step.ignore && !step.converted)
390 {
391 // The result is not used, these have no impact on
392 // the satisfiability of the formula.
393 decision_procedure.handle(step.cond_expr);
394 decision_procedure.handle(
395 equal_exprt{step.ssa_full_lhs, step.ssa_full_lhs});
396 step.converted = true;
398 decision_procedure, hardness_register_ssa(step_index, step));
399 }
400 ++step_index;
401 }
402}
403
405 decision_proceduret &decision_procedure)
406{
407 std::size_t step_index = 0;
408 for(auto &step : SSA_steps)
409 {
410 if(step.ignore)
411 step.guard_handle = false_exprt();
412 else
413 {
414 log.conditional_output(log.debug(), [&step](messaget::mstreamt &mstream) {
415 step.output(mstream);
416 mstream << messaget::eom;
417 });
418
419 step.guard_handle = decision_procedure.handle(step.guard);
421 decision_procedure, [step_index, &step](solver_hardnesst &hardness) {
422 hardness.register_ssa(step_index, step.guard, step.source.pc);
423 });
424 }
425 ++step_index;
426 }
427}
428
430 decision_proceduret &decision_procedure)
431{
432 std::size_t step_index = 0;
433 for(auto &step : SSA_steps)
434 {
435 if(step.is_assume())
436 {
437 if(step.ignore)
438 step.cond_handle = true_exprt();
439 else
440 {
442 log.debug(), [&step](messaget::mstreamt &mstream) {
443 step.output(mstream);
444 mstream << messaget::eom;
445 });
446
447 step.cond_handle = decision_procedure.handle(step.cond_expr);
448
450 decision_procedure, hardness_register_ssa(step_index, step));
451 }
452 }
453 ++step_index;
454 }
455}
456
458 decision_proceduret &decision_procedure)
459{
460 std::size_t step_index = 0;
461 for(auto &step : SSA_steps)
462 {
463 if(step.is_goto())
464 {
465 if(step.ignore)
466 step.cond_handle = true_exprt();
467 else
468 {
470 log.debug(), [&step](messaget::mstreamt &mstream) {
471 step.output(mstream);
472 mstream << messaget::eom;
473 });
474
475 step.cond_handle = decision_procedure.handle(step.cond_expr);
477 decision_procedure, hardness_register_ssa(step_index, step));
478 }
479 }
480 ++step_index;
481 }
482}
483
485 decision_proceduret &decision_procedure)
486{
487 std::size_t step_index = 0;
488 for(auto &step : SSA_steps)
489 {
490 if(step.is_constraint() && !step.ignore && !step.converted)
491 {
492 log.conditional_output(log.debug(), [&step](messaget::mstreamt &mstream) {
493 step.output(mstream);
494 mstream << messaget::eom;
495 });
496
497 decision_procedure.set_to_true(step.cond_expr);
498 step.converted = true;
499
501 decision_procedure, hardness_register_ssa(step_index, step));
502 }
503 ++step_index;
504 }
505}
506
508 decision_proceduret &decision_procedure,
510{
511 // we find out if there is only _one_ assertion,
512 // which allows for a simpler formula
513
515
517 return;
518
520 {
521 std::size_t step_index = 0;
522 for(auto &step : SSA_steps)
523 {
524 // hide already converted assertions in the error trace
525 if(step.is_assert() && step.converted)
526 step.hidden = true;
527
528 if(step.is_assert() && !step.ignore && !step.converted)
529 {
530 step.converted = true;
531 decision_procedure.set_to_false(step.cond_expr);
532 step.cond_handle = false_exprt();
533
535 decision_procedure, hardness_register_ssa(step_index, step));
536 return; // prevent further assumptions!
537 }
538 else if(step.is_assume())
539 {
540 decision_procedure.set_to_true(step.cond_expr);
541
543 decision_procedure, hardness_register_ssa(step_index, step));
544 }
545 ++step_index;
546 }
547
548 UNREACHABLE; // unreachable
549 }
550
551 // We do (NOT a1) OR (NOT a2) ...
552 // where the a's are the assertions
555
557
558 std::vector<goto_programt::const_targett> involved_steps;
559
560 for(auto &step : SSA_steps)
561 {
562 // hide already converted assertions in the error trace
563 if(step.is_assert() && step.converted)
564 step.hidden = true;
565
566 if(step.is_assert() && !step.ignore && !step.converted)
567 {
568 step.converted = true;
569
570 log.conditional_output(log.debug(), [&step](messaget::mstreamt &mstream) {
571 step.output(mstream);
572 mstream << messaget::eom;
573 });
574
577 step.cond_expr);
578
579 // do the conversion
580 step.cond_handle = decision_procedure.handle(implication);
581
583 decision_procedure,
585 involved_steps.push_back(step.source.pc);
586 });
587
588 // store disjunct
589 disjuncts.push_back(not_exprt(step.cond_handle));
590 }
591 else if(step.is_assume())
592 {
593 // the assumptions have been converted before
594 // avoid deep nesting of ID_and expressions
595 if(assumption.id()==ID_and)
596 assumption.copy_to_operands(step.cond_handle);
597 else
598 assumption = and_exprt(assumption, step.cond_handle);
599
601 decision_procedure,
603 involved_steps.push_back(step.source.pc);
604 });
605 }
606 }
607
609 // the below is 'true' if there are no assertions
610 decision_procedure.set_to_true(assertion_disjunction);
611
613 decision_procedure,
615 hardness.register_assertion_ssas(assertion_disjunction, involved_steps);
616 });
617}
618
620 decision_proceduret &decision_procedure)
621{
622 std::size_t step_index = 0;
623 for(auto &step : SSA_steps)
624 {
625 if(!step.ignore)
626 {
628 step.converted_function_arguments.reserve(step.ssa_function_arguments.size());
629
630 for(const auto &arg : step.ssa_function_arguments)
631 {
632 if(arg.is_constant() ||
633 arg.id()==ID_string_constant)
634 step.converted_function_arguments.push_back(arg);
635 else
636 {
637 const irep_idt identifier="symex::args::"+std::to_string(argument_count++);
638 symbol_exprt symbol(identifier, arg.type());
639
640 equal_exprt eq(arg, symbol);
641 merge_irep(eq);
642
643 decision_procedure.set_to(eq, true);
644 conjuncts.push_back(eq);
645 step.converted_function_arguments.push_back(symbol);
646 }
647 }
649 decision_procedure,
651 hardness.register_ssa(
652 step_index, conjunction(conjuncts), step.source.pc);
653 });
654 }
655 ++step_index;
656 }
657}
658
660{
661 std::size_t step_index = 0;
662 for(auto &step : SSA_steps)
663 {
664 if(!step.ignore)
665 {
667 for(const auto &arg : step.io_args)
668 {
669 if(arg.is_constant() ||
670 arg.id()==ID_string_constant)
671 step.converted_io_args.push_back(arg);
672 else
673 {
674 const irep_idt identifier =
675 "symex::io::" + std::to_string(io_count++);
676 symbol_exprt symbol(identifier, arg.type());
677
678 equal_exprt eq(arg, symbol);
679 merge_irep(eq);
680
681 decision_procedure.set_to(eq, true);
682 conjuncts.push_back(eq);
683 step.converted_io_args.push_back(symbol);
684 }
685 }
687 decision_procedure,
689 hardness.register_ssa(
690 step_index, conjunction(conjuncts), step.source.pc);
691 });
692 }
693 ++step_index;
694 }
695}
696
701{
702 merge_irep(SSA_step.guard);
703
704 merge_irep(SSA_step.ssa_lhs);
705 merge_irep(SSA_step.ssa_full_lhs);
707 merge_irep(SSA_step.ssa_rhs);
708
709 merge_irep(SSA_step.cond_expr);
710
711 for(auto &step : SSA_step.io_args)
712 merge_irep(step);
713
714 for(auto &arg : SSA_step.ssa_function_arguments)
715 merge_irep(arg);
716
717 // converted_io_args is merged in convert_io
718}
719
720void symex_target_equationt::output(std::ostream &out) const
721{
722 for(const auto &step : SSA_steps)
723 {
724 step.output(out);
725 out << "--------------\n";
726 }
727}
static exprt guard(const exprt::operandst &guards, exprt cond)
Single SSA step in the equation.
Definition ssa_step.h:47
irep_idt io_id
Definition ssa_step.h:157
irep_idt called_function
Definition ssa_step.h:163
std::vector< exprt > ssa_function_arguments
Definition ssa_step.h:166
exprt cond_expr
Definition ssa_step.h:145
unsigned atomic_section_id
Definition ssa_step.h:169
irep_idt format_string
Definition ssa_step.h:157
bool formatted
Definition ssa_step.h:158
exprt ssa_full_lhs
Definition ssa_step.h:140
bool hidden
Definition ssa_step.h:133
exprt guard
Definition ssa_step.h:135
exprt ssa_rhs
Definition ssa_step.h:141
std::string comment
Definition ssa_step.h:147
symex_targett::sourcet source
Definition ssa_step.h:49
exprt original_full_lhs
Definition ssa_step.h:140
irep_idt property_id
Definition ssa_step.h:149
std::list< exprt > io_args
Definition ssa_step.h:159
ssa_exprt ssa_lhs
Definition ssa_step.h:139
virtual void output(const namespacet &ns, const irep_idt &function_id, const goto_programt &goto_program, std::ostream &out) const
Output the abstract states for a single function.
Definition ai.cpp:39
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
Boolean AND.
Definition std_expr.h:2125
An interface for a decision procedure for satisfiability problems.
void set_to_false(const exprt &)
For a Boolean expression expr, add the constraint 'not expr'.
virtual exprt handle(const exprt &)=0
Generate a handle, which is an expression that has the same value as the argument in any model that i...
void set_to_true(const exprt &)
For a Boolean expression expr, add the constraint 'expr'.
virtual void set_to(const exprt &, bool value)=0
For a Boolean expression expr, add the constraint 'expr' if value is true, otherwise add 'not expr'.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:38
Equality.
Definition std_expr.h:1366
Base class for all expressions.
Definition expr.h:56
std::vector< exprt > operandst
Definition expr.h:58
The Boolean constant false.
Definition std_expr.h:3199
Boolean implication.
Definition std_expr.h:2225
bool is_not_nil() const
Definition irep.h:372
mstreamt & debug() const
Definition message.h:421
mstreamt & statistics() const
Definition message.h:411
void conditional_output(mstreamt &mstream, const std::function< void(mstreamt &)> &output_generator) const
Generate output to message_stream using output_generator if the configured verbosity is at least as h...
Definition message.cpp:139
static eomt eom
Definition message.h:289
Boolean negation.
Definition std_expr.h:2454
Expression providing an SSA-renamed symbol of expressions.
Definition ssa_expr.h:17
const exprt & get_original_expr() const
Definition ssa_expr.h:33
Expression to hold a symbol (variable)
Definition std_expr.h:131
virtual void constraint(const exprt &cond, const std::string &msg, const sourcet &source)
Record a global constraint: there is no guard limiting its scope.
virtual void shared_read(const exprt &guard, const ssa_exprt &ssa_object, unsigned atomic_section_id, const sourcet &source)
Read from a shared variable ssa_object (which is both the left- and the right–hand side of assignment...
virtual void assertion(const exprt &guard, const exprt &cond, const irep_idt &property_id, const std::string &msg, const sourcet &source)
Record an assertion.
virtual void input(const exprt &guard, const sourcet &source, const irep_idt &input_id, const std::list< exprt > &args)
Record an input.
std::size_t count_assertions() const
void convert_decls(decision_proceduret &decision_procedure)
Converts declarations: these are effectively ignored by the decision procedure.
void convert_assumptions(decision_proceduret &decision_procedure)
Converts assumptions: convert the expression the assumption represents.
void convert_without_assertions(decision_proceduret &decision_procedure)
Interface method to initiate the conversion into a decision procedure format.
virtual void assumption(const exprt &guard, const exprt &cond, const sourcet &source)
Record an assumption.
virtual void atomic_begin(const exprt &guard, unsigned atomic_section_id, const sourcet &source)
Record a beginning of an atomic section.
virtual void spawn(const exprt &guard, const sourcet &source)
Record spawning a new thread.
virtual void shared_write(const exprt &guard, const ssa_exprt &ssa_object, unsigned atomic_section_id, const sourcet &source)
Write to a shared variable ssa_object: we effectively assign a value from this thread to be visible b...
virtual void output_fmt(const exprt &guard, const sourcet &source, const irep_idt &output_id, const irep_idt &fmt, const std::list< exprt > &args)
Record formatted output.
virtual void function_return(const exprt &guard, const irep_idt &function_id, const sourcet &source, bool hidden)
Record return from a function.
virtual void atomic_end(const exprt &guard, unsigned atomic_section_id, const sourcet &source)
Record ending an atomic section.
void convert_assignments(decision_proceduret &decision_procedure)
Converts assignments: set the equality lhs==rhs to True.
void merge_ireps(SSA_stept &SSA_step)
Merging causes identical ireps to be shared.
void convert_guards(decision_proceduret &decision_procedure)
Converts guards: convert the expression the guard represents.
virtual void goto_instruction(const exprt &guard, const renamedt< exprt, L2 > &cond, const sourcet &source)
Record a goto instruction.
void convert(decision_proceduret &decision_procedure)
Interface method to initiate the conversion into a decision procedure format.
virtual void dead(const exprt &guard, const ssa_exprt &ssa_lhs, const sourcet &source)
Remove a variable from the scope.
virtual void location(const exprt &guard, const sourcet &source)
Record a location.
void convert_io(decision_proceduret &decision_procedure)
Converts I/O: for each argument build an equality between its symbol and the argument itself.
virtual void assignment(const exprt &guard, const ssa_exprt &ssa_lhs, const exprt &ssa_full_lhs, const exprt &original_full_lhs, const exprt &ssa_rhs, const sourcet &source, assignment_typet assignment_type)
Write to a local variable.
void convert_function_calls(decision_proceduret &decision_procedure)
Converts function calls: for each argument build an equality between its symbol and the argument itse...
void convert_constraints(decision_proceduret &decision_procedure)
Converts constraints: set the represented condition to True.
virtual void function_call(const exprt &guard, const irep_idt &function_id, const std::vector< renamedt< exprt, L2 > > &ssa_function_arguments, const sourcet &source, bool hidden)
Record a function call.
virtual void output(const exprt &guard, const sourcet &source, const irep_idt &output_id, const std::list< renamedt< exprt, L2 > > &args)
Record an output.
void convert_goto_instructions(decision_proceduret &decision_procedure)
Converts goto instructions: convert the expression representing the condition of this goto.
virtual void memory_barrier(const exprt &guard, const sourcet &source)
Record creating a memory barrier.
virtual void decl(const exprt &guard, const ssa_exprt &ssa_lhs, const exprt &initializer, const sourcet &source, assignment_typet assignment_type)
Declare a fresh variable.
void convert_assertions(decision_proceduret &decision_procedure, bool optimized_for_single_assertions=true)
Converts assertions: build a disjunction of negated assertions.
The Boolean constant true.
Definition std_expr.h:3190
static exprt implication(exprt lhs, exprt rhs)
static void with_solver_hardness(decision_proceduret &maybe_hardness_collector, std::function< void(solver_hardnesst &hardness)> handler)
#define UNREACHABLE
This should be used to mark dead code.
Definition invariant.h:525
#define PRECONDITION(CONDITION)
Definition invariant.h:463
exprt conjunction(const exprt::operandst &op)
1) generates a conjunction for two or more operands 2) for one operand, returns the operand 3) return...
Definition std_expr.cpp:83
exprt disjunction(const exprt::operandst &op)
1) generates a disjunction for two or more operands 2) for one operand, returns the operand 3) return...
Definition std_expr.cpp:71
API to expression classes.
A structure that facilitates collecting the complexity statistics from a decision procedure.
Identifies source in the context of symbolic execution.
goto_programt::const_targett pc
static std::function< void(solver_hardnesst &)> hardness_register_ssa(std::size_t step_index, const SSA_stept &step)
Generate Equation using Symbolic Execution.