@@ -30,15 +30,23 @@ Date: April 2016
30
30
#include < goto-programs/goto_model.h>
31
31
#include < goto-programs/remove_skip.h>
32
32
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
+ // /
34
37
// / \param goto_model: Contains the input program's symbol table and
35
38
// / 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
37
44
// / \param message_handler: message logging
38
45
// / \return True, if and only if modelling succeeded
39
46
bool model_argc_argv (
40
47
goto_modelt &goto_model,
41
- unsigned max_argc,
48
+ const std::list<std::string> &argv_args,
49
+ bool model_argv,
42
50
message_handlert &message_handler)
43
51
{
44
52
messaget message (message_handler);
@@ -83,25 +91,46 @@ bool model_argc_argv(
83
91
// guaranteed by POSIX (_POSIX_ARG_MAX):
84
92
// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html
85
93
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
+
105
134
std::istringstream iss (oss.str ());
106
135
107
136
ansi_c_languaget ansi_c_language;
0 commit comments