Go to the documentation of this file.
23 const auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr);
24 return symbol && !symbol->get_identifier().empty();
49 return *expr_try_dynamic_cast<symbol_exprt>(expr);
57 return symbol_operand.has_value();
98 if(
const auto sub_struct = expr_try_dynamic_cast<struct_exprt>(expr.
op0()))
107 expr.
operands().size() > 1 && std::any_of(
110 [&](
const exprt &operand) {
111 return operand.id() != ID_constant &&
113 ID_annotated_pointer_constant;
155 "Unsupported expression.");
157 if(
const auto member = expr_try_dynamic_cast<member_exprt>(lhs))
164 "Expecting a member with nested symbol operand.");
167 else if(
const auto symbol = expr_try_dynamic_cast<symbol_exprt>(lhs))
174 "Expecting a symbol with non-empty identifier.");
177 else if(
const auto index = expr_try_dynamic_cast<index_exprt>(lhs))
184 "Expecting an index expression with a symbol array and constant or "
185 "symbol index value.");
188 else if(
const auto byte = expr_try_dynamic_cast<byte_extract_exprt>(lhs))
195 "Expecting a byte extract expression with a symbol array and constant or "
196 "symbol index value.");
205 "Expression does not meet any trace assumptions.");
219 "Unsupported expression.");
221 if(
const auto address = expr_try_dynamic_cast<address_of_exprt>(rhs))
228 "Expecting an address of with nested symbol.");
231 else if(
const auto symbol_expr = expr_try_dynamic_cast<symbol_exprt>(rhs))
238 "Expecting a symbol with non-empty identifier.");
241 else if(
const auto struct_expr = expr_try_dynamic_cast<struct_exprt>(rhs))
248 "Expecting all non-base class operands to be constants.");
261 else if(
const auto constant_expr = expr_try_dynamic_cast<constant_exprt>(rhs))
268 "Expecting a constant expression to have no operands and a non-empty "
273 const auto constant_expr =
274 expr_try_dynamic_cast<annotated_pointer_constant_exprt>(rhs))
281 "Expecting the operand of an annotated pointer constant expression "
282 "to be a constant, address_of, or plus expression.");
285 else if(
const auto byte = expr_try_dynamic_cast<byte_extract_exprt>(rhs))
289 byte->operands().size() == 2,
292 "Expecting a byte extract with two operands.");
298 "Expecting a byte extract with constant value.");
304 "Expecting a byte extract with constant index.");
313 "Expression does not meet any trace assumptions.");
332 const bool run_check,
337 for(
const auto &step : trace.
steps)
Class that provides messages with a built-in verbosity 'level'.
bool can_cast_expr< symbol_exprt >(const exprt &base)
void check_trace_assumptions(const goto_tracet &trace, const namespacet &ns, const messaget &log, const bool run_check, const validation_modet vm)
Checks that the structure of each step of the trace matches certain criteria.
bool can_cast_expr< array_list_exprt >(const exprt &base)
const exprt & skip_typecast(const exprt &expr)
find the expression nested inside typecasts, if any
optionalt< symbol_exprt > get_inner_symbol_expr(exprt expr)
Recursively extracts the first operand of an expression until it reaches a symbol and returns it,...
static void check_step_assumptions(const goto_trace_stept &step, const namespacet &ns, const validation_modet vm)
bool can_cast_expr< address_of_exprt >(const exprt &base)
std::string pretty(unsigned indent=0, unsigned max_indent=0) const
mstreamt & status() const
bool check_struct_structure(const struct_exprt &expr)
bool valid_lhs_expr_high_level(const exprt &lhs)
static bool check_annotated_pointer_constant_structure(const annotated_pointer_constant_exprt &constant_expr)
bool check_symbol_structure(const exprt &expr)
Base class for all expressions.
#define DATA_CHECK_WITH_DIAGNOSTICS(vm, condition, message,...)
Step of the trace of a GOTO program.
bool can_cast_expr< byte_extract_exprt >(const exprt &base)
bool can_cast_expr< array_exprt >(const exprt &base)
bool can_cast_expr< member_exprt >(const exprt &base)
static void check_lhs_assumptions(const exprt &lhs, const namespacet &ns, const validation_modet vm)
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
bool is_assignment() const
Struct constructor from list of elements.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
typet & type()
Return the type of the expression.
Expression classes for byte-level operators.
bool check_index_structure(const exprt &index_expr)
bool can_evaluate_to_constant(const exprt &expression)
bool has_operands() const
Return true if there is at least one operand.
bool can_cast_expr< plus_exprt >(const exprt &base)
bool check_member_structure(const member_exprt &expr)
exprt simplify_expr(exprt src, const namespacet &ns)
static void check_rhs_assumptions(const exprt &rhs, const namespacet &ns, const validation_modet vm)
Pointer-typed bitvector constant annotated with the pointer expression that the bitvector is the nume...
nonstd::optional< T > optionalt
bool check_address_structure(const address_of_exprt &address)
bool can_cast_expr< index_exprt >(const exprt &base)
Extract member of struct or union.
Deprecated expression utility functions.
bool valid_rhs_expr_high_level(const exprt &rhs)
static bool may_be_lvalue(const exprt &expr)
bool can_cast_expr< annotated_pointer_constant_exprt >(const exprt &base)
bool can_cast_expr< typecast_exprt >(const exprt &base)
bool check_constant_structure(const constant_exprt &constant_expr)
bool can_cast_expr< constant_exprt >(const exprt &base)
Operator to return the address of an object.
A constant literal expression.
bool can_cast_expr< struct_exprt >(const exprt &base)
const multi_ary_exprt & to_multi_ary_expr(const exprt &expr)
Cast an exprt to a multi_ary_exprt.
const irep_idt & get_value() const
exprt & symbolic_pointer()