@@ -142,6 +142,12 @@ class java_object_factoryt
142
142
const pointer_typet &substitute_pointer_type,
143
143
size_t depth);
144
144
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
+
145
151
void gen_method_call (
146
152
code_blockt &assignments,
147
153
const exprt &instance_expr,
@@ -1201,6 +1207,56 @@ void java_object_factoryt::gen_nondet_init(
1201
1207
}
1202
1208
}
1203
1209
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
+
1204
1260
// / Allocates a fresh array and emits an assignment writing to \p lhs the
1205
1261
// / address of the new array. Single-use at the moment, but useful to keep as a
1206
1262
// / separate function for downstream branches.
@@ -1220,45 +1276,18 @@ void java_object_factoryt::allocate_nondet_length_array(
1220
1276
const exprt &max_length_expr,
1221
1277
const typet &element_type)
1222
1278
{
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 (
1235
1280
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);
1255
1284
1256
1285
side_effect_exprt java_new_array (ID_java_new_array, lhs.type ());
1257
1286
java_new_array.copy_to_operands (length_sym_expr);
1258
1287
java_new_array.set (ID_length_upper_bound, max_length_expr);
1259
1288
java_new_array.type ().subtype ().set (ID_element_type, element_type);
1260
1289
code_assignt assign (lhs, java_new_array);
1261
- assign.add_source_location ()= loc;
1290
+ assign.add_source_location () = loc;
1262
1291
assignments.copy_to_operands (assign);
1263
1292
}
1264
1293
0 commit comments