diff --git a/src/goto-programs/interpreter.cpp b/src/goto-programs/interpreter.cpp index 25d2be08cb8..46567548e2b 100644 --- a/src/goto-programs/interpreter.cpp +++ b/src/goto-programs/interpreter.cpp @@ -12,11 +12,13 @@ Author: Daniel Kroening, kroening@kroening.com #include "interpreter.h" #include +#include #include #include #include #include #include +#include #include #include @@ -392,7 +394,7 @@ void interpretert::execute_other() mp_vectort tmp, rhs; evaluate(pc->code.op1(), tmp); mp_integer address=evaluate_address(pc->code.op0()); - size_t size=get_size(pc->code.op0().type()); + const auto size=get_size(pc->code.op0().type()); while(rhs.size()id(); - size_t size=get_size(it->type()); + const auto size=get_size(it->type()); offset-=size; } return object; @@ -452,7 +454,7 @@ typet interpretert::get_type(const irep_idt &id) const /// type exprt interpretert::get_value( const typet &type, - std::size_t offset, + mp_integer offset, bool use_non_det) { const typet real_type=ns.follow(type); @@ -467,7 +469,7 @@ exprt interpretert::get_value( for(struct_typet::componentst::const_iterator it=components.begin(); it!=components.end(); it++) { - size_t size=get_size(it->type()); + const auto size=get_size(it->type()); const exprt operand=get_value(it->type(), offset); offset+=size; result.copy_to_operands(operand); @@ -479,8 +481,8 @@ exprt interpretert::get_value( // Get size of array exprt result=array_exprt(to_array_type(real_type)); const exprt &size_expr=static_cast(type.find(ID_size)); - size_t subtype_size=get_size(type.subtype()); - std::size_t count; + const auto subtype_size=get_size(type.subtype()); + mp_integer count=0; if(size_expr.id()!=ID_constant) { count=base_address_to_actual_size(offset)/subtype_size; @@ -489,12 +491,12 @@ exprt interpretert::get_value( { mp_integer mp_count; to_integer(size_expr, mp_count); - count=integer2size_t(mp_count); + count=mp_count; } // Retrieve the value for each member in the array - result.reserve_operands(count); - for(unsigned i=0; i(type.find(ID_size)); // Get size of array - size_t subtype_size=get_size(type.subtype()); - unsigned count; + const auto subtype_size=get_size(type.subtype()); + mp_integer count; if(unbounded_size(type)) { count=base_address_to_actual_size(offset)/subtype_size; @@ -555,12 +557,12 @@ exprt interpretert::get_value( { mp_integer mp_count; to_integer(size_expr, mp_count); - count=integer2unsigned(mp_count); + count=mp_count; } // Retrieve the value for each member in the array - result.reserve_operands(count); - for(unsigned i=0; i::type i=0; i object count " << memory.size() << eom; throw "interpreter: reading from invalid pointer"; } @@ -632,11 +634,11 @@ exprt interpretert::get_value( { // Strings are currently encoded by their irep_idt ID. return constant_exprt( - irep_idt::make_from_table_index(rhs[offset].to_long()), + irep_idt::make_from_table_index(rhs[integer2size_t(offset)].to_long()), type); } // Retrieve value of basic data type - return from_integer(rhs[offset], type); + return from_integer(rhs[integer2size_t(offset)], type); } /// executes the assign statement at the current pc value @@ -651,7 +653,7 @@ void interpretert::execute_assign() if(!rhs.empty()) { mp_integer address=evaluate_address(code_assign.lhs()); - size_t size=get_size(code_assign.lhs().type()); + const auto size=get_size(code_assign.lhs().type()); if(size!=rhs.size()) error() << "!! failed to obtain rhs (" @@ -679,9 +681,9 @@ void interpretert::execute_assign() side_effect_exprt side_effect=to_side_effect_expr(code_assign.rhs()); if(side_effect.get_statement()==ID_nondet) { - unsigned address=integer2unsigned(evaluate_address(code_assign.lhs())); - size_t size=get_size(code_assign.lhs().type()); - for(size_t i=0; i::type i=0; i(type.find(ID_size)); - size_t subtype_size=get_size(type.subtype()); + const auto subtype_size=get_size(type.subtype()); mp_vectort i; evaluate(size_expr, i); @@ -1020,7 +1022,7 @@ size_t interpretert::get_size(const typet &type) mp_integer size_mp; bool ret=to_integer(size_const, size_mp); CHECK_RETURN(!ret); - return subtype_size*integer2unsigned(size_mp); + return subtype_size*size_mp; } return subtype_size; } @@ -1036,7 +1038,7 @@ exprt interpretert::get_value(const irep_idt &id) // The dynamic type and the static symbol type may differ for VLAs, // where the symbol carries a size expression and the dynamic type // registry contains its actual length. - auto findit=dynamic_types.find(id); + const auto findit=dynamic_types.find(id); typet get_type; if(findit!=dynamic_types.end()) get_type=findit->second; @@ -1046,7 +1048,7 @@ exprt interpretert::get_value(const irep_idt &id) symbol_exprt symbol_expr(id, get_type); mp_integer whole_lhs_object_address=evaluate_address(symbol_expr); - return get_value(get_type, integer2size_t(whole_lhs_object_address)); + return get_value(get_type, whole_lhs_object_address); } void interpreter( @@ -1067,7 +1069,7 @@ void interpretert::print_memory(bool input_flags) { for(const auto &cell_address : memory) { - std::size_t i=cell_address.first; + const auto i=cell_address.first; const memory_cellt &cell=cell_address.second; const auto identifier=address_to_identifier(i); const auto offset=address_to_offset(i); diff --git a/src/goto-programs/interpreter_class.h b/src/goto-programs/interpreter_class.h index 1b9ab433083..3d6b870f121 100644 --- a/src/goto-programs/interpreter_class.h +++ b/src/goto-programs/interpreter_class.h @@ -103,13 +103,13 @@ class interpretert:public messaget const goto_functionst &goto_functions; - typedef std::unordered_map memory_mapt; - typedef std::map inverse_memory_mapt; + typedef std::unordered_map memory_mapt; + typedef std::map inverse_memory_mapt; memory_mapt memory_map; inverse_memory_mapt inverse_memory_map; const inverse_memory_mapt::value_type &address_to_object_record( - std::size_t address) const + const mp_integer &address) const { auto lower_bound=inverse_memory_map.lower_bound(address); if(lower_bound->first!=address) @@ -120,34 +120,34 @@ class interpretert:public messaget return *lower_bound; } - irep_idt address_to_identifier(std::size_t address) const + irep_idt address_to_identifier(const mp_integer &address) const { return address_to_object_record(address).second; } - std::size_t address_to_offset(std::size_t address) const + mp_integer address_to_offset(const mp_integer &address) const { return address-(address_to_object_record(address).first); } - std::size_t base_address_to_alloc_size(std::size_t address) const + mp_integer base_address_to_alloc_size(const mp_integer &address) const { PRECONDITION(address_to_offset(address)==0); auto upper_bound=inverse_memory_map.upper_bound(address); - std::size_t next_alloc_address= + mp_integer next_alloc_address= upper_bound==inverse_memory_map.end() ? memory.size() : upper_bound->first; return next_alloc_address-address; } - std::size_t base_address_to_actual_size(std::size_t address) const + mp_integer base_address_to_actual_size(const mp_integer &address) const { auto memory_iter=memory.find(address); if(memory_iter==memory.end()) return 0; - std::size_t ret=0; - std::size_t alloc_size=base_address_to_alloc_size(address); + mp_integer ret=0; + mp_integer alloc_size=base_address_to_alloc_size(address); while(memory_iter!=memory.end() && memory_iter->first<(address+alloc_size)) { ++ret; @@ -186,22 +186,23 @@ class interpretert:public messaget // properties need to be mutable to avoid making all calls nonconst mutable memoryt memory; - std::size_t stack_pointer; + mp_integer stack_pointer; void build_memory_map(); void build_memory_map(const symbolt &symbol); mp_integer build_memory_map(const irep_idt &id, const typet &type); typet concretize_type(const typet &type); bool unbounded_size(const typet &); - size_t get_size(const typet &type); + mp_integer get_size(const typet &type); - irep_idt get_component_id(const irep_idt &object, unsigned offset); + irep_idt get_component_id(const irep_idt &object, mp_integer offset); typet get_type(const irep_idt &id) const; exprt get_value( const typet &type, - std::size_t offset=0, + mp_integer offset=0, bool use_non_det=false); - exprt get_value(const typet &type, mp_vectort &rhs, std::size_t offset=0); + exprt get_value( + const typet &type, mp_vectort &rhs, mp_integer offset=0); exprt get_value(const irep_idt &id); void step(); @@ -217,7 +218,7 @@ class interpretert:public messaget void allocate( const mp_integer &address, - size_t size); + mp_integer size); void assign( const mp_integer &address, @@ -240,7 +241,7 @@ class interpretert:public messaget goto_functionst::function_mapt::const_iterator return_function; mp_integer return_value_address; memory_mapt local_map; - unsigned old_stack_pointer; + mp_integer old_stack_pointer; }; typedef std::stack call_stackt; diff --git a/src/goto-programs/interpreter_evaluate.cpp b/src/goto-programs/interpreter_evaluate.cpp index 81d3fd33527..6c9b6b76368 100644 --- a/src/goto-programs/interpreter_evaluate.cpp +++ b/src/goto-programs/interpreter_evaluate.cpp @@ -51,12 +51,12 @@ void interpretert::read_unbounded( mp_vectort &dest) const { // copy memory region - std::size_t address_val=integer2size_t(address); - const std::size_t offset=address_to_offset(address_val); - const std::size_t alloc_size= + const auto address_val=address; + const auto offset=address_to_offset(address_val); + const auto alloc_size= base_address_to_actual_size(address_val-offset); - const std::size_t to_read=alloc_size-offset; - for(size_t i=0; i::type i=0; itype().id()==ID_code) continue; - size_t sub_size=get_size(it->type()); + const auto sub_size=get_size(it->type()); if(sub_size==0) continue; @@ -324,8 +324,8 @@ void interpretert::evaluate( if(tmp.size()==sub_size) { - for(size_t i=0; i::type i=0; itype().id()==ID_code) continue; - size_t sub_size=get_size(it->type()); + const auto sub_size=get_size(it->type()); if(sub_size==0) continue; @@ -852,7 +852,7 @@ void interpretert::evaluate( mp_integer address=result[0]; if(address>0 && address::type i=0; i #include @@ -20,35 +21,36 @@ Author: Romain Brenguier template class sparse_vectort { protected: - typedef std::map underlyingt; + typedef std::map underlyingt; + typedef typename underlyingt::key_type key_type; underlyingt underlying; - uint64_t _size; + mp_integer _size; public: sparse_vectort() : _size(0) {} - const T &operator[](uint64_t idx) const + const T &operator[](const key_type &idx) const { INVARIANT(idx<_size, "index out of range"); return underlying[idx]; } - T &operator[](uint64_t idx) + T &operator[](const key_type &idx) { INVARIANT(idx<_size, "index out of range"); return underlying[idx]; } - uint64_t size() const + mp_integer size() const { return _size; } - void resize(uint64_t new_size) + void resize(mp_integer new_size) { INVARIANT(new_size>=_size, "sparse vector can't be shrunk (yet)"); - _size=new_size; + _size=std::move(new_size); } typedef typename underlyingt::iterator iteratort; @@ -60,7 +62,7 @@ template class sparse_vectort iteratort end() { return underlying.end(); } const_iteratort end() const { return underlying.end(); } - const_iteratort find(uint64_t idx) { return underlying.find(idx); } + const_iteratort find(const mp_integer &idx) { return underlying.find(idx); } }; #endif // CPROVER_UTIL_SPARSE_VECTOR_H