Skip to content

Commit 5191170

Browse files
authored
Merge pull request #1485 from diffblue/std_expr_typing
elaborate typing of std_expr expression classes
2 parents 210a2f4 + fbc54ad commit 5191170

File tree

9 files changed

+167
-170
lines changed

9 files changed

+167
-170
lines changed

src/analyses/custom_bitvector_analysis.cpp

+69-55
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,17 @@ irep_idt custom_bitvector_domaint::object2id(const exprt &src)
6767
}
6868
else if(op.id()==ID_typecast)
6969
{
70-
return object2id(dereference_exprt(to_typecast_expr(op).op()));
70+
irep_idt op_id=object2id(to_typecast_expr(op).op());
71+
72+
if(op_id.empty())
73+
return irep_idt();
74+
else
75+
return '*'+id2string(op_id);
7176
}
7277
else
7378
{
7479
irep_idt op_id=object2id(op);
80+
7581
if(op_id.empty())
7682
return irep_idt();
7783
else
@@ -188,9 +194,8 @@ std::set<exprt> custom_bitvector_analysist::aliases(
188194
std::set<exprt> result;
189195

190196
for(const auto &pointer : pointer_set)
191-
{
192-
result.insert(dereference_exprt(pointer));
193-
}
197+
if(pointer.type().id()==ID_pointer)
198+
result.insert(dereference_exprt(pointer));
194199

195200
result.insert(src);
196201

@@ -300,36 +305,39 @@ void custom_bitvector_domaint::transform(
300305

301306
exprt lhs=code_function_call.arguments()[0];
302307

303-
if(lhs.is_constant() &&
304-
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
308+
if(lhs.type().id()==ID_pointer)
305309
{
306-
if(mode==modet::CLEAR_MAY)
310+
if(lhs.is_constant() &&
311+
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
307312
{
308-
for(auto &bit : may_bits)
309-
clear_bit(bit.second, bit_nr);
310-
311-
// erase blank ones
312-
erase_blank_vectors(may_bits);
313+
if(mode==modet::CLEAR_MAY)
314+
{
315+
for(auto &bit : may_bits)
316+
clear_bit(bit.second, bit_nr);
317+
318+
// erase blank ones
319+
erase_blank_vectors(may_bits);
320+
}
321+
else if(mode==modet::CLEAR_MUST)
322+
{
323+
for(auto &bit : must_bits)
324+
clear_bit(bit.second, bit_nr);
325+
326+
// erase blank ones
327+
erase_blank_vectors(must_bits);
328+
}
313329
}
314-
else if(mode==modet::CLEAR_MUST)
330+
else
315331
{
316-
for(auto &bit : must_bits)
317-
clear_bit(bit.second, bit_nr);
318-
319-
// erase blank ones
320-
erase_blank_vectors(must_bits);
321-
}
322-
}
323-
else
324-
{
325-
dereference_exprt deref(lhs);
332+
dereference_exprt deref(lhs);
326333

327-
// may alias other stuff
328-
std::set<exprt> lhs_set=cba.aliases(deref, from);
334+
// may alias other stuff
335+
std::set<exprt> lhs_set=cba.aliases(deref, from);
329336

330-
for(const auto &lhs : lhs_set)
331-
{
332-
set_bit(lhs, bit_nr, mode);
337+
for(const auto &lhs : lhs_set)
338+
{
339+
set_bit(lhs, bit_nr, mode);
340+
}
333341
}
334342
}
335343
}
@@ -415,40 +423,43 @@ void custom_bitvector_domaint::transform(
415423

416424
exprt lhs=instruction.code.op0();
417425

418-
if(lhs.is_constant() &&
419-
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
426+
if(lhs.type().id()==ID_pointer)
420427
{
421-
if(mode==modet::CLEAR_MAY)
428+
if(lhs.is_constant() &&
429+
to_constant_expr(lhs).get_value()==ID_NULL) // NULL means all
422430
{
423-
for(bitst::iterator b_it=may_bits.begin();
424-
b_it!=may_bits.end();
425-
b_it++)
426-
clear_bit(b_it->second, bit_nr);
431+
if(mode==modet::CLEAR_MAY)
432+
{
433+
for(bitst::iterator b_it=may_bits.begin();
434+
b_it!=may_bits.end();
435+
b_it++)
436+
clear_bit(b_it->second, bit_nr);
427437

428-
// erase blank ones
429-
erase_blank_vectors(may_bits);
430-
}
431-
else if(mode==modet::CLEAR_MUST)
432-
{
433-
for(bitst::iterator b_it=must_bits.begin();
434-
b_it!=must_bits.end();
435-
b_it++)
436-
clear_bit(b_it->second, bit_nr);
438+
// erase blank ones
439+
erase_blank_vectors(may_bits);
440+
}
441+
else if(mode==modet::CLEAR_MUST)
442+
{
443+
for(bitst::iterator b_it=must_bits.begin();
444+
b_it!=must_bits.end();
445+
b_it++)
446+
clear_bit(b_it->second, bit_nr);
437447

438-
// erase blank ones
439-
erase_blank_vectors(must_bits);
448+
// erase blank ones
449+
erase_blank_vectors(must_bits);
450+
}
440451
}
441-
}
442-
else
443-
{
444-
dereference_exprt deref(lhs);
452+
else
453+
{
454+
dereference_exprt deref(lhs);
445455

446-
// may alias other stuff
447-
std::set<exprt> lhs_set=cba.aliases(deref, from);
456+
// may alias other stuff
457+
std::set<exprt> lhs_set=cba.aliases(deref, from);
448458

449-
for(const auto &lhs : lhs_set)
450-
{
451-
set_bit(lhs, bit_nr, mode);
459+
for(const auto &lhs : lhs_set)
460+
{
461+
set_bit(lhs, bit_nr, mode);
462+
}
452463
}
453464
}
454465
}
@@ -628,6 +639,9 @@ exprt custom_bitvector_domaint::eval(
628639

629640
exprt pointer=src.op0();
630641

642+
if(pointer.type().id()!=ID_pointer)
643+
return src;
644+
631645
if(pointer.is_constant() &&
632646
to_constant_expr(pointer).get_value()==ID_NULL) // NULL means all
633647
{

src/cpp/cpp_typecheck_resolve.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -2127,9 +2127,11 @@ void cpp_typecheck_resolvet::apply_template_args(
21272127

21282128
DATA_INVARIANT(struct_type.has_component(new_symbol.name),
21292129
"method should exist in struct");
2130-
member_exprt member(code_type);
2131-
member.set_component_name(new_symbol.name);
2132-
member.struct_op()=*fargs.operands.begin();
2130+
2131+
member_exprt member(
2132+
*fargs.operands.begin(),
2133+
new_symbol.name,
2134+
code_type);
21332135
member.add_source_location()=source_location;
21342136
expr.swap(member);
21352137
return;

src/goto-programs/interpreter.cpp

+14-9
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ void interpretert::execute_decl()
417417

418418
/// retrieves the member at offset
419419
/// \par parameters: an object and a memory offset
420-
irep_idt interpretert::get_component_id(
420+
struct_typet::componentt interpretert::get_component(
421421
const irep_idt &object,
422422
unsigned offset)
423423
{
@@ -428,15 +428,16 @@ irep_idt interpretert::get_component_id(
428428

429429
const struct_typet &struct_type=to_struct_type(real_type);
430430
const struct_typet::componentst &components=struct_type.components();
431-
for(struct_typet::componentst::const_iterator it=components.begin();
432-
it!=components.end(); it++)
431+
432+
for(const auto &c : components)
433433
{
434434
if(offset<=0)
435-
return it->id();
436-
size_t size=get_size(it->type());
437-
offset-=size;
435+
return c;
436+
437+
offset-=get_size(c.type());
438438
}
439-
return object;
439+
440+
throw "access out of struct bounds";
440441
}
441442

442443
/// returns the type object corresponding to id
@@ -600,6 +601,7 @@ exprt interpretert::get_value(
600601
result.set_value(ID_NULL);
601602
return result;
602603
}
604+
603605
if(rhs[offset]<memory.size())
604606
{
605607
// We want the symbol pointed to
@@ -612,15 +614,18 @@ exprt interpretert::get_value(
612614

613615
if(offset==0)
614616
return address_of_exprt(symbol_expr);
617+
615618
if(ns.follow(type).id()==ID_struct)
616619
{
617-
irep_idt member_id=get_component_id(identifier, offset);
618-
member_exprt member_expr(symbol_expr, member_id);
620+
const auto c=get_component(identifier, offset);
621+
member_exprt member_expr(symbol_expr, c);
619622
return address_of_exprt(member_expr);
620623
}
624+
621625
index_exprt index_expr(
622626
symbol_expr,
623627
from_integer(offset, integer_typet()));
628+
624629
return index_expr;
625630
}
626631

src/goto-programs/interpreter_class.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ Author: Daniel Kroening, [email protected]
1616

1717
#include <util/arith_tools.h>
1818
#include <util/invariant.h>
19+
#include <util/std_types.h>
1920
#include <util/sparse_vector.h>
21+
#include <util/message.h>
2022

2123
#include "goto_functions.h"
2224
#include "goto_trace.h"
2325
#include "json_goto_trace.h"
24-
#include "util/message.h"
2526

2627
class interpretert:public messaget
2728
{
@@ -195,7 +196,10 @@ class interpretert:public messaget
195196
bool unbounded_size(const typet &);
196197
size_t get_size(const typet &type);
197198

198-
irep_idt get_component_id(const irep_idt &object, unsigned offset);
199+
struct_typet::componentt get_component(
200+
const irep_idt &object,
201+
unsigned offset);
202+
199203
typet get_type(const irep_idt &id) const;
200204
exprt get_value(
201205
const typet &type,

src/goto-programs/string_abstraction.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -1333,19 +1333,24 @@ exprt string_abstractiont::member(const exprt &a, whatt what)
13331333
{
13341334
if(a.is_nil())
13351335
return a;
1336+
13361337
assert(type_eq(a.type(), string_struct, ns) ||
13371338
is_ptr_string_struct(a.type()));
13381339

1339-
member_exprt result(build_type(what));
1340-
result.struct_op()=a.type().id()==ID_pointer?
1340+
exprt struct_op=
1341+
a.type().id()==ID_pointer?
13411342
dereference_exprt(a, string_struct):a;
13421343

1344+
irep_idt component_name;
1345+
13431346
switch(what)
13441347
{
1345-
case whatt::IS_ZERO: result.set_component_name("is_zero"); break;
1346-
case whatt::SIZE: result.set_component_name("size"); break;
1347-
case whatt::LENGTH: result.set_component_name("length"); break;
1348+
case whatt::IS_ZERO: component_name="is_zero"; break;
1349+
case whatt::SIZE: component_name="size"; break;
1350+
case whatt::LENGTH: component_name="length"; break;
13481351
}
13491352

1353+
member_exprt result(struct_op, component_name, build_type(what));
1354+
13501355
return result;
13511356
}

src/linking/linking.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ void linkingt::detailed_conflict_report_rec(
200200
conflict_path=conflict_path_before;
201201
conflict_path.type()=t1;
202202
conflict_path=
203-
member_exprt(conflict_path, components1[i].get_name());
203+
member_exprt(conflict_path, components1[i]);
204204

205205
if(depth>0 &&
206206
parent_types.find(t1)==parent_types.end())

src/pointer-analysis/value_set.cpp

+4-10
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ void value_sett::get_value_set_rec(
833833

834834
found=true;
835835

836-
member_exprt member(expr.op0(), name, c_it->type());
836+
member_exprt member(expr.op0(), *c_it);
837837
get_value_set_rec(member, dest, suffix, original_type, ns);
838838
}
839839
}
@@ -1050,9 +1050,7 @@ void value_sett::get_reference_set_rec(
10501050
{
10511051
objectt o=it->second;
10521052

1053-
member_exprt member_expr(expr.type());
1054-
member_expr.op0()=object;
1055-
member_expr.set_component_name(component_name);
1053+
member_exprt member_expr(object, component_name, expr.type());
10561054

10571055
// We cannot introduce a cast from scalar to non-scalar,
10581056
// thus, we can only adjust the types of structs and unions.
@@ -1121,9 +1119,7 @@ void value_sett::assign(
11211119
if(subtype.id()==ID_code ||
11221120
c_it->get_is_padding()) continue;
11231121

1124-
member_exprt lhs_member(subtype);
1125-
lhs_member.set_component_name(name);
1126-
lhs_member.op0()=lhs;
1122+
member_exprt lhs_member(lhs, name, subtype);
11271123

11281124
exprt rhs_member;
11291125

@@ -1688,9 +1684,7 @@ exprt value_sett::make_member(
16881684

16891685
// give up
16901686
typet subtype=struct_union_type.component_type(component_name);
1691-
member_exprt member_expr(subtype);
1692-
member_expr.op0()=src;
1693-
member_expr.set_component_name(component_name);
1687+
member_exprt member_expr(src, component_name, subtype);
16941688

16951689
return member_expr;
16961690
}

src/solvers/flattening/pointer_logic.cpp

+3-8
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,11 @@ exprt pointer_logict::object_rec(
146146

147147
mp_integer current_offset=0;
148148

149-
for(struct_typet::componentst::const_iterator
150-
it=components.begin();
151-
it!=components.end();
152-
it++)
149+
for(const auto &c : components)
153150
{
154151
assert(offset>=current_offset);
155152

156-
const typet &subtype=it->type();
153+
const typet &subtype=c.type();
157154

158155
mp_integer sub_size=pointer_offset_size(subtype, ns);
159156
assert(sub_size>0);
@@ -162,9 +159,7 @@ exprt pointer_logict::object_rec(
162159
if(new_offset>offset)
163160
{
164161
// found it
165-
member_exprt tmp(subtype);
166-
tmp.set_component_name(it->get_name());
167-
tmp.op0()=src;
162+
member_exprt tmp(src, c);
168163

169164
return object_rec(
170165
offset-current_offset, pointer_type, tmp);

0 commit comments

Comments
 (0)