Skip to content

Commit 96c9e65

Browse files
author
Daniel Kroening
authored
Merge pull request #686 from smowton/fix_multinewarray
Fix multinewarray
2 parents 727aea1 + 0a53fbb commit 96c9e65

File tree

4 files changed

+22
-6
lines changed

4 files changed

+22
-6
lines changed
Binary file not shown.

regression/cbmc-java/multinewarray/multinewarray.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public static void main(String[] args)
1212
assert some_a[0].length==3;
1313
assert some_a[0][0].length==2;
1414

15-
int x=10;
16-
int y=20;
15+
int x=3;
16+
int y=5;
1717
int[][] int_array = new int[x][y];
1818

1919
for(int i=0; i<x; ++i)

regression/cbmc-java/multinewarray/test.desc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
multinewarray.class
33

44
^EXIT=0$

src/goto-programs/builtin_functions.cpp

+19-3
Original file line numberDiff line numberDiff line change
@@ -851,13 +851,19 @@ void goto_convertt::do_java_new_array(
851851
goto_programt tmp;
852852

853853
symbol_exprt tmp_i=
854-
new_tmp_symbol(index_type(), "index", tmp, location).symbol_expr();
854+
new_tmp_symbol(length.type(), "index", tmp, location).symbol_expr();
855855

856856
code_fort for_loop;
857857

858858
side_effect_exprt sub_java_new=rhs;
859859
sub_java_new.operands().erase(sub_java_new.operands().begin());
860860

861+
assert(rhs.type().id()==ID_pointer);
862+
typet sub_type=
863+
static_cast<const typet &>(rhs.type().subtype().find("#element_type"));
864+
assert(sub_type.id()==ID_pointer);
865+
sub_java_new.type()=sub_type;
866+
861867
side_effect_exprt inc(ID_assign);
862868
inc.operands().resize(2);
863869
inc.op0()=tmp_i;
@@ -866,11 +872,21 @@ void goto_convertt::do_java_new_array(
866872
dereference_exprt deref_expr(
867873
plus_exprt(data, tmp_i), data.type().subtype());
868874

875+
code_blockt for_body;
876+
symbol_exprt init_sym=
877+
new_tmp_symbol(sub_type, "subarray_init", tmp, location).symbol_expr();
878+
879+
code_assignt init_subarray(init_sym, sub_java_new);
880+
code_assignt assign_subarray(
881+
deref_expr,
882+
typecast_exprt(init_sym, deref_expr.type()));
883+
for_body.move_to_operands(init_subarray);
884+
for_body.move_to_operands(assign_subarray);
885+
869886
for_loop.init()=code_assignt(tmp_i, from_integer(0, tmp_i.type()));
870887
for_loop.cond()=binary_relation_exprt(tmp_i, ID_lt, rhs.op0());
871888
for_loop.iter()=inc;
872-
for_loop.body()=code_skipt();
873-
for_loop.body()=code_assignt(deref_expr, sub_java_new);
889+
for_loop.body()=for_body;
874890

875891
convert(for_loop, tmp);
876892
dest.destructive_append(tmp);

0 commit comments

Comments
 (0)