1#ifndef CPROVER_POINTER_ANALYSIS_DEREFERENCE_H
2#define CPROVER_POINTER_ANALYSIS_DEREFERENCE_H
109 const std::string &property,
110 const std::string &msg,
152 const std::list<struct internal_item> &data [[maybe_unused]])
189 new_context(_new_context),
191 dereference_callback(_dereference_callback),
192 block_assertions(
false)
295 static thread_local unsigned invalid_counter;
303 std::list<dereference_callbackt::internal_item> internal_items;
305 bool block_assertions;
351 virtual expr2tc dereference_expr_nonscalar(
363 resolve_nonscalar_if(
const expr2tc &expr,
guard2tc &guard, modet mode);
381 void check_pointer_alignment(
409 bool dereference_type_compare(
411 const type2tc &dereference_type)
const;
456 void deref_invalid_ptr(
469 void valid_check(
const expr2tc &expr,
const guard2tc &guard, modet mode);
470 std::vector<expr2tc> extract_bytes(
474 expr2tc stitch_together_from_byte_array(
475 unsigned int num_bytes,
476 const std::vector<expr2tc> &bytes);
477 expr2tc stitch_together_from_byte_array(
481 void dereference_failure(
482 const std::string &error_class,
483 const std::string &error_name,
485 void alignment_failure(
const std::string &error_name,
const guard2tc &guard);
487 void bad_base_type_failure(
489 const std::string &wants,
490 const std::string &have);
492 bool check_code_access(
498 void check_data_obj_access(
507 void check_alignment(
516 unsigned int static compute_num_bytes_to_extract(
518 unsigned long num_bits);
519 static expr2tc extract_bits_from_byte_array(
522 unsigned long num_bits);
534 void construct_from_const_offset(
538 void construct_from_dyn_offset(
542 void construct_from_const_struct_offset(
548 void construct_from_dyn_struct_offset(
555 const expr2tc *failed_symbol =
nullptr);
556 void construct_from_multidir_array(
563 void construct_struct_ref_from_const_offset_array(
570 void construct_struct_ref_from_const_offset(
576 void construct_struct_ref_from_dyn_offset(
582 void construct_struct_ref_from_dyn_offs_rec(
589 std::list<std::pair<expr2tc, expr2tc>> &output);
590 void construct_struct_ref_from_dyn_offs_members(
597 std::list<std::pair<expr2tc, expr2tc>> &output);
598 void construct_struct_member_from_byte_array(
604 void construct_from_array(
612 bool construct_value_ref(
619 void construct_vector_ref(
626 void construct_array_ref(
633 class quantifier_scopet;
638 std::multiset<irep_idt> quantifier_bound_vars;
639 unsigned opaque_binders = 0;
642 bool mentions_bound_var(
const expr2tc &expr)
const;
646 bool may_fold_index(
const expr2tc &index)
const;
651 block_assertions =
true;
656 block_assertions =
false;
static const twodig_t base
Definition bigint.cpp:28
Class providing interface to value set tracking code.
Definition dereference.h:96
virtual ~dereference_callbackt()=default
virtual void dump_internal_state(const std::list< struct internal_item > &data)
Definition dereference.h:151
virtual bool has_failed_symbol(const expr2tc &expr, const symbolt *&symbol)=0
Check whether a failed symbol already exists for the given symbol.
virtual void dereference_assume(const guard2tc &guard)=0
virtual void get_value_set(const expr2tc &expr, value_setst::valuest &value_set)=0
Fetch the set of values that the given pointer variable can point at.
virtual void dereference_failure(const std::string &property, const std::string &msg, const guard2tc &guard)=0
Encode a dereference failure assertion.
virtual void rename(expr2tc &expr)
Rename the given expression into the callback's current execution context.
Definition dereference.h:140
virtual bool is_live_variable(const expr2tc &sym)=0
Determine whether variable is "alive".
static const constexpr modet READ
Definition dereference.h:244
static void reset_object_counter()
Zero the failed-symbol counter.
Definition dereference.cpp:26
dereferencet(const namespacet &_ns, contextt &_new_context, const optionst &_options, dereference_callbackt &_dereference_callback)
Primary constructor.
Definition dereference.h:183
static const constexpr modet FREE
Definition dereference.h:246
void set_block_assertions(void)
Definition dereference.h:649
virtual void dereference_expr(expr2tc &expr, guard2tc &guard, modet mode)
Take an expression and dereference it.
Definition dereference.cpp:217
virtual ~dereferencet()=default
void build_reference_rec(expr2tc &value, const expr2tc &offset, const type2tc &type, const guard2tc &guard, modet mode, unsigned long alignment=0)
Definition dereference.cpp:1269
void clear_block_assertions(void)
Definition dereference.h:654
static const constexpr modet INTERNAL
Definition dereference.h:247
virtual expr2tc dereference(const expr2tc &dest, const type2tc &type, const guard2tc &guard, modet mode, const expr2tc &extra_offset)
Definition dereference.cpp:639
static const constexpr modet WRITE
Definition dereference.h:245
bool has_dereference(const expr2tc &expr) const
Does the given expression have a dereference in it somewhere?
Definition dereference.cpp:109
Path-condition guard container.
Definition irep2_guard.h:32
Definition namespace.h:10
std::list< expr2tc > valuest
Definition value_sets.h:15
configt config
Definition config.cpp:8
irep_container< type2t > type2tc
Definition irep2.h:430
irep_container< expr2t > expr2tc
Definition irep2.h:431
#define false
Definition stdbool.h:10
@ IS_BIG_ENDIAN
Definition config.h:147
Definition dereference.h:145
expr2tc offset
Definition dereference.h:147
expr2tc guard
Definition dereference.h:148
expr2tc object
Definition dereference.h:146
The different ways in which a pointer may be accessed.
Definition dereference.h:202
friend bool is_write(const modet &m)
Definition dereference.h:228
unsigned unaligned
Whether the access is performed in a non-standard, known-unaligned way as for, e.g....
Definition dereference.h:215
enum dereferencet::modet::@064115070053313312275356267176237112014342131337 op
friend bool is_internal(const modet &m)
Definition dereference.h:238
friend bool is_free(const modet &m)
Definition dereference.h:233
@ WRITE
The result of the expression is only read.
Definition dereference.h:206
@ READ
Definition dereference.h:205
@ INTERNAL
The referred to object will be freed.
Definition dereference.h:208
@ FREE
The result of the expression will be written to.
Definition dereference.h:207
friend bool is_read(const modet &m)
Definition dereference.h:223
BigInt alignment(const typet &type, const namespacet &ns)
Definition type_byte_size.cpp:664
BigInt object_base_alignment(const typet &type, const expr2tc &size, const namespacet &ns)
Definition type_byte_size.cpp:781