Skip to content

Commit 5bdff46

Browse files
authored
Merge pull request #8174 from tautschnig/bugfixes/argc-argv-scope
argc/argv modelling: argument string must remain in scope
2 parents 464d8eb + ab93890 commit 5bdff46

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

regression/goto-instrument/argc-argv1/main.c

+4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
int main(int argc, char* argv[])
44
{
55
if(argc>=2)
6+
{
67
assert(argv[1]!=0);
8+
// we can access at least one character (might be a string-terminating zero)
9+
char first_char = *argv[1];
10+
}
711

812
return 0;
913
}

src/goto-instrument/dump_c.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,14 @@ void dump_ct::operator()(std::ostream &os)
208208

209209
// we don't want to dump in full all definitions; in particular
210210
// do not dump anonymous types that are defined in system headers
211-
if((!tag_added || symbol.is_type) &&
212-
system_symbols.is_symbol_internal_symbol(symbol, system_headers) &&
213-
symbol.name!=goto_functions.entry_point())
211+
if(
212+
(!tag_added || symbol.is_type) &&
213+
system_symbols.is_symbol_internal_symbol(symbol, system_headers) &&
214+
symbol.name != goto_functions.entry_point() &&
215+
symbol.name != CPROVER_PREFIX "arg_string") // model for argc/argv
216+
{
214217
continue;
218+
}
215219

216220
bool inserted=symbols_sorted.insert(name_str).second;
217221
CHECK_RETURN(inserted);

src/goto-instrument/model_argc_argv.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,22 @@ bool model_argc_argv(
8585
std::ostringstream oss;
8686
oss << "int ARGC;\n"
8787
<< "char *ARGV[1];\n"
88+
<< "extern char " CPROVER_PREFIX "arg_string[4096];\n"
8889
<< "void " << goto_model.goto_functions.entry_point() << "()\n"
8990
<< "{\n"
9091
<< " unsigned next=0u;\n"
9192
<< " " CPROVER_PREFIX "assume(ARGC>=1);\n"
9293
<< " " 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"
9596
<< " for(int i=0; i<ARGC && i<" << max_argc << "; ++i)\n"
9697
<< " {\n"
9798
<< " unsigned len;\n"
9899
<< " " CPROVER_PREFIX "assume(len<4096);\n"
99100
<< " " 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"
102104
<< " next+=len+1;\n"
103105
<< " }\n"
104106
<< "}";
@@ -124,8 +126,11 @@ bool model_argc_argv(
124126
// add __CPROVER_assume if necessary (it might exist already)
125127
if(
126128
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+
{
128132
goto_model.symbol_table.add(symbol_pair.second);
133+
}
129134
else if(symbol_pair.first == goto_model.goto_functions.entry_point())
130135
{
131136
value = symbol_pair.second.value;

0 commit comments

Comments
 (0)