Skip to content

Commit b65a0d4

Browse files
committed
Refactor logic for generating a nondet int
1 parent 3715049 commit b65a0d4

File tree

1 file changed

+61
-32
lines changed

1 file changed

+61
-32
lines changed

jbmc/src/java_bytecode/java_object_factory.cpp

Lines changed: 61 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ class java_object_factoryt
142142
const pointer_typet &substitute_pointer_type,
143143
size_t depth);
144144

145+
const symbol_exprt gen_nondet_int_init(
146+
code_blockt &assignments,
147+
const std::string &basename_prefix,
148+
const exprt &min_length_expr,
149+
const exprt &max_length_expr);
150+
145151
void gen_method_call(
146152
code_blockt &assignments,
147153
const exprt &instance_expr,
@@ -1201,6 +1207,56 @@ void java_object_factoryt::gen_nondet_init(
12011207
}
12021208
}
12031209

1210+
/// Nondeterministically initializes an int i in the range min <= i <= max,
1211+
/// where min is the integer represented by `min_value_expr` and max is the
1212+
/// integer represented by `max_value_expr`.
1213+
/// \param [out] assignments: A code block that the initializing assignments
1214+
/// will be appended to.
1215+
/// \param basename_prefix: Used for naming the newly created symbol.
1216+
/// \param min_value_expr: Represents the minimum value for the integer.
1217+
/// \param max_value_expr: Represents the maximum value for the integer.
1218+
/// \return A symbol expression for the resulting integer.
1219+
const symbol_exprt java_object_factoryt::gen_nondet_int_init(
1220+
code_blockt &assignments,
1221+
const std::string &basename_prefix,
1222+
const exprt &min_value_expr,
1223+
const exprt &max_value_expr)
1224+
{
1225+
// Allocate a new symbol for the int
1226+
const symbolt &int_symbol = get_fresh_aux_symbol(
1227+
java_int_type(),
1228+
id2string(object_factory_parameters.function_id),
1229+
basename_prefix,
1230+
loc,
1231+
ID_java,
1232+
symbol_table);
1233+
symbols_created.push_back(&int_symbol);
1234+
const auto &int_symbol_expr = int_symbol.symbol_expr();
1235+
1236+
// Nondet-initialize it
1237+
gen_nondet_init(
1238+
assignments,
1239+
int_symbol_expr,
1240+
false, // is_sub
1241+
irep_idt(),
1242+
false, // skip_classid
1243+
allocation_typet::LOCAL, // immaterial, type is primitive
1244+
false, // override
1245+
typet(), // override type is immaterial
1246+
0, // depth is immaterial, always non-null
1247+
update_in_placet::NO_UPDATE_IN_PLACE);
1248+
1249+
// Insert assumptions to bound its value
1250+
const auto min_assume_expr =
1251+
binary_relation_exprt(int_symbol_expr, ID_ge, min_value_expr);
1252+
const auto max_assume_expr =
1253+
binary_relation_exprt(int_symbol_expr, ID_le, max_value_expr);
1254+
assignments.add(code_assumet(min_assume_expr));
1255+
assignments.add(code_assumet(max_assume_expr));
1256+
1257+
return int_symbol_expr;
1258+
}
1259+
12041260
/// Allocates a fresh array and emits an assignment writing to \p lhs the
12051261
/// address of the new array. Single-use at the moment, but useful to keep as a
12061262
/// separate function for downstream branches.
@@ -1220,45 +1276,18 @@ void java_object_factoryt::allocate_nondet_length_array(
12201276
const exprt &max_length_expr,
12211277
const typet &element_type)
12221278
{
1223-
symbolt &length_sym = get_fresh_aux_symbol(
1224-
java_int_type(),
1225-
id2string(object_factory_parameters.function_id),
1226-
"nondet_array_length",
1227-
loc,
1228-
ID_java,
1229-
symbol_table);
1230-
symbols_created.push_back(&length_sym);
1231-
const auto &length_sym_expr=length_sym.symbol_expr();
1232-
1233-
// Initialize array with some undetermined length:
1234-
gen_nondet_init(
1279+
const auto &length_sym_expr = gen_nondet_int_init(
12351280
assignments,
1236-
length_sym_expr,
1237-
false, // is_sub
1238-
irep_idt(),
1239-
false, // skip_classid
1240-
allocation_typet::LOCAL, // immaterial, type is primitive
1241-
false, // override
1242-
typet(), // override type is immaterial
1243-
0, // depth is immaterial, always non-null
1244-
update_in_placet::NO_UPDATE_IN_PLACE);
1245-
1246-
// Insert assumptions to bound its length:
1247-
binary_relation_exprt
1248-
assume1(length_sym_expr, ID_ge, from_integer(0, java_int_type()));
1249-
binary_relation_exprt
1250-
assume2(length_sym_expr, ID_le, max_length_expr);
1251-
code_assumet assume_inst1(assume1);
1252-
code_assumet assume_inst2(assume2);
1253-
assignments.move_to_operands(assume_inst1);
1254-
assignments.move_to_operands(assume_inst2);
1281+
"nondet_array_length",
1282+
from_integer(0, java_int_type()),
1283+
max_length_expr);
12551284

12561285
side_effect_exprt java_new_array(ID_java_new_array, lhs.type());
12571286
java_new_array.copy_to_operands(length_sym_expr);
12581287
java_new_array.set(ID_length_upper_bound, max_length_expr);
12591288
java_new_array.type().subtype().set(ID_element_type, element_type);
12601289
code_assignt assign(lhs, java_new_array);
1261-
assign.add_source_location()=loc;
1290+
assign.add_source_location() = loc;
12621291
assignments.copy_to_operands(assign);
12631292
}
12641293

0 commit comments

Comments
 (0)