Skip to content

Commit 50660db

Browse files
Specify source location for nondet expressions
1 parent fd4f563 commit 50660db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+169
-158
lines changed

jbmc/src/java_bytecode/java_bytecode_concurrency_instrumentation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ static void instrument_synchronized_code(
253253
catch_block.add(monitorexit);
254254

255255
// Re-throw exception
256-
side_effect_expr_throwt throw_expr;
256+
side_effect_expr_throwt throw_expr(irept(), typet(), code.source_location());
257257
throw_expr.copy_to_operands(catch_var);
258258
catch_block.add(code_expressiont(throw_expr));
259259

jbmc/src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -813,8 +813,7 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
813813
clone_body.move_to_operands(declare_cloned);
814814

815815
side_effect_exprt java_new_array(
816-
ID_java_new_array,
817-
java_reference_type(symbol_type));
816+
ID_java_new_array, java_reference_type(symbol_type), source_locationt());
818817
dereference_exprt old_array(this_symbol.symbol_expr(), symbol_type);
819818
dereference_exprt new_array(local_symexpr, symbol_type);
820819
member_exprt old_length(
@@ -860,7 +859,7 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
860859
copy_loop.cond()=
861860
binary_relation_exprt(index_symexpr, ID_lt, old_length);
862861

863-
side_effect_exprt inc(ID_assign);
862+
side_effect_exprt inc(ID_assign, typet(), source_locationt());
864863
inc.operands().resize(2);
865864
inc.op0()=index_symexpr;
866865
inc.op1()=plus_exprt(index_symexpr, from_integer(1, index_symexpr.type()));

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,8 +2328,7 @@ void java_bytecode_convert_methodt::convert_athrow(
23282328
}
23292329
else
23302330
{
2331-
side_effect_expr_throwt throw_expr;
2332-
throw_expr.add_source_location() = location;
2331+
side_effect_expr_throwt throw_expr(irept(), typet(), location);
23332332
throw_expr.copy_to_operands(op[0]);
23342333
c = code_expressiont(throw_expr);
23352334
}
@@ -2454,14 +2453,11 @@ void java_bytecode_convert_methodt::convert_multianewarray(
24542453
codet &c,
24552454
exprt::operandst &results)
24562455
{
2456+
PRECONDITION(!location.get_line().empty());
24572457
const reference_typet ref_type = java_reference_type(arg0.type());
2458-
2459-
side_effect_exprt java_new_array(ID_java_new_array, ref_type);
2458+
side_effect_exprt java_new_array(ID_java_new_array, ref_type, location);
24602459
java_new_array.operands() = op;
24612460

2462-
if(!location.get_line().empty())
2463-
java_new_array.add_source_location() = location;
2464-
24652461
code_blockt create;
24662462

24672463
if(max_array_length != 0)
@@ -2516,12 +2512,9 @@ void java_bytecode_convert_methodt::convert_newarray(
25162512

25172513
const reference_typet ref_type = java_array_type(element_type);
25182514

2519-
side_effect_exprt java_new_array(ID_java_new_array, ref_type);
2515+
side_effect_exprt java_new_array(ID_java_new_array, ref_type, location);
25202516
java_new_array.copy_to_operands(op[0]);
25212517

2522-
if(!location.get_line().empty())
2523-
java_new_array.add_source_location() = location;
2524-
25252518
c = code_blockt();
25262519

25272520
if(max_array_length != 0)
@@ -2543,7 +2536,7 @@ void java_bytecode_convert_methodt::convert_new(
25432536
exprt::operandst &results)
25442537
{
25452538
const reference_typet ref_type = java_reference_type(arg0.type());
2546-
side_effect_exprt java_new_expr(ID_java_new, ref_type);
2539+
side_effect_exprt java_new_expr(ID_java_new, ref_type, location);
25472540

25482541
if(!location.get_line().empty())
25492542
java_new_expr.add_source_location() = location;

jbmc/src/java_bytecode/java_bytecode_instrument.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ codet java_bytecode_instrumentt::throw_exception(
122122
ID_java,
123123
symbol_table);
124124

125-
side_effect_exprt new_instance(ID_java_new, exc_ptr_type);
125+
side_effect_exprt new_instance(ID_java_new, exc_ptr_type, original_loc);
126126
code_assignt assign_new(new_symbol.symbol_expr(), new_instance);
127127

128-
side_effect_expr_throwt throw_expr;
128+
side_effect_expr_throwt throw_expr(irept(), typet(), original_loc);
129129
throw_expr.copy_to_operands(new_symbol.symbol_expr());
130130

131131
code_blockt throw_code;

jbmc/src/java_bytecode/java_bytecode_typecheck_expr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,6 @@ void java_bytecode_typecheckt::typecheck_expr_member(member_exprt &expr)
160160
<< component_name << "` in class hierarchy" << eom;
161161

162162
// We replace by a non-det of same type
163-
side_effect_expr_nondett nondet(expr.type());
163+
side_effect_expr_nondett nondet(expr.type(), expr.source_location());
164164
expr.swap(nondet);
165165
}

jbmc/src/java_bytecode/java_entry_point.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static void java_static_lifetime_init(
162162
// Call the literal initializer method instead of a nondet initializer:
163163

164164
// For arguments we can't parse yet:
165-
side_effect_expr_nondett nondet_bool(java_boolean_type());
165+
side_effect_expr_nondett nondet_bool(java_boolean_type(), sym.location);
166166

167167
// Argument order is: name, isAnnotation, isArray, isInterface,
168168
// isSynthetic, isLocalClass, isMemberClass, isEnum

jbmc/src/java_bytecode/java_object_factory.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ exprt allocate_dynamic_object(
173173
{
174174
INVARIANT(!object_size.is_nil(), "Size of Java objects should be known");
175175
// malloc expression
176-
side_effect_exprt malloc_expr(ID_allocate, pointer_type(allocate_type));
176+
side_effect_exprt malloc_expr(
177+
ID_allocate, pointer_type(allocate_type), loc);
177178
malloc_expr.copy_to_operands(object_size);
178179
malloc_expr.copy_to_operands(false_exprt());
179180
// create a symbol for the malloc expression so we can initialize
@@ -503,7 +504,7 @@ static mp_integer max_value(const typet &type)
503504
/// \return code allocation object and assigning `lhs`
504505
static codet make_allocate_code(const symbol_exprt &lhs, const exprt &size)
505506
{
506-
side_effect_exprt alloc(ID_allocate, lhs.type());
507+
side_effect_exprt alloc(ID_allocate, lhs.type(), lhs.source_location());
507508
alloc.copy_to_operands(size);
508509
alloc.copy_to_operands(false_exprt());
509510
return code_assignt(lhs, alloc);
@@ -599,7 +600,7 @@ bool initialize_nondet_string_fields(
599600
ID_java,
600601
symbol_table);
601602
const symbol_exprt length_expr = length_sym.symbol_expr();
602-
const side_effect_expr_nondett nondet_length(length_expr.type());
603+
const side_effect_expr_nondett nondet_length(length_expr.type(), loc);
603604
code.add(code_declt(length_expr));
604605
code.add(code_assignt(length_expr, nondet_length));
605606

@@ -828,7 +829,8 @@ void java_object_factoryt::gen_nondet_pointer_init(
828829
// tmp$<temporary_counter>>
829830
// }
830831
code_ifthenelset null_check;
831-
null_check.cond()=side_effect_expr_nondett(bool_typet());
832+
null_check.cond() =
833+
side_effect_expr_nondett(bool_typet(), expr.source_location());
832834
null_check.then_case()=set_null_inst;
833835
null_check.else_case()=non_null_inst;
834836

@@ -847,7 +849,8 @@ void java_object_factoryt::gen_nondet_pointer_init(
847849
"No-update and must-update should have already been resolved");
848850

849851
code_ifthenelset update_check;
850-
update_check.cond()=side_effect_expr_nondett(bool_typet());
852+
update_check.cond() =
853+
side_effect_expr_nondett(bool_typet(), expr.source_location());
851854
update_check.then_case()=update_in_place_assignments;
852855
update_check.else_case()=new_object_assignments;
853856

@@ -1182,9 +1185,8 @@ void java_object_factoryt::gen_nondet_init(
11821185
{
11831186
// types different from pointer or structure:
11841187
// bool, int, float, byte, char, ...
1185-
exprt rhs=type.id()==ID_c_bool?
1186-
get_nondet_bool(type):
1187-
side_effect_expr_nondett(type);
1188+
exprt rhs = type.id() == ID_c_bool ? get_nondet_bool(type)
1189+
: side_effect_expr_nondett(type, loc);
11881190
code_assignt assign(expr, rhs);
11891191
assign.add_source_location()=loc;
11901192

@@ -1244,7 +1246,7 @@ void java_object_factoryt::allocate_nondet_length_array(
12441246
assignments.move_to_operands(assume_inst1);
12451247
assignments.move_to_operands(assume_inst2);
12461248

1247-
side_effect_exprt java_new_array(ID_java_new_array, lhs.type());
1249+
side_effect_exprt java_new_array(ID_java_new_array, lhs.type(), loc);
12481250
java_new_array.copy_to_operands(length_sym_expr);
12491251
java_new_array.set(ID_length_upper_bound, max_length_expr);
12501252
java_new_array.type().subtype().set(ID_element_type, element_type);

jbmc/src/java_bytecode/java_static_initializers.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,11 +788,13 @@ codet stub_global_initializer_factoryt::get_stub_initializer_body(
788788
? object_factory_parameters.max_nonnull_tree_depth + 1
789789
: object_factory_parameters.max_nonnull_tree_depth;
790790

791+
source_locationt location;
792+
location.set_function(function_id);
791793
gen_nondet_init(
792794
new_global_symbol,
793795
static_init_body,
794796
symbol_table,
795-
source_locationt(),
797+
location,
796798
false,
797799
allocation_typet::DYNAMIC,
798800
parameters,

jbmc/src/java_bytecode/java_string_library_preprocess.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ refined_string_exprt java_string_library_preprocesst::make_nondet_string_expr(
547547
/// \todo refactor with initialize_nonddet_string_struct
548548
const refined_string_exprt str = decl_string_expr(loc, symbol_table, code);
549549

550-
side_effect_expr_nondett nondet_length(str.length().type());
550+
const side_effect_expr_nondett nondet_length(str.length().type(), loc);
551551
code.add(code_assignt(str.length(), nondet_length), loc);
552552

553553
exprt nondet_array_expr =
@@ -667,7 +667,7 @@ exprt make_nondet_infinite_char_array(
667667
symbol_table);
668668
const symbol_exprt data_expr = data_sym.symbol_expr();
669669
code.add(code_declt(data_expr), loc);
670-
side_effect_expr_nondett nondet_data(data_expr.type());
670+
const side_effect_expr_nondett nondet_data(data_expr.type(), loc);
671671
code.add(code_assignt(data_expr, nondet_data), loc);
672672
return data_expr;
673673
}

jbmc/src/java_bytecode/remove_java_new.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ goto_programt::targett remove_java_newt::lower_java_new(
8484
CHECK_RETURN(object_size.is_not_nil());
8585

8686
// we produce a malloc side-effect, which stays
87-
side_effect_exprt malloc_expr(ID_allocate, rhs.type());
87+
side_effect_exprt malloc_expr(ID_allocate, rhs.type(), location);
8888
malloc_expr.copy_to_operands(object_size);
8989
// could use true and get rid of the code below
9090
malloc_expr.copy_to_operands(false_exprt());
@@ -135,7 +135,7 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
135135
CHECK_RETURN(!object_size.is_nil());
136136

137137
// we produce a malloc side-effect, which stays
138-
side_effect_exprt malloc_expr(ID_allocate, rhs.type());
138+
side_effect_exprt malloc_expr(ID_allocate, rhs.type(), location);
139139
malloc_expr.copy_to_operands(object_size);
140140
// code use true and get rid of the code below
141141
malloc_expr.copy_to_operands(false_exprt());
@@ -188,7 +188,7 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
188188
allocate_data_type = data.type();
189189

190190
side_effect_exprt data_java_new_expr(
191-
ID_java_new_array_data, allocate_data_type);
191+
ID_java_new_array_data, allocate_data_type, location);
192192

193193
// The instruction may specify a (hopefully small) upper bound on the
194194
// array size, in which case we allocate a fixed-length array that may
@@ -276,7 +276,7 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
276276
CHECK_RETURN(sub_type.id() == ID_pointer);
277277
sub_java_new.type() = sub_type;
278278

279-
side_effect_exprt inc(ID_assign);
279+
side_effect_exprt inc(ID_assign, typet(), location);
280280
inc.operands().resize(2);
281281
inc.op0() = tmp_i;
282282
inc.op1() = plus_exprt(tmp_i, from_integer(1, tmp_i.type()));

jbmc/src/java_bytecode/replace_java_nondet.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,8 @@ static goto_programt::targett check_and_replace_target(
279279
const auto &nondet_var =
280280
to_code_return(target_instruction->code).return_value();
281281

282-
side_effect_expr_nondett inserted_expr(nondet_var.type());
282+
side_effect_expr_nondett inserted_expr(
283+
nondet_var.type(), target_instruction->source_location);
283284
inserted_expr.set_nullable(
284285
instr_info.get_nullable_type() ==
285286
nondet_instruction_infot::is_nullablet::TRUE);
@@ -292,7 +293,8 @@ static goto_programt::targett check_and_replace_target(
292293
// Assume that the LHS of *this* assignment is the actual nondet variable
293294
const auto &nondet_var = to_code_assign(target_instruction->code).lhs();
294295

295-
side_effect_expr_nondett inserted_expr(nondet_var.type());
296+
side_effect_expr_nondett inserted_expr(
297+
nondet_var.type(), target_instruction->source_location);
296298
inserted_expr.set_nullable(
297299
instr_info.get_nullable_type() ==
298300
nondet_instruction_infot::is_nullablet::TRUE);

src/analyses/flow_insensitive_analysis.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,8 @@ bool flow_insensitive_analysis_baset::do_function_call(
210210

211211
goto_programt temp;
212212

213-
exprt rhs=side_effect_expr_nondett(code.lhs().type());
213+
exprt rhs =
214+
side_effect_expr_nondett(code.lhs().type(), l_call->source_location);
214215

215216
goto_programt::targett r=temp.add_instruction();
216217
r->make_return();

src/analyses/goto_check.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1703,7 +1703,7 @@ void goto_checkt::goto_check(
17031703
if(!base_type_eq(lhs.type(), address_of_expr.type(), ns))
17041704
address_of_expr.make_typecast(lhs.type());
17051705
const if_exprt rhs(
1706-
side_effect_expr_nondett(bool_typet()),
1706+
side_effect_expr_nondett(bool_typet(), i.source_location),
17071707
address_of_expr,
17081708
lhs,
17091709
lhs.type());

src/ansi-c/c_nondet_symbol_factory.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ static const symbolt &c_new_tmp_symbol(
4343
}
4444

4545
/// \param type: Desired type (C_bool or plain bool)
46+
/// \param loc: source location
4647
/// \return nondet expr of that type
47-
static exprt c_get_nondet_bool(const typet &type)
48+
static exprt c_get_nondet_bool(const typet &type, const source_locationt &loc)
4849
{
4950
// We force this to 0 and 1 and won't consider other values
50-
return typecast_exprt(side_effect_expr_nondett(bool_typet()), type);
51+
return typecast_exprt(side_effect_expr_nondett(bool_typet(), loc), type);
5152
}
5253

5354
class symbol_factoryt
@@ -173,7 +174,7 @@ void symbol_factoryt::gen_nondet_init(
173174
set_null_inst.add_source_location()=loc;
174175

175176
code_ifthenelset null_check;
176-
null_check.cond()=side_effect_expr_nondett(bool_typet());
177+
null_check.cond() = side_effect_expr_nondett(bool_typet(), loc);
177178
null_check.then_case()=set_null_inst;
178179
null_check.else_case()=non_null_inst;
179180

@@ -187,9 +188,8 @@ void symbol_factoryt::gen_nondet_init(
187188
// <expr> = NONDET(_BOOL);
188189
// Else add the following code to assignments:
189190
// <expr> = NONDET(type);
190-
exprt rhs=type.id()==ID_c_bool?
191-
c_get_nondet_bool(type):
192-
side_effect_expr_nondett(type);
191+
exprt rhs = type.id() == ID_c_bool ? c_get_nondet_bool(type, loc)
192+
: side_effect_expr_nondett(type, loc);
193193
code_assignt assign(expr, rhs);
194194
assign.add_source_location()=loc;
195195

src/ansi-c/c_typecheck_code.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,8 @@ void c_typecheck_baset::typecheck_return(codet &code)
675675
warning().source_location = code.source_location();
676676
warning() << "non-void function should return a value" << eom;
677677

678-
code.copy_to_operands(side_effect_expr_nondett(return_type));
678+
code.copy_to_operands(
679+
side_effect_expr_nondett(return_type, code.source_location()));
679680
}
680681
}
681682
else if(code.operands().size()==1)

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,7 @@ void c_typecheck_baset::typecheck_expr_builtin_va_arg(exprt &expr)
466466

467467
// turn into function call
468468
side_effect_expr_function_callt result(
469-
function, {arg}, new_type.return_type());
470-
471-
result.add_source_location()=expr.source_location();
469+
function, {arg}, new_type.return_type(), expr.source_location());
472470

473471
expr.swap(result);
474472

@@ -884,8 +882,7 @@ void c_typecheck_baset::typecheck_side_effect_statement_expression(
884882
static_cast<const typet &>(fc.function().type().find(ID_return_type));
885883

886884
side_effect_expr_function_callt sideeffect(
887-
fc.function(), fc.arguments(), return_type);
888-
sideeffect.add_source_location()=fc.source_location();
885+
fc.function(), fc.arguments(), return_type, fc.source_location());
889886

890887
expr.type()=sideeffect.type();
891888

@@ -897,8 +894,8 @@ void c_typecheck_baset::typecheck_side_effect_statement_expression(
897894
}
898895
else
899896
{
900-
side_effect_exprt assign(ID_assign, sideeffect.type());
901-
assign.add_source_location()=fc.source_location();
897+
side_effect_exprt assign(
898+
ID_assign, sideeffect.type(), fc.source_location());
902899
assign.move_to_operands(fc.lhs(), sideeffect);
903900

904901
code_expressiont code_expr(assign);
@@ -965,7 +962,8 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr)
965962
// The type may contain side-effects.
966963
if(!clean_code.empty())
967964
{
968-
side_effect_exprt side_effect_expr(ID_statement_expression, void_type());
965+
side_effect_exprt side_effect_expr(
966+
ID_statement_expression, void_type(), expr.source_location());
969967
code_blockt decl_block(clean_code);
970968
decl_block.set_statement(ID_decl_block);
971969
side_effect_expr.copy_to_operands(decl_block);
@@ -1021,7 +1019,8 @@ void c_typecheck_baset::typecheck_expr_typecast(exprt &expr)
10211019
// The type may contain side-effects.
10221020
if(!clean_code.empty())
10231021
{
1024-
side_effect_exprt side_effect_expr(ID_statement_expression, void_type());
1022+
side_effect_exprt side_effect_expr(
1023+
ID_statement_expression, void_type(), expr.source_location());
10251024
code_blockt decl_block(clean_code);
10261025
decl_block.set_statement(ID_decl_block);
10271026
side_effect_expr.copy_to_operands(decl_block);
@@ -2327,8 +2326,7 @@ exprt c_typecheck_baset::do_special_functions(
23272326
throw 0;
23282327
}
23292328

2330-
side_effect_exprt malloc_expr(ID_allocate, expr.type());
2331-
malloc_expr.add_source_location()=source_location;
2329+
side_effect_exprt malloc_expr(ID_allocate, expr.type(), source_location);
23322330
malloc_expr.operands()=expr.arguments();
23332331

23342332
return malloc_expr;

0 commit comments

Comments
 (0)