Skip to content

Commit 035ae92

Browse files
committed
Restore array-set for nondet arrays
This was removed because the array is certain to be overwritten with nondets, and thus the zero-init was worthless-- however, for the special case of a zero-length array the init statement was the only assignment, making the difference between the interpreter assigning it value {} and assigning it no value at all. Ideally we should omit this most of the time, but its cost is probably minimal and it's much simpler to keep it than to track down all the special cases required to deal with a symbol that is referred to but never defined in the inputs map.
1 parent 827519d commit 035ae92

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/java_bytecode/java_object_factory.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,10 @@ void java_object_factoryt::gen_nondet_array_init(
549549

550550
side_effect_exprt java_new_array(ID_java_new_array, expr.type());
551551
java_new_array.copy_to_operands(length_sym_expr);
552-
java_new_array.set(ID_skip_initialize, true);
552+
// Retain the array_set instruction for the special case of a
553+
// zero-length array, where this will be the only assignment against
554+
// the array's identifier.
555+
java_new_array.set(ID_skip_initialize, false);
553556
java_new_array.type().subtype().set(ID_C_element_type, element_type);
554557
codet assign=code_assignt(expr, java_new_array);
555558
assign.add_source_location()=loc;
@@ -798,4 +801,3 @@ void gen_nondet_init(
798801
typet(),
799802
update_in_place);
800803
}
801-

0 commit comments

Comments
 (0)