34 if(src.
id()==ID_symbol)
36 else if(src.
id()==ID_member)
38 else if(src.
id()==ID_index)
40 else if(src.
id()==ID_typecast)
43 src.
id() == ID_byte_extract_little_endian ||
44 src.
id() == ID_byte_extract_big_endian)
59 std::ostream &out)
const
61 for(
const auto &step :
steps)
67 std::ostream &out)
const
84 out <<
"ATOMIC_BEGIN";
91 out <<
"FUNCTION RETURN";
break;
116 if(!
pc->source_location().is_nil())
117 out <<
pc->source_location() <<
'\n';
119 out <<
pc->type() <<
'\n';
125 out <<
"Violated property:" <<
'\n';
126 if(
pc->source_location().is_nil())
127 out <<
" " <<
pc->source_location() <<
'\n';
172 const typet &underlying_type =
173 expr_type.
id() == ID_c_enum_tag
194 std::ostringstream oss;
196 for(
const auto c : result)
203 return prefix + oss.str();
217 if(type.
id()==ID_unsignedbv ||
218 type.
id()==ID_signedbv ||
220 type.
id()==ID_fixedbv ||
221 type.
id()==ID_floatbv ||
222 type.
id()==ID_pointer ||
223 type.
id()==ID_c_bit_field ||
224 type.
id()==ID_c_bool ||
225 type.
id()==ID_c_enum ||
226 type.
id()==ID_c_enum_tag)
230 else if(type.
id()==ID_bool)
234 else if(type.
id()==ID_integer)
236 const auto i = numeric_cast<mp_integer>(expr);
237 if(i.has_value() && *i >= 0)
246 else if(expr.
id() == ID_annotated_pointer_constant)
248 const auto &annotated_pointer_constant =
251 auto &value = annotated_pointer_constant.get_value();
255 else if(expr.
id()==ID_array)
259 for(
const auto &op : expr.
operands())
270 else if(expr.
id()==ID_struct)
272 std::string result=
"{ ";
283 else if(expr.
id()==ID_union)
294 const std::optional<symbol_exprt> &lhs_object,
295 const exprt &full_lhs,
301 if(lhs_object.has_value())
302 identifier=lhs_object->get_identifier();
304 out <<
from_expr(ns, identifier, full_lhs) <<
'=';
307 out <<
"(assignment removed)";
325 const auto &source_location = state.
pc->source_location();
327 if(!source_location.get_file().empty())
328 result +=
"file " +
id2string(source_location.get_file());
338 if(!source_location.get_line().empty())
342 result +=
"line " +
id2string(source_location.get_line());
362 out <<
"Initial State";
364 out <<
"State " << step_nr;
367 out <<
"----------------------------------------------------" <<
'\n';
372 out <<
"----------------------------------------------------" <<
'\n';
378 if(src.
id()==ID_index)
380 else if(src.
id()==ID_member)
382 else if(src.
id()==ID_symbol)
399 for(
const auto &step : goto_trace.
steps)
412 if(!step.pc->source_location().is_nil())
417 if(step.pc->is_assert())
420 <<
from_expr(ns, step.function_id, step.original_condition)
430 step.assignment_type ==
438 if(!step.pc->source_location().get_line().empty())
447 step.get_lhs_object(),
456 if(!step.pc->source_location().get_file().empty())
460 if(!step.pc->source_location().get_line().empty())
463 << step.pc->source_location().get_line();
471 const auto &f_symbol = ns.
lookup(step.called_function);
472 out << f_symbol.display_name();
476 auto arg_strings =
make_range(step.function_arguments)
477 .map([&ns, &step](
const exprt &arg) {
478 return from_expr(ns, step.function_id, arg);
482 join_strings(out, arg_strings.begin(), arg_strings.end(),
", ");
521 unsigned prev_step_nr=0;
522 bool first_step=
true;
523 std::size_t function_depth=0;
525 for(
const auto &step : goto_trace.
steps)
538 if(!step.pc->source_location().is_nil())
545 if(step.pc->is_assert())
548 <<
from_expr(ns, step.function_id, step.original_condition)
557 if(step.cond_value && step.pc->is_assume())
560 out <<
"Assumption:\n";
562 if(!step.pc->source_location().is_nil())
565 out <<
" " <<
from_expr(ns, step.function_id, step.original_condition)
578 step.pc->is_assign() ||
579 step.pc->is_set_return_value() ||
580 step.pc->is_function_call() ||
581 (step.pc->is_other() && step.full_lhs.is_not_nil()))
583 if(prev_step_nr!=step.step_nr || first_step)
586 prev_step_nr=step.step_nr;
594 step.get_lhs_object(),
602 if(prev_step_nr!=step.step_nr || first_step)
605 prev_step_nr=step.step_nr;
611 out, ns, step.get_lhs_object(), step.full_lhs, step.full_lhs_value, options);
618 printf_formatter(
id2string(step.format_string), step.io_args);
619 printf_formatter.
print(out);
625 out <<
" OUTPUT " << step.io_id <<
':';
627 for(std::list<exprt>::const_iterator
628 l_it=step.io_args.begin();
629 l_it!=step.io_args.end();
632 if(l_it!=step.io_args.begin())
635 out <<
' ' <<
from_expr(ns, step.function_id, *l_it);
647 out <<
" INPUT " << step.io_id <<
':';
649 for(std::list<exprt>::const_iterator
650 l_it=step.io_args.begin();
651 l_it!=step.io_args.end();
654 if(l_it!=step.io_args.begin())
657 out <<
' ' <<
from_expr(ns, step.function_id, *l_it);
670 out <<
"\n#### Function call: " << step.called_function;
674 for(
auto &arg : step.function_arguments)
681 out <<
from_expr(ns, step.function_id, arg);
684 out <<
") (depth " << function_depth <<
") ####\n";
692 out <<
"\n#### Function return from " << step.function_id <<
" (depth "
693 << function_depth <<
") ####\n";
719 std::map<unsigned, std::vector<goto_tracet::stepst::const_iterator>>
723 unsigned thread_to_show = 0;
725 for(
auto s_it = goto_trace.
steps.begin(); s_it != goto_trace.
steps.end();
728 const auto &step = *s_it;
729 auto &stack = call_stacks[step.thread_nr];
735 stack.push_back(s_it);
736 thread_to_show = step.thread_nr;
739 else if(step.is_function_call())
741 stack.push_back(s_it);
743 else if(step.is_function_return())
749 const auto &stack = call_stacks[thread_to_show];
752 for(
auto s_it = stack.rbegin(); s_it != stack.rend(); s_it++)
754 const auto &step = **s_it;
757 out <<
" assertion failure";
758 if(!step.pc->source_location().is_nil())
762 else if(step.is_function_call())
764 out <<
" " << step.called_function;
768 for(
auto &arg : step.function_arguments)
775 out <<
from_expr(ns, step.function_id, arg);
780 if(!step.pc->source_location().is_nil())
806 std::set<irep_idt> property_ids;
807 for(
const auto &step :
steps)
809 if(step.is_assert() && !step.cond_value)
810 property_ids.insert(step.property_id);
const bitvector_typet & to_bitvector_type(const typet &type)
Cast a typet to a bitvector_typet.
Expression classes for byte-level operators.
const byte_extract_exprt & to_byte_extract_expr(const exprt &expr)
const c_enum_tag_typet & to_c_enum_tag_type(const typet &type)
Cast a typet to a c_enum_tag_typet.
std::size_t get_width() const
struct configt::ansi_ct ansi_c
A constant literal expression.
const irep_idt & get_value() const
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
bool is_true() const
Return whether the expression is a constant representing true.
typet & type()
Return the type of the expression.
bool is_constant() const
Return whether the expression is a constant.
Step of the trace of a GOTO program.
std::vector< exprt > function_arguments
bool is_function_call() const
bool is_assignment() const
goto_programt::const_targett pc
void merge_ireps(merge_irept &dest)
Use dest to establish sharing among ireps.
std::optional< symbol_exprt > get_lhs_object() const
void output(const class namespacet &ns, std::ostream &out) const
Outputs the trace step in ASCII to a given stream.
std::set< irep_idt > get_failed_property_ids() const
Returns the property IDs of all failed assertions in the trace.
void output(const class namespacet &ns, std::ostream &out) const
Outputs the trace in ASCII to a given stream.
const irep_idt & id() const
source_locationt source_location
static const commandt reset
return to default formatting, as defined by the terminal
static const commandt faint
render text with faint font
static const commandt red
render text with red foreground color
const union_typet & follow_tag(const union_tag_typet &) const
Follow type tag of union type.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
const irep_idt & display_name() const
Return language specific display name if present.
The type of an expression, extends irept.
Fixed-width bit-vector with unsigned binary interpretation.
#define forall_operands(it, expr)
static void show_goto_stack_trace(messaget::mstreamt &out, const namespacet &ns, const goto_tracet &goto_trace)
static std::string state_location(const goto_trace_stept &state, const namespacet &ns)
void show_state_header(messaget::mstreamt &out, const namespacet &ns, const goto_trace_stept &state, unsigned step_nr, const trace_optionst &options)
std::string trace_numeric_value(const exprt &expr, const namespacet &ns, const trace_optionst &options)
static std::string numeric_representation(const constant_exprt &expr, const namespacet &ns, const trace_optionst &options)
Returns the numeric representation of an expression, based on options.
void show_full_goto_trace(messaget::mstreamt &out, const namespacet &ns, const goto_tracet &goto_trace, const trace_optionst &options)
void show_goto_trace(messaget::mstreamt &out, const namespacet &ns, const goto_tracet &goto_trace, const trace_optionst &options)
Output the trace on the given stream out.
static std::optional< symbol_exprt > get_object_rec(const exprt &src)
bool is_index_member_symbol(const exprt &src)
static void trace_value(messaget::mstreamt &out, const namespacet &ns, const std::optional< symbol_exprt > &lhs_object, const exprt &full_lhs, const exprt &value, const trace_optionst &options)
void show_compact_goto_trace(messaget::mstreamt &out, const namespacet &ns, const goto_tracet &goto_trace, const trace_optionst &options)
show a compact variant of the goto trace on the console
const std::string & id2string(const irep_idt &d)
std::string from_expr(const namespacet &ns, const irep_idt &identifier, const exprt &expr)
const std::string integer2string(const mp_integer &n, unsigned base)
const std::string integer2binary(const mp_integer &n, std::size_t width)
const annotated_pointer_constant_exprt & to_annotated_pointer_constant_expr(const exprt &expr)
Cast an exprt to an annotated_pointer_constant_exprt.
const pointer_typet & to_pointer_type(const typet &type)
Cast a typet to a pointer_typet.
Ranges: pair of begin and end iterators, which can be initialized from containers,...
ranget< iteratort > make_range(iteratort begin, iteratort end)
#define UNREACHABLE
This should be used to mark dead code.
std::string as_string(const ai_verifier_statust &status)
Makes a status message string from a status.
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Stream & join_strings(Stream &&os, const It b, const It e, const Delimiter &delimiter, TransformFunc &&transform_func)
Prints items to an stream, separated by a constant delimiter.
Options for printing the trace using show_goto_trace.
static const trace_optionst default_options
bool hex_representation
Represent plain trace values in hex.
bool base_prefix
Use prefix (0b or 0x) for distinguishing the base of the representation.
bool show_code
Show original code in plain text trace.
bool compact_trace
Give a compact trace.
bool show_function_calls
Show function calls in plain text trace.
bool stack_trace
Give a stack trace only.