@@ -55,12 +55,12 @@ static FlagDescription FlagDescriptions [] {
55
55
static const size_t kNumFlags =
56
56
sizeof (FlagDescriptions) / sizeof (FlagDescriptions[0 ]);
57
57
58
- static std::vector<std::string> inputs ;
59
- static const char *ProgName;
58
+ static std::vector<std::string> *Inputs ;
59
+ static std::string *ProgName;
60
60
61
61
static void PrintHelp () {
62
62
Printf (" Usage: %s [-flag1=val1 [-flag2=val2 ...] ] [dir1 [dir2 ...] ]\n " ,
63
- ProgName);
63
+ ProgName-> c_str () );
64
64
Printf (" \n Flags: (strictly in form -flag=value)\n " );
65
65
size_t MaxFlagLen = 0 ;
66
66
for (size_t F = 0 ; F < kNumFlags ; F++)
@@ -119,16 +119,17 @@ static bool ParseOneFlag(const char *Param) {
119
119
}
120
120
121
121
// We don't use any library to minimize dependencies.
122
- static void ParseFlags (int argc, char **argv ) {
122
+ static void ParseFlags (const std::vector<std::string> &Args ) {
123
123
for (size_t F = 0 ; F < kNumFlags ; F++) {
124
124
if (FlagDescriptions[F].IntFlag )
125
125
*FlagDescriptions[F].IntFlag = FlagDescriptions[F].Default ;
126
126
if (FlagDescriptions[F].StrFlag )
127
127
*FlagDescriptions[F].StrFlag = nullptr ;
128
128
}
129
- for (int A = 1 ; A < argc; A++) {
130
- if (ParseOneFlag (argv[A])) continue ;
131
- inputs.push_back (argv[A]);
129
+ Inputs = new std::vector<std::string>;
130
+ for (size_t A = 1 ; A < Args.size (); A++) {
131
+ if (ParseOneFlag (Args[A].c_str ())) continue ;
132
+ Inputs->push_back (Args[A]);
132
133
}
133
134
}
134
135
@@ -161,15 +162,15 @@ static void WorkerThread(const std::string &Cmd, std::atomic<int> *Counter,
161
162
}
162
163
}
163
164
164
- static int RunInMultipleProcesses (int argc, char **argv, int NumWorkers ,
165
- int NumJobs) {
165
+ static int RunInMultipleProcesses (const std::vector<std::string> &Args ,
166
+ int NumWorkers, int NumJobs) {
166
167
std::atomic<int > Counter (0 );
167
168
std::atomic<bool > HasErrors (false );
168
169
std::string Cmd;
169
- for (int i = 0 ; i < argc; i++ ) {
170
- if (FlagValue (argv[i] , " jobs" ) || FlagValue (argv[i] , " workers" )) continue ;
171
- Cmd += argv[i] ;
172
- Cmd += " " ;
170
+ for (auto &S : Args ) {
171
+ if (FlagValue (S. c_str () , " jobs" ) || FlagValue (S. c_str () , " workers" ))
172
+ continue ;
173
+ Cmd += S + " " ;
173
174
}
174
175
std::vector<std::thread> V;
175
176
std::thread Pulse (PulseThread);
@@ -208,10 +209,22 @@ int FuzzerDriver(int argc, char **argv, UserCallback Callback) {
208
209
}
209
210
210
211
int FuzzerDriver (int argc, char **argv, UserSuppliedFuzzer &USF) {
211
- using namespace fuzzer ;
212
+ std::vector<std::string> Args (argv, argv + argc);
213
+ return FuzzerDriver (Args, USF);
214
+ }
212
215
213
- ProgName = argv[0 ];
214
- ParseFlags (argc, argv);
216
+ int FuzzerDriver (const std::vector<std::string> &Args, UserCallback Callback) {
217
+ FuzzerRandomLibc Rand (0 );
218
+ SimpleUserSuppliedFuzzer SUSF (&Rand, Callback);
219
+ return FuzzerDriver (Args, SUSF);
220
+ }
221
+
222
+ int FuzzerDriver (const std::vector<std::string> &Args,
223
+ UserSuppliedFuzzer &USF) {
224
+ using namespace fuzzer ;
225
+ assert (!Args.empty ());
226
+ ProgName = new std::string (Args[0 ]);
227
+ ParseFlags (Args);
215
228
if (Flags.help ) {
216
229
PrintHelp ();
217
230
return 0 ;
@@ -224,7 +237,7 @@ int FuzzerDriver(int argc, char **argv, UserSuppliedFuzzer &USF) {
224
237
}
225
238
226
239
if (Flags.workers > 0 && Flags.jobs > 0 )
227
- return RunInMultipleProcesses (argc, argv , Flags.workers , Flags.jobs );
240
+ return RunInMultipleProcesses (Args , Flags.workers , Flags.jobs );
228
241
229
242
Fuzzer::FuzzingOptions Options;
230
243
Options.Verbosity = Flags.verbosity ;
@@ -245,8 +258,8 @@ int FuzzerDriver(int argc, char **argv, UserSuppliedFuzzer &USF) {
245
258
Options.TBMWidth = Flags.tbm_width ;
246
259
if (Flags.runs >= 0 )
247
260
Options.MaxNumberOfRuns = Flags.runs ;
248
- if (!inputs. empty ())
249
- Options.OutputCorpus = inputs [0 ];
261
+ if (!Inputs-> empty ())
262
+ Options.OutputCorpus = (*Inputs) [0 ];
250
263
if (Flags.sync_command )
251
264
Options.SyncCommand = Flags.sync_command ;
252
265
Options.SyncTimeout = Flags.sync_timeout ;
@@ -282,7 +295,7 @@ int FuzzerDriver(int argc, char **argv, UserSuppliedFuzzer &USF) {
282
295
}
283
296
284
297
F.RereadOutputCorpus ();
285
- for (auto &inp : inputs )
298
+ for (auto &inp : *Inputs )
286
299
if (inp != Options.OutputCorpus )
287
300
F.ReadDir (inp, nullptr );
288
301
0 commit comments