Skip to content

Commit e1288a5

Browse files
committed
Java object factory: take a message handler
1 parent 51da7e6 commit e1288a5

11 files changed

+89
-46
lines changed

jbmc/src/java_bytecode/convert_java_nondet.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ static goto_programt get_gen_nondet_init_instructions(
5757
skip_classid,
5858
lifetimet::DYNAMIC,
5959
object_factory_parameters,
60-
update_in_placet::NO_UPDATE_IN_PLACE);
60+
update_in_placet::NO_UPDATE_IN_PLACE,
61+
message_handler);
6162

6263
goto_programt instructions;
6364
goto_convert(

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,8 @@ bool java_bytecode_languaget::generate_support_functions(
869869
symbol_table,
870870
assume_inputs_non_null,
871871
object_factory_parameters,
872-
get_pointer_type_selector());
872+
get_pointer_type_selector(),
873+
get_message_handler());
873874
});
874875
}
875876

@@ -1068,22 +1069,25 @@ bool java_bytecode_languaget::convert_single_method(
10681069
symbol_table,
10691070
nondet_static,
10701071
object_factory_parameters,
1071-
get_pointer_type_selector());
1072+
get_pointer_type_selector(),
1073+
get_message_handler());
10721074
else
10731075
writable_symbol.value = get_clinit_wrapper_body(
10741076
function_id,
10751077
symbol_table,
10761078
nondet_static,
10771079
object_factory_parameters,
1078-
get_pointer_type_selector());
1080+
get_pointer_type_selector(),
1081+
get_message_handler());
10791082
break;
10801083
case synthetic_method_typet::STUB_CLASS_STATIC_INITIALIZER:
10811084
writable_symbol.value =
10821085
stub_global_initializer_factory.get_stub_initializer_body(
10831086
function_id,
10841087
symbol_table,
10851088
object_factory_parameters,
1086-
get_pointer_type_selector());
1089+
get_pointer_type_selector(),
1090+
get_message_handler());
10871091
break;
10881092
}
10891093
// Notify lazy methods of static calls made from the newly generated

jbmc/src/java_bytecode/java_entry_point.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ static void java_static_lifetime_init(
258258
lifetimet::STATIC_GLOBAL,
259259
parameters,
260260
pointer_type_selector,
261-
update_in_placet::NO_UPDATE_IN_PLACE);
261+
update_in_placet::NO_UPDATE_IN_PLACE,
262+
message_handler);
262263
}
263264
else if(sym.value.is_not_nil())
264265
{
@@ -296,7 +297,8 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
296297
symbol_table_baset &symbol_table,
297298
bool assume_init_pointers_not_null,
298299
java_object_factory_parameterst object_factory_parameters,
299-
const select_pointer_typet &pointer_type_selector)
300+
const select_pointer_typet &pointer_type_selector,
301+
message_handlert &message_handler)
300302
{
301303
const java_method_typet::parameterst &parameters =
302304
to_java_method_type(function.type).parameters();
@@ -354,7 +356,8 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
354356
factory_parameters,
355357
lifetimet::AUTOMATIC_LOCAL,
356358
function.location,
357-
pointer_type_selector);
359+
pointer_type_selector,
360+
message_handler);
358361
}
359362
else
360363
{
@@ -400,7 +403,8 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
400403
factory_parameters,
401404
lifetimet::DYNAMIC,
402405
function.location,
403-
pointer_type_selector);
406+
pointer_type_selector,
407+
message_handler);
404408
init_code_for_type.add(
405409
code_assignt(
406410
result_symbol.symbol_expr(),

jbmc/src/java_bytecode/java_entry_point.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ bool generate_java_start_function(
169169
/// \param pointer_type_selector: Means of selecting the type of value
170170
/// constructed for reference types which are initialised by the code
171171
/// returned.
172+
/// \param message_handler: log
172173
/// \returns A pairing of the code to initialise the arguments and a std::vector
173174
/// of the expressions for these arguments. The vector contains one element
174175
/// per parameter of \p function. The vector of expressions can be used as
@@ -182,6 +183,7 @@ std::pair<code_blockt, std::vector<exprt>> java_build_arguments(
182183
symbol_table_baset &symbol_table,
183184
bool assume_init_pointers_not_null,
184185
java_object_factory_parameterst object_factory_parameters,
185-
const select_pointer_typet &pointer_type_selector);
186+
const select_pointer_typet &pointer_type_selector,
187+
message_handlert &message_handler);
186188

187189
#endif // CPROVER_JAVA_BYTECODE_JAVA_ENTRY_POINT_H

jbmc/src/java_bytecode/java_object_factory.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ class java_object_factoryt
5959

6060
allocate_objectst allocate_objects;
6161

62+
/// Log for reporting warnings and errors in object creation
63+
messaget log;
64+
6265
code_assignt get_null_assignment(
6366
const exprt &expr,
6467
const pointer_typet &ptr_type);
@@ -84,7 +87,8 @@ class java_object_factoryt
8487
const source_locationt &loc,
8588
const java_object_factory_parameterst _object_factory_parameters,
8689
symbol_table_baset &_symbol_table,
87-
const select_pointer_typet &pointer_type_selector)
90+
const select_pointer_typet &pointer_type_selector,
91+
message_handlert &log)
8892
: loc(loc),
8993
object_factory_parameters(_object_factory_parameters),
9094
symbol_table(_symbol_table),
@@ -94,7 +98,8 @@ class java_object_factoryt
9498
ID_java,
9599
loc,
96100
object_factory_parameters.function_id,
97-
symbol_table)
101+
symbol_table),
102+
log(log)
98103
{}
99104

100105
void gen_nondet_array_init(
@@ -1517,7 +1522,8 @@ exprt object_factory(
15171522
java_object_factory_parameterst parameters,
15181523
lifetimet lifetime,
15191524
const source_locationt &loc,
1520-
const select_pointer_typet &pointer_type_selector)
1525+
const select_pointer_typet &pointer_type_selector,
1526+
message_handlert &log)
15211527
{
15221528
irep_idt identifier=id2string(goto_functionst::entry_point())+
15231529
"::"+id2string(base_name);
@@ -1538,10 +1544,7 @@ exprt object_factory(
15381544
CHECK_RETURN(!moving_symbol_failed);
15391545

15401546
java_object_factoryt state(
1541-
loc,
1542-
parameters,
1543-
symbol_table,
1544-
pointer_type_selector);
1547+
loc, parameters, symbol_table, pointer_type_selector, log);
15451548
code_blockt assignments;
15461549
state.gen_nondet_init(
15471550
assignments,
@@ -1594,6 +1597,7 @@ exprt object_factory(
15941597
/// MAY_UPDATE_IN_PLACE: generate a runtime nondet branch between the NO_
15951598
/// and MUST_ cases.
15961599
/// MUST_UPDATE_IN_PLACE: reinitialize an existing object
1600+
/// \param log: used to report object construction warnings and failures
15971601
/// \return `init_code` gets an instruction sequence to initialize or
15981602
/// reinitialize `expr` and child objects it refers to. `symbol_table` is
15991603
/// modified with any new symbols created. This includes any necessary
@@ -1607,13 +1611,11 @@ void gen_nondet_init(
16071611
lifetimet lifetime,
16081612
const java_object_factory_parameterst &object_factory_parameters,
16091613
const select_pointer_typet &pointer_type_selector,
1610-
update_in_placet update_in_place)
1614+
update_in_placet update_in_place,
1615+
message_handlert &log)
16111616
{
16121617
java_object_factoryt state(
1613-
loc,
1614-
object_factory_parameters,
1615-
symbol_table,
1616-
pointer_type_selector);
1618+
loc, object_factory_parameters, symbol_table, pointer_type_selector, log);
16171619
code_blockt assignments;
16181620
state.gen_nondet_init(
16191621
assignments,
@@ -1641,7 +1643,8 @@ exprt object_factory(
16411643
symbol_tablet &symbol_table,
16421644
const java_object_factory_parameterst &object_factory_parameters,
16431645
lifetimet lifetime,
1644-
const source_locationt &location)
1646+
const source_locationt &location,
1647+
message_handlert &log)
16451648
{
16461649
select_pointer_typet pointer_type_selector;
16471650
return object_factory(
@@ -1652,7 +1655,8 @@ exprt object_factory(
16521655
object_factory_parameters,
16531656
lifetime,
16541657
location,
1655-
pointer_type_selector);
1658+
pointer_type_selector,
1659+
log);
16561660
}
16571661

16581662
/// Call gen_nondet_init() above with a default (identity) pointer_type_selector
@@ -1664,7 +1668,8 @@ void gen_nondet_init(
16641668
bool skip_classid,
16651669
lifetimet lifetime,
16661670
const java_object_factory_parameterst &object_factory_parameters,
1667-
update_in_placet update_in_place)
1671+
update_in_placet update_in_place,
1672+
message_handlert &log)
16681673
{
16691674
select_pointer_typet pointer_type_selector;
16701675
gen_nondet_init(
@@ -1676,7 +1681,8 @@ void gen_nondet_init(
16761681
lifetime,
16771682
object_factory_parameters,
16781683
pointer_type_selector,
1679-
update_in_place);
1684+
update_in_place,
1685+
log);
16801686
}
16811687

16821688
/// Adds a call for the given method to the end of `assignments` if the method

jbmc/src/java_bytecode/java_object_factory.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ exprt object_factory(
8787
java_object_factory_parameterst parameters,
8888
lifetimet lifetime,
8989
const source_locationt &location,
90-
const select_pointer_typet &pointer_type_selector);
90+
const select_pointer_typet &pointer_type_selector,
91+
message_handlert &log);
9192

9293
exprt object_factory(
9394
const typet &type,
@@ -96,7 +97,8 @@ exprt object_factory(
9697
symbol_tablet &symbol_table,
9798
const java_object_factory_parameterst &object_factory_parameters,
9899
lifetimet lifetime,
99-
const source_locationt &location);
100+
const source_locationt &location,
101+
message_handlert &log);
100102

101103
enum class update_in_placet
102104
{
@@ -114,7 +116,8 @@ void gen_nondet_init(
114116
lifetimet lifetime,
115117
const java_object_factory_parameterst &object_factory_parameters,
116118
const select_pointer_typet &pointer_type_selector,
117-
update_in_placet update_in_place);
119+
update_in_placet update_in_place,
120+
message_handlert &log);
118121

119122
void gen_nondet_init(
120123
const exprt &expr,
@@ -124,6 +127,7 @@ void gen_nondet_init(
124127
bool skip_classid,
125128
lifetimet lifetime,
126129
const java_object_factory_parameterst &object_factory_parameters,
127-
update_in_placet update_in_place);
130+
update_in_placet update_in_place,
131+
message_handlert &log);
128132

129133
#endif // CPROVER_JAVA_BYTECODE_JAVA_OBJECT_FACTORY_H

jbmc/src/java_bytecode/java_static_initializers.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,15 @@ gen_clinit_eqexpr(const exprt &expr, const clinit_statest state)
195195
/// if nondet-static is true)
196196
/// \param pointer_type_selector: used to choose concrete types for abstract-
197197
/// typed globals and fields (only needed if nondet-static is true)
198+
/// \param message_handler: log
198199
static void clinit_wrapper_do_recursive_calls(
199200
symbol_table_baset &symbol_table,
200201
const irep_idt &class_name,
201202
code_blockt &init_body,
202203
const bool nondet_static,
203204
const java_object_factory_parameterst &object_factory_parameters,
204-
const select_pointer_typet &pointer_type_selector)
205+
const select_pointer_typet &pointer_type_selector,
206+
message_handlert &message_handler)
205207
{
206208
const symbolt &class_symbol = symbol_table.lookup_ref(class_name);
207209
for(const auto &base : to_class_type(class_symbol.type).bases())
@@ -265,7 +267,8 @@ static void clinit_wrapper_do_recursive_calls(
265267
lifetimet::DYNAMIC,
266268
parameters,
267269
pointer_type_selector,
268-
update_in_placet::NO_UPDATE_IN_PLACE);
270+
update_in_placet::NO_UPDATE_IN_PLACE,
271+
message_handler);
269272
}
270273
}
271274
}
@@ -447,13 +450,15 @@ static void create_clinit_wrapper_symbols(
447450
/// if nondet-static is true)
448451
/// \param pointer_type_selector: used to choose concrete types for abstract-
449452
/// typed globals and fields (only needed if nondet-static is true)
453+
/// \param message_handler: log output
450454
/// \return the body of the static initializer wrapper
451455
code_blockt get_thread_safe_clinit_wrapper_body(
452456
const irep_idt &function_id,
453457
symbol_table_baset &symbol_table,
454458
const bool nondet_static,
455459
const java_object_factory_parameterst &object_factory_parameters,
456-
const select_pointer_typet &pointer_type_selector)
460+
const select_pointer_typet &pointer_type_selector,
461+
message_handlert &message_handler)
457462
{
458463
const symbolt &wrapper_method_symbol = symbol_table.lookup_ref(function_id);
459464
irep_idt class_name = wrapper_method_symbol.type.get(ID_C_class);
@@ -605,7 +610,8 @@ code_blockt get_thread_safe_clinit_wrapper_body(
605610
init_body,
606611
nondet_static,
607612
object_factory_parameters,
608-
pointer_type_selector);
613+
pointer_type_selector,
614+
message_handler);
609615
function_body.append(init_body);
610616
}
611617

@@ -637,13 +643,15 @@ code_blockt get_thread_safe_clinit_wrapper_body(
637643
/// if nondet-static is true)
638644
/// \param pointer_type_selector: used to choose concrete types for abstract-
639645
/// typed globals and fields (only needed if nondet-static is true)
646+
/// \param message_handler: log output
640647
/// \return the body of the static initializer wrapper
641648
code_ifthenelset get_clinit_wrapper_body(
642649
const irep_idt &function_id,
643650
symbol_table_baset &symbol_table,
644651
const bool nondet_static,
645652
const java_object_factory_parameterst &object_factory_parameters,
646-
const select_pointer_typet &pointer_type_selector)
653+
const select_pointer_typet &pointer_type_selector,
654+
message_handlert &message_handler)
647655
{
648656
// Assume that class C extends class C' and implements interfaces
649657
// I1, ..., In. We now create the following function (possibly recursively
@@ -687,7 +695,8 @@ code_ifthenelset get_clinit_wrapper_body(
687695
init_body,
688696
nondet_static,
689697
object_factory_parameters,
690-
pointer_type_selector);
698+
pointer_type_selector,
699+
message_handler);
691700

692701
// the entire body of the function is an if-then-else
693702
return code_ifthenelset(std::move(check_already_run), std::move(init_body));
@@ -828,12 +837,14 @@ void stub_global_initializer_factoryt::create_stub_global_initializer_symbols(
828837
/// the stub globals and objects reachable from them
829838
/// \param pointer_type_selector: used to choose concrete types for abstract-
830839
/// typed globals and fields.
840+
/// \param message_handler: log output
831841
/// \return synthetic static initializer body.
832842
code_blockt stub_global_initializer_factoryt::get_stub_initializer_body(
833843
const irep_idt &function_id,
834844
symbol_table_baset &symbol_table,
835845
const java_object_factory_parameterst &object_factory_parameters,
836-
const select_pointer_typet &pointer_type_selector)
846+
const select_pointer_typet &pointer_type_selector,
847+
message_handlert &message_handler)
837848
{
838849
const symbolt &stub_initializer_symbol = symbol_table.lookup_ref(function_id);
839850
irep_idt class_id = stub_initializer_symbol.type.get(ID_C_class);
@@ -875,7 +886,8 @@ code_blockt stub_global_initializer_factoryt::get_stub_initializer_body(
875886
lifetimet::DYNAMIC,
876887
parameters,
877888
pointer_type_selector,
878-
update_in_placet::NO_UPDATE_IN_PLACE);
889+
update_in_placet::NO_UPDATE_IN_PLACE,
890+
message_handler);
879891
}
880892

881893
return static_init_body;

0 commit comments

Comments
 (0)