Skip to content

Commit 2ef91e7

Browse files
Make mode an argument of goto-convert functions
Fixes: diffblue#2138 This passes the mode as an argument of these functions instead of trying to deduce it from the expression. This avoids creating symbols with empty mode which can lead to problems in later stages of the analysis.
1 parent 392c765 commit 2ef91e7

14 files changed

+463
-303
lines changed

src/goto-instrument/model_argc_argv.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ bool model_argc_argv(
143143
to_code(value),
144144
goto_model.symbol_table,
145145
init_instructions,
146-
message_handler);
146+
message_handler,
147+
main_symbol.mode);
147148

148149
Forall_goto_program_instructions(it, init_instructions)
149150
{

src/goto-programs/builtin_functions.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ void goto_convertt::do_cpp_new(
438438
count.make_typecast(object_size.type());
439439

440440
// might have side-effect
441-
clean_expr(count, dest);
441+
clean_expr(count, dest, ID_cpp);
442442
}
443443

444444
exprt tmp_symbol_expr;
@@ -473,7 +473,7 @@ void goto_convertt::do_cpp_new(
473473
new_call.lhs()=tmp_symbol_expr;
474474
new_call.add_source_location()=rhs.source_location();
475475

476-
convert(new_call, dest);
476+
convert(new_call, dest, ID_cpp);
477477
}
478478
else if(rhs.operands().size()==1)
479479
{
@@ -509,7 +509,7 @@ void goto_convertt::do_cpp_new(
509509
if(new_call.arguments()[i].type()!=code_type.parameters()[i].type())
510510
new_call.arguments()[i].make_typecast(code_type.parameters()[i].type());
511511

512-
convert(new_call, dest);
512+
convert(new_call, dest, ID_cpp);
513513
}
514514
else
515515
{
@@ -551,7 +551,7 @@ void goto_convertt::cpp_new_initializer(
551551
const dereference_exprt deref_lhs(lhs, rhs.type().subtype());
552552

553553
replace_new_object(deref_lhs, initializer);
554-
convert(to_code(initializer), dest);
554+
convert(to_code(initializer), dest, ID_cpp);
555555
}
556556
else
557557
UNREACHABLE;

src/goto-programs/convert_nondet.cpp

+15-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ static goto_programt::targett insert_nondet_init_code(
3535
const goto_programt::targett &target,
3636
symbol_table_baset &symbol_table,
3737
message_handlert &message_handler,
38-
const object_factory_parameterst &object_factory_parameters)
38+
const object_factory_parameterst &object_factory_parameters,
39+
const irep_idt &mode)
3940
{
4041
// Return if the instruction isn't an assignment
4142
const auto next_instr=std::next(target);
@@ -96,7 +97,8 @@ static goto_programt::targett insert_nondet_init_code(
9697

9798
// Convert this code into goto instructions
9899
goto_programt new_instructions;
99-
goto_convert(init_code, symbol_table, new_instructions, message_handler);
100+
goto_convert(
101+
init_code, symbol_table, new_instructions, message_handler, mode);
100102

101103
// Insert the new instructions into the instruction list
102104
goto_program.destructive_insert(next_instr, new_instructions);
@@ -116,33 +118,37 @@ void convert_nondet(
116118
goto_programt &goto_program,
117119
symbol_table_baset &symbol_table,
118120
message_handlert &message_handler,
119-
const object_factory_parameterst &object_factory_parameters)
121+
const object_factory_parameterst &object_factory_parameters,
122+
const irep_idt &mode)
120123
{
121124
for(auto instruction_iterator=goto_program.instructions.begin(),
122125
end=goto_program.instructions.end();
123126
instruction_iterator!=end;)
124127
{
125-
instruction_iterator=insert_nondet_init_code(
128+
instruction_iterator = insert_nondet_init_code(
126129
goto_program,
127130
instruction_iterator,
128131
symbol_table,
129132
message_handler,
130-
object_factory_parameters);
133+
object_factory_parameters,
134+
mode);
131135
}
132136
}
133137

134138
void convert_nondet(
135139
goto_model_functiont &function,
136140
message_handlert &message_handler,
137-
const object_factory_parameterst &object_factory_parameters)
141+
const object_factory_parameterst &object_factory_parameters,
142+
const irep_idt &mode)
138143
{
139144
object_factory_parameterst parameters = object_factory_parameters;
140145
parameters.function_id = function.get_function_id();
141146
convert_nondet(
142147
function.get_goto_function().body,
143148
function.get_symbol_table(),
144149
message_handler,
145-
parameters);
150+
parameters,
151+
mode);
146152

147153
function.compute_location_numbers();
148154
}
@@ -167,7 +173,8 @@ void convert_nondet(
167173
f_it.second.body,
168174
symbol_table,
169175
message_handler,
170-
object_factory_parameters);
176+
object_factory_parameters,
177+
symbol.mode);
171178
}
172179
}
173180

src/goto-programs/convert_nondet.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Author: Reuben Thomas, [email protected]
1313
#define CPROVER_GOTO_PROGRAMS_CONVERT_NONDET_H
1414

1515
#include <cstddef> // size_t
16+
#include <util/irep.h>
1617

1718
class goto_functionst;
1819
class symbol_table_baset;
@@ -48,6 +49,7 @@ void convert_nondet(
4849
void convert_nondet(
4950
goto_model_functiont &function,
5051
message_handlert &message_handler,
51-
const object_factory_parameterst &object_factory_parameters);
52+
const object_factory_parameterst &object_factory_parameters,
53+
const irep_idt &mode);
5254

5355
#endif

0 commit comments

Comments
 (0)