diff --git a/src/goto-programs/interpreter.cpp b/src/goto-programs/interpreter.cpp index 280635aed60..5cf742502a0 100644 --- a/src/goto-programs/interpreter.cpp +++ b/src/goto-programs/interpreter.cpp @@ -30,7 +30,7 @@ Author: Daniel Kroening, kroening@kroening.com #include "interpreter_class.h" #include "remove_returns.h" -const size_t interpretert::npos=std::numeric_limits::max(); +const std::size_t interpretert::npos=std::numeric_limits::max(); void interpretert::operator()() { @@ -392,7 +392,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()); + mp_integer size=get_size(pc->code.op0().type()); while(rhs.size()type()); - const exprt operand=get_value(it->type(), offset); - offset+=size; + mp_integer size=get_size(c.type()); + const exprt operand=get_value(c.type(), tmp_offset); + tmp_offset+=size; result.copy_to_operands(operand); } + return result; } else if(real_type.id()==ID_array) @@ -480,22 +485,20 @@ 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; + mp_integer subtype_size=get_size(type.subtype()); + mp_integer count; if(size_expr.id()!=ID_constant) { count=base_address_to_actual_size(offset)/subtype_size; } else { - mp_integer mp_count; - to_integer(size_expr, mp_count); - count=integer2size_t(mp_count); + to_integer(size_expr, 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; + mp_integer subtype_size=get_size(type.subtype()); + + mp_integer count; if(unbounded_size(type)) { count=base_address_to_actual_size(offset)/subtype_size; } else { - mp_integer mp_count; - to_integer(size_expr, mp_count); - count=integer2unsigned(mp_count); + to_integer(size_expr, count); } // Retrieve the value for each member in the array - result.reserve_operands(count); - for(unsigned i=0; i object count " << memory.size() << eom; + throw "interpreter: reading from invalid pointer"; } else if(real_type.id()==ID_string) { // 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[integer2ulong(offset)], type); } /// executes the assign statement at the current pc value @@ -656,7 +662,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()); + mp_integer size=get_size(code_assign.lhs().type()); if(size!=rhs.size()) error() << "!! failed to obtain rhs (" @@ -684,11 +690,15 @@ 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; icode); // function to be called - mp_integer a=evaluate_address(function_call.function()); + mp_integer address=evaluate_address(function_call.function()); - if(a==0) + if(address==0) throw "function call to NULL"; - else if(a>=memory.size()) + else if(address>=memory.size()) throw "out-of-range function call"; // Retrieve the empty last trace step struct we pushed for this step // of the interpreter run to fill it with the corresponding data goto_trace_stept &trace_step=steps.get_last_step(); - std::size_t address=integer2size_t(a); #if 0 const memory_cellt &cell=memory[address]; #endif @@ -803,7 +813,7 @@ void interpretert::execute_function_call() for(const auto &id : locals) { const symbolt &symbol=ns.lookup(id); - frame.local_map[id]=integer2unsigned(build_memory_map(id, symbol.type)); + frame.local_map[id]=build_memory_map(id, symbol.type); } // assign the arguments @@ -813,7 +823,7 @@ void interpretert::execute_function_call() if(argument_values.size()(id, alloc_type)); @@ -970,17 +980,17 @@ bool interpretert::unbounded_size(const typet &type) /// get allocated 2^32 address space each (of a 2^64 sized space). /// \param type: a structured type /// \return Size of the given type -size_t interpretert::get_size(const typet &type) +mp_integer interpretert::get_size(const typet &type) { if(unbounded_size(type)) - return 2ULL << 32ULL; + return mp_integer(2) << 32; if(type.id()==ID_struct) { const struct_typet::componentst &components= to_struct_type(type).components(); - unsigned sum=0; + mp_integer sum=0; for(const auto &comp : components) { @@ -997,7 +1007,7 @@ size_t interpretert::get_size(const typet &type) const union_typet::componentst &components= to_union_type(type).components(); - size_t max_size=0; + mp_integer max_size=0; for(const auto &comp : components) { @@ -1013,7 +1023,7 @@ size_t interpretert::get_size(const typet &type) { const exprt &size_expr=static_cast(type.find(ID_size)); - size_t subtype_size=get_size(type.subtype()); + mp_integer subtype_size=get_size(type.subtype()); mp_vectort i; evaluate(size_expr, i); @@ -1025,7 +1035,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; } @@ -1051,7 +1061,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); } /// Prints the current state of the memory map Since messaget mdofifies class @@ -1060,7 +1070,7 @@ void interpretert::print_memory(bool input_flags) { for(const auto &cell_address : memory) { - std::size_t i=cell_address.first; + mp_integer 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 e26d4911b02..a3dbd316f9b 100644 --- a/src/goto-programs/interpreter_class.h +++ b/src/goto-programs/interpreter_class.h @@ -104,13 +104,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) @@ -121,34 +121,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); + auto memory_iter=memory.find(integer2ulong(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; @@ -187,25 +187,31 @@ 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); struct_typet::componentt get_component( const irep_idt &object, - unsigned offset); + const mp_integer &offset); typet get_type(const irep_idt &id) const; + exprt get_value( const typet &type, - std::size_t offset=0, + const 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, + const mp_integer &offset=0); + exprt get_value(const irep_idt &id); void step(); @@ -221,7 +227,7 @@ class interpretert:public messaget void allocate( const mp_integer &address, - size_t size); + const mp_integer &size); void assign( const mp_integer &address, @@ -244,7 +250,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; @@ -265,7 +271,7 @@ class interpretert:public messaget dynamic_typest dynamic_types; int num_dynamic_objects; - size_t stack_depth; + mp_integer stack_depth; int thread_id; bool evaluate_boolean(const exprt &expr) diff --git a/src/goto-programs/interpreter_evaluate.cpp b/src/goto-programs/interpreter_evaluate.cpp index 81d3fd33527..72c1429d2aa 100644 --- a/src/goto-programs/interpreter_evaluate.cpp +++ b/src/goto-programs/interpreter_evaluate.cpp @@ -28,13 +28,13 @@ void interpretert::read( mp_vectort &dest) const { // copy memory region - for(size_t i=0; itype().id()==ID_code) continue; - size_t sub_size=get_size(it->type()); + mp_integer sub_size=get_size(it->type()); if(sub_size==0) continue; @@ -324,7 +324,7 @@ void interpretert::evaluate( if(tmp.size()==sub_size) { - for(size_t i=0; itype().id()==ID_code) continue; - size_t sub_size=get_size(it->type()); + mp_integer sub_size=get_size(it->type()); if(sub_size==0) continue; @@ -418,7 +419,7 @@ void interpretert::evaluate( if(unbounded_size(it->type()) || tmp.size()==sub_size) { - for(size_t i=0; i0 && address