Skip to content

Commit ef7e55b

Browse files
authored
Merge pull request #2723 from tautschnig/replace_symbol-cleanup
replace_symbolt refactoring and stricter type checking
2 parents 9c5bb20 + 9b62514 commit ef7e55b

File tree

14 files changed

+268
-103
lines changed

14 files changed

+268
-103
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include <assert.h>
2+
3+
int main()
4+
{
5+
int i = 0;
6+
int *p = &i;
7+
assert(*p == 0);
8+
return 0;
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
--constant-propagator
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
VERIFICATION SUCCESSFUL
7+
--
8+
^warning: ignoring

src/analyses/constant_propagator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class constant_propagator_domaint:public ai_domain_baset
8181
struct valuest
8282
{
8383
// maps variables to constants
84-
replace_symbolt replace_const;
84+
address_of_aware_replace_symbolt replace_const;
8585
bool is_bottom = true;
8686

8787
bool merge(const valuest &src);

src/goto-instrument/code_contracts.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,10 @@ void code_contractst::apply_contract(
189189

190190
// TODO: return value could be nil
191191
if(type.return_type()!=empty_typet())
192-
replace.insert("__CPROVER_return_value", call.lhs());
192+
{
193+
symbol_exprt ret_val(CPROVER_PREFIX "return_value", call.lhs().type());
194+
replace.insert(ret_val, call.lhs());
195+
}
193196

194197
// formal parameters
195198
code_function_callt::argumentst::const_iterator a_it=
@@ -200,7 +203,10 @@ void code_contractst::apply_contract(
200203
a_it!=call.arguments().end();
201204
++p_it, ++a_it)
202205
if(!p_it->get_identifier().empty())
203-
replace.insert(p_it->get_identifier(), *a_it);
206+
{
207+
symbol_exprt p(p_it->get_identifier(), p_it->type());
208+
replace.insert(p, *a_it);
209+
}
204210

205211
replace(requires);
206212
replace(ensures);
@@ -318,7 +324,8 @@ void code_contractst::add_contract_check(
318324

319325
call.lhs()=r;
320326

321-
replace.insert("__CPROVER_return_value", r);
327+
symbol_exprt ret_val(CPROVER_PREFIX "return_value", call.lhs().type());
328+
replace.insert(ret_val, r);
322329
}
323330

324331
// decl parameter1 ...
@@ -339,7 +346,10 @@ void code_contractst::add_contract_check(
339346
call.arguments().push_back(p);
340347

341348
if(!p_it->get_identifier().empty())
342-
replace.insert(p_it->get_identifier(), p);
349+
{
350+
symbol_exprt cur_p(p_it->get_identifier(), p_it->type());
351+
replace.insert(cur_p, p);
352+
}
343353
}
344354

345355
// assume(requires)

src/goto-instrument/concurrency.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,17 @@ void concurrency_instrumentationt::instrument(exprt &expr)
8989
{
9090
if(s_it->id()==ID_symbol)
9191
{
92-
const irep_idt identifier=
93-
to_symbol_expr(*s_it).get_identifier();
92+
const symbol_exprt &s = to_symbol_expr(*s_it);
9493

95-
shared_varst::const_iterator
96-
v_it=shared_vars.find(identifier);
94+
shared_varst::const_iterator v_it = shared_vars.find(s.get_identifier());
9795

9896
if(v_it!=shared_vars.end())
9997
{
10098
index_exprt new_expr;
10199
// new_expr.array()=symbol_expr();
102100
// new_expr.index()=symbol_expr();
103101

104-
replace_symbol.insert(identifier, new_expr);
102+
replace_symbol.insert(s, new_expr);
105103
}
106104
}
107105
}

src/goto-instrument/dump_c.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -915,23 +915,26 @@ void dump_ct::cleanup_harness(code_blockt &b)
915915
if(!ns.lookup("argc'", argc_sym))
916916
{
917917
symbol_exprt argc("argc", argc_sym->type);
918-
replace.insert(argc_sym->name, argc);
918+
replace.insert(argc_sym->symbol_expr(), argc);
919919
code_declt d(argc);
920920
decls.add(d);
921921
}
922922
const symbolt *argv_sym=nullptr;
923923
if(!ns.lookup("argv'", argv_sym))
924924
{
925925
symbol_exprt argv("argv", argv_sym->type);
926-
replace.insert(argv_sym->name, argv);
926+
// replace argc' by argc in the type of argv['] to maintain type consistency
927+
// while replacing
928+
replace(argv);
929+
replace.insert(symbol_exprt(argv_sym->name, argv.type()), argv);
927930
code_declt d(argv);
928931
decls.add(d);
929932
}
930933
const symbolt *return_sym=nullptr;
931934
if(!ns.lookup("return'", return_sym))
932935
{
933936
symbol_exprt return_value("return_value", return_sym->type);
934-
replace.insert(return_sym->name, return_value);
937+
replace.insert(return_sym->symbol_expr(), return_value);
935938
code_declt d(return_value);
936939
decls.add(d);
937940
}

src/goto-instrument/model_argc_argv.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ bool model_argc_argv(
7474
return false;
7575
}
7676

77+
const symbolt &argc_primed = ns.lookup("argc'");
78+
symbol_exprt ARGC("ARGC", argc_primed.type);
79+
const symbolt &argv_primed = ns.lookup("argv'");
80+
symbol_exprt ARGV("ARGV", argv_primed.type);
81+
7782
// set the size of ARGV storage to 4096, which matches the minimum
7883
// guaranteed by POSIX (_POSIX_ARG_MAX):
7984
// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html
@@ -125,9 +130,9 @@ bool model_argc_argv(
125130
{
126131
value = symbol_pair.second.value;
127132

128-
replace_symbolt replace;
129-
replace.insert("ARGC", ns.lookup("argc'").symbol_expr());
130-
replace.insert("ARGV", ns.lookup("argv'").symbol_expr());
133+
unchecked_replace_symbolt replace;
134+
replace.insert(ARGC, ns.lookup("argc'").symbol_expr());
135+
replace.insert(ARGV, ns.lookup("argv'").symbol_expr());
131136
replace(value);
132137
}
133138
else if(

src/linking/linking.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,8 @@ void linkingt::duplicate_object_symbol(
993993
else if(set_to_new)
994994
old_symbol.type=new_symbol.type;
995995

996-
object_type_updates.insert(old_symbol.name, old_symbol.symbol_expr());
996+
object_type_updates.insert(
997+
old_symbol.symbol_expr(), old_symbol.symbol_expr());
997998
}
998999

9991000
// care about initializers

src/linking/linking_class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class linkingt:public typecheckt
3535
virtual void typecheck();
3636

3737
rename_symbolt rename_symbol;
38-
replace_symbolt object_type_updates;
38+
unchecked_replace_symbolt object_type_updates;
3939

4040
protected:
4141
bool needs_renaming_type(

src/solvers/flattening/flatten_byte_operators.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ static exprt unpack_rec(
7979
{
8080
index_exprt index(src, from_integer(i, index_type()));
8181
replace_symbolt replace;
82-
replace.insert(ID_C_incomplete, index);
82+
replace.insert(dummy, index);
8383

8484
for(const auto &op : sub.operands())
8585
{

src/solvers/smt2/smt2_solver.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,9 @@ void smt2_solvert::expand_function_applications(exprt &expr)
106106
std::map<irep_idt, exprt> parameter_map;
107107
for(std::size_t i=0; i<f_type.domain().size(); i++)
108108
{
109-
const irep_idt p_identifier=
110-
f_type.domain()[i].get_identifier();
111-
112-
replace_symbol.insert(p_identifier, app.arguments()[i]);
109+
const auto &var = f_type.domain()[i];
110+
const symbol_exprt s(var.get_identifier(), var.type());
111+
replace_symbol.insert(s, app.arguments()[i]);
113112
}
114113

115114
exprt body=f.definition;

0 commit comments

Comments
 (0)