Skip to content

Commit 20a2055

Browse files
author
Daniel Kroening
authored
Merge pull request #5018 from diffblue/java_bytecode-opX
fix exprt::opX accesses in java_bytecode
2 parents 31c0c5d + 185a3c3 commit 20a2055

8 files changed

+35
-27
lines changed

jbmc/src/java_bytecode/expr2java.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,10 @@ std::string expr2javat::convert_java_instanceof(const exprt &src)
326326
return convert_norep(src, precedence);
327327
}
328328

329-
return convert(src.op0())+" instanceof "+convert(src.op1().type());
329+
const auto &binary_expr = to_binary_expr(src);
330+
331+
return convert(binary_expr.op0()) + " instanceof " +
332+
convert(binary_expr.op1().type());
330333
}
331334

332335
std::string expr2javat::convert_code_java_new(const exprt &src, unsigned indent)
@@ -370,7 +373,7 @@ std::string expr2javat::convert_code_java_delete(
370373
return convert_norep(src, precedence);
371374
}
372375

373-
std::string tmp=convert(src.op0());
376+
std::string tmp = convert(to_unary_expr(src).op());
374377

375378
dest+=tmp+";\n";
376379

jbmc/src/java_bytecode/java_bytecode_convert_class.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -914,10 +914,10 @@ void add_java_array_types(symbol_tablet &symbol_table)
914914

915915
code_declt declare_index(index_symexpr);
916916

917-
side_effect_exprt inc(ID_assign, typet(), location);
918-
inc.operands().resize(2);
919-
inc.op0()=index_symexpr;
920-
inc.op1()=plus_exprt(index_symexpr, from_integer(1, index_symexpr.type()));
917+
side_effect_expr_assignt inc(
918+
index_symexpr,
919+
plus_exprt(index_symexpr, from_integer(1, index_symexpr.type())),
920+
location);
921921

922922
dereference_exprt old_cell(
923923
plus_exprt(old_data, index_symexpr), old_data.type().subtype());

jbmc/src/java_bytecode/java_bytecode_instrument.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,10 @@ void java_bytecode_instrumentt::instrument_code(codet &code)
378378
code_assert.assertion().operands().size()==2,
379379
"Instanceof should have 2 operands");
380380

381-
code=
382-
check_class_cast(
383-
code_assert.assertion().op0(),
384-
code_assert.assertion().op1(),
385-
code_assert.source_location());
381+
const auto & instanceof = to_binary_expr(code_assert.assertion());
382+
383+
code = check_class_cast(
384+
instanceof.op0(), instanceof.op1(), code_assert.source_location());
386385
}
387386
}
388387
else if(statement==ID_block)
@@ -494,20 +493,23 @@ optionalt<codet> java_bytecode_instrumentt::instrument_expr(const exprt &expr)
494493
{
495494
// this corresponds to a throw and so we check that
496495
// we don't throw null
497-
result.add(check_null_dereference(expr.op0(), expr.source_location()));
496+
result.add(check_null_dereference(
497+
to_unary_expr(expr).op(), expr.source_location()));
498498
}
499499
else if(statement==ID_java_new_array)
500500
{
501501
// this corresponds to new array so we check that
502502
// length is >=0
503-
result.add(check_array_length(expr.op0(), expr.source_location()));
503+
result.add(check_array_length(
504+
to_multi_ary_expr(expr).op0(), expr.source_location()));
504505
}
505506
}
506507
else if((expr.id()==ID_div || expr.id()==ID_mod) &&
507508
expr.type().id()==ID_signedbv)
508509
{
509510
// check division by zero (for integer types only)
510-
result.add(check_arithmetic_exception(expr.op1(), expr.source_location()));
511+
result.add(check_arithmetic_exception(
512+
to_binary_expr(expr).op1(), expr.source_location()));
511513
}
512514
else if(expr.id()==ID_dereference &&
513515
expr.get_bool(ID_java_member_access))

jbmc/src/java_bytecode/java_object_factory.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ void java_object_factoryt::gen_pointer_target_init(
239239
else
240240
{
241241
if(expr.id() == ID_address_of)
242-
init_expr = expr.op0();
242+
init_expr = to_address_of_expr(expr).object();
243243
else
244244
{
245245
init_expr = dereference_exprt(expr);

jbmc/src/java_bytecode/java_pointer_casts.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ Author: Daniel Kroening, [email protected]
2121
/// \return dereferenced pointer
2222
static exprt clean_deref(const exprt &ptr)
2323
{
24-
return ptr.id() == ID_address_of ? ptr.op0() : dereference_exprt{ptr};
24+
return ptr.id() == ID_address_of ? to_address_of_expr(ptr).object()
25+
: dereference_exprt{ptr};
2526
}
2627

2728
/// \par parameters: pointer
@@ -71,7 +72,7 @@ static const exprt &look_through_casts(const exprt &in)
7172
if(in.id()==ID_typecast)
7273
{
7374
assert(in.type().id()==ID_pointer);
74-
return look_through_casts(in.op0());
75+
return look_through_casts(to_typecast_expr(in).op());
7576
}
7677
else
7778
return in;
@@ -108,7 +109,7 @@ exprt make_clean_pointer_cast(
108109
bare_ptr.type().id()==ID_pointer &&
109110
"Non-pointer in make_clean_pointer_cast?");
110111
if(bare_ptr.type().subtype() == java_void_type())
111-
bare_ptr=bare_ptr.op0();
112+
bare_ptr = to_typecast_expr(bare_ptr).op();
112113
}
113114

114115
assert(

jbmc/src/java_bytecode/java_trace_validation.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ bool check_index_structure(const exprt &index_expr)
8585
return (can_cast_expr<index_exprt>(index_expr) ||
8686
can_cast_expr<byte_extract_exprt>(index_expr)) &&
8787
index_expr.operands().size() == 2 &&
88-
check_symbol_structure(index_expr.op0()) &&
89-
can_evaluate_to_constant(index_expr.op1());
88+
check_symbol_structure(to_binary_expr(index_expr).op0()) &&
89+
can_evaluate_to_constant(to_binary_expr(index_expr).op1());
9090
}
9191

9292
bool check_struct_structure(const struct_exprt &expr)

jbmc/src/java_bytecode/remove_instanceof.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ bool remove_instanceoft::lower_instanceof(
8383
expr.operands().size()==2,
8484
"java_instanceof should have two operands");
8585

86-
const exprt &check_ptr=expr.op0();
86+
const exprt &check_ptr = to_binary_expr(expr).op0();
8787
INVARIANT(
8888
check_ptr.type().id()==ID_pointer,
8989
"instanceof first operand should be a pointer");
9090

91-
const exprt &target_arg=expr.op1();
91+
const exprt &target_arg = to_binary_expr(expr).op1();
9292
INVARIANT(
9393
target_arg.id()==ID_type,
9494
"instanceof second operand should be a type");

jbmc/src/java_bytecode/remove_java_new.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
176176
struct_type.components()[1].type());
177177
dest.insert_before(
178178
next,
179-
goto_programt::make_assignment(code_assignt(length, rhs.op0()), location));
179+
goto_programt::make_assignment(
180+
code_assignt(length, to_multi_ary_expr(rhs).op0()), location));
180181

181182
// we also need to allocate space for the data
182183
member_exprt data(
@@ -205,7 +206,7 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
205206
// backend.
206207
const irept size_bound = rhs.find(ID_length_upper_bound);
207208
if(size_bound.is_nil())
208-
data_java_new_expr.set(ID_size, rhs.op0());
209+
data_java_new_expr.set(ID_size, to_multi_ary_expr(rhs).op0());
209210
else
210211
data_java_new_expr.set(ID_size, size_bound);
211212

@@ -276,8 +277,9 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
276277

277278
side_effect_exprt inc(ID_assign, typet(), location);
278279
inc.operands().resize(2);
279-
inc.op0() = tmp_i;
280-
inc.op1() = plus_exprt(tmp_i, from_integer(1, tmp_i.type()));
280+
to_binary_expr(inc).op0() = tmp_i;
281+
to_binary_expr(inc).op1() =
282+
plus_exprt(tmp_i, from_integer(1, tmp_i.type()));
281283

282284
dereference_exprt deref_expr(
283285
plus_exprt(data, tmp_i), data.type().subtype());
@@ -299,7 +301,7 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
299301

300302
const code_fort for_loop(
301303
code_assignt(tmp_i, from_integer(0, tmp_i.type())),
302-
binary_relation_exprt(tmp_i, ID_lt, rhs.op0()),
304+
binary_relation_exprt(tmp_i, ID_lt, to_multi_ary_expr(rhs).op0()),
303305
std::move(inc),
304306
std::move(for_body));
305307

0 commit comments

Comments
 (0)