@@ -85,20 +85,22 @@ bool model_argc_argv(
85
85
std::ostringstream oss;
86
86
oss << " int ARGC;\n "
87
87
<< " char *ARGV[1];\n "
88
+ << " extern char " CPROVER_PREFIX " arg_string[4096];\n "
88
89
<< " void " << goto_model.goto_functions .entry_point () << " ()\n "
89
90
<< " {\n "
90
91
<< " unsigned next=0u;\n "
91
92
<< " " CPROVER_PREFIX " assume(ARGC>=1);\n "
92
93
<< " " CPROVER_PREFIX " assume(ARGC<=" << max_argc << " );\n "
93
- << " char arg_string[4096]; \n "
94
- << " " CPROVER_PREFIX " input( \" arg_string \" , & arg_string[0]);\n "
94
+ << " " CPROVER_PREFIX " input( \" arg_string\" , \n "
95
+ << " & " CPROVER_PREFIX " arg_string[0]);\n "
95
96
<< " for(int i=0; i<ARGC && i<" << max_argc << " ; ++i)\n "
96
97
<< " {\n "
97
98
<< " unsigned len;\n "
98
99
<< " " CPROVER_PREFIX " assume(len<4096);\n "
99
100
<< " " CPROVER_PREFIX " assume(next+len<4096);\n "
100
- << " " CPROVER_PREFIX " assume(arg_string[next+len]==0);\n "
101
- << " ARGV[i]=&(arg_string[next]);\n "
101
+ << " " CPROVER_PREFIX " assume(\n "
102
+ << " " CPROVER_PREFIX " arg_string[next+len]==0);\n "
103
+ << " ARGV[i]=&(" CPROVER_PREFIX " arg_string[next]);\n "
102
104
<< " next+=len+1;\n "
103
105
<< " }\n "
104
106
<< " }" ;
@@ -124,8 +126,11 @@ bool model_argc_argv(
124
126
// add __CPROVER_assume if necessary (it might exist already)
125
127
if (
126
128
symbol_pair.first == CPROVER_PREFIX " assume" ||
127
- symbol_pair.first == CPROVER_PREFIX " input" )
129
+ symbol_pair.first == CPROVER_PREFIX " input" ||
130
+ symbol_pair.first == CPROVER_PREFIX " arg_string" )
131
+ {
128
132
goto_model.symbol_table .add (symbol_pair.second );
133
+ }
129
134
else if (symbol_pair.first == goto_model.goto_functions .entry_point ())
130
135
{
131
136
value = symbol_pair.second .value ;
0 commit comments