Skip to content

Commit db7a0e0

Browse files
committed
goto-instrument/model_argc_argv: add new option: --add-cmd-line-arg
1 parent 2e26d15 commit db7a0e0

File tree

2 files changed

+63
-23
lines changed

2 files changed

+63
-23
lines changed

src/goto-instrument/model_argc_argv.cpp

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,23 @@ Date: April 2016
3030
#include <goto-programs/goto_model.h>
3131
#include <goto-programs/remove_skip.h>
3232

33-
/// Set up argv with up to max_argc pointers into an array of 4096 bytes.
33+
/// Set up argv to user-specified values (when model_argv is FALSE) or
34+
/// (when model_argv is TRUE) set up argv with up to max_argc pointers
35+
/// into a char array of 4096 bytes.
36+
///
3437
/// \param goto_model: Contains the input program's symbol table and
3538
/// intermediate representation
36-
/// \param max_argc: User-specified maximum number of arguments to be modelled
39+
/// \param argv_args: User-specified cmd-line arguments (ARGV),
40+
/// when model_argv is TRUE then size of argv_args represents
41+
/// the maximum number of arguments to be modelled
42+
/// \param model_argv: If set to TRUE then modelling argv with up to
43+
/// max_argc pointers
3744
/// \param message_handler: message logging
3845
/// \return True, if and only if modelling succeeded
3946
bool model_argc_argv(
4047
goto_modelt &goto_model,
41-
unsigned max_argc,
48+
const std::list<std::string> &argv_args,
49+
bool model_argv,
4250
message_handlert &message_handler)
4351
{
4452
messaget message(message_handler);
@@ -83,25 +91,46 @@ bool model_argc_argv(
8391
// guaranteed by POSIX (_POSIX_ARG_MAX):
8492
// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html
8593
std::ostringstream oss;
86-
oss << "int ARGC;\n"
87-
<< "char *ARGV[1];\n"
88-
<< "void " << goto_model.goto_functions.entry_point() << "()\n"
89-
<< "{\n"
90-
<< " unsigned next=0u;\n"
91-
<< " " CPROVER_PREFIX "assume(ARGC>=1);\n"
92-
<< " " CPROVER_PREFIX "assume(ARGC<=" << max_argc << ");\n"
93-
<< " char arg_string[4096];\n"
94-
<< " " CPROVER_PREFIX "input(\"arg_string\", &arg_string[0]);\n"
95-
<< " for(int i=0; i<ARGC && i<" << max_argc << "; ++i)\n"
96-
<< " {\n"
97-
<< " unsigned len;\n"
98-
<< " " CPROVER_PREFIX "assume(len<4096);\n"
99-
<< " " CPROVER_PREFIX "assume(next+len<4096);\n"
100-
<< " " CPROVER_PREFIX "assume(arg_string[next+len]==0);\n"
101-
<< " ARGV[i]=&(arg_string[next]);\n"
102-
<< " next+=len+1;\n"
103-
<< " }\n"
104-
<< "}";
94+
unsigned max_argc = argv_args.size();
95+
unsigned argc = argv_args.size();
96+
97+
if(model_argv)
98+
{
99+
oss << "int ARGC;\n"
100+
<< "char *ARGV[1];\n"
101+
<< "void " << goto_model.goto_functions.entry_point() << "()\n"
102+
<< "{\n"
103+
<< " unsigned next=0u;\n"
104+
<< " " CPROVER_PREFIX "assume(ARGC>=1);\n"
105+
<< " " CPROVER_PREFIX "assume(ARGC<=" << max_argc << ");\n"
106+
<< " char arg_string[4096];\n"
107+
<< " " CPROVER_PREFIX "input(\"arg_string\", &arg_string[0]);\n"
108+
<< " for(int i=0; i<ARGC && i<" << max_argc << "; ++i)\n"
109+
<< " {\n"
110+
<< " unsigned len;\n"
111+
<< " " CPROVER_PREFIX "assume(len<4096);\n"
112+
<< " " CPROVER_PREFIX "assume(next+len<4096);\n"
113+
<< " " CPROVER_PREFIX "assume(arg_string[next+len]==0);\n"
114+
<< " ARGV[i]=&(arg_string[next]);\n"
115+
<< " next+=len+1;\n"
116+
<< " }\n"
117+
<< "}";
118+
}
119+
else
120+
{ // model_argv = false, set each argv[i] explicitly
121+
oss << "int ARGC = " << argc << ";\n"
122+
<< "char *ARGV[" << argc << "];\n"
123+
<< "void " << goto_model.goto_functions.entry_point() << "()\n"
124+
<< "{\n";
125+
int i = 0;
126+
for(auto const &arg : argv_args)
127+
{
128+
oss << "ARGV[" << i << "]=\"" << arg << "\";\n";
129+
i++;
130+
}
131+
oss << "}";
132+
}
133+
105134
std::istringstream iss(oss.str());
106135

107136
ansi_c_languaget ansi_c_language;

src/goto-instrument/model_argc_argv.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,23 @@ Date: April 2016
1414
#ifndef CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H
1515
#define CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H
1616

17+
#include <list>
18+
#include <string>
19+
1720
class goto_modelt;
1821
class message_handlert;
1922

2023
bool model_argc_argv(
2124
goto_modelt &,
22-
unsigned max_argc,
25+
const std::list<std::string> &argv_args,
26+
bool model_argv,
2327
message_handlert &);
2428

29+
#define OPT_ARGC_ARGV "(model-argc-argv):(add-cmd-line-arg):"
30+
31+
#define HELP_ARGC_ARGV \
32+
" --model-argc-argv <n> model up to <n> command line arguments\n" \
33+
" --add-cmd-line-arg <arg> add command line argument (may be " \
34+
"repeated)\n"
35+
2536
#endif // CPROVER_GOTO_INSTRUMENT_MODEL_ARGC_ARGV_H

0 commit comments

Comments
 (0)