Skip to content

Commit ece3ff8

Browse files
authored
cli : fix segfault on missing argument (#2700)
1 parent 9366544 commit ece3ff8

File tree

1 file changed

+34
-28
lines changed

1 file changed

+34
-28
lines changed

examples/cli/cli.cpp

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ static char * whisper_param_turn_lowercase(char * in){
106106
return in;
107107
}
108108

109+
static char * requires_value_error(const std::string & arg) {
110+
fprintf(stderr, "error: argument %s requires value\n", arg.c_str());
111+
exit(0);
112+
}
113+
109114
static bool whisper_params_parse(int argc, char ** argv, whisper_params & params) {
110115
for (int i = 1; i < argc; i++) {
111116
std::string arg = argv[i];
@@ -124,22 +129,23 @@ static bool whisper_params_parse(int argc, char ** argv, whisper_params & params
124129
whisper_print_usage(argc, argv, params);
125130
exit(0);
126131
}
127-
else if (arg == "-t" || arg == "--threads") { params.n_threads = std::stoi(argv[++i]); }
128-
else if (arg == "-p" || arg == "--processors") { params.n_processors = std::stoi(argv[++i]); }
129-
else if (arg == "-ot" || arg == "--offset-t") { params.offset_t_ms = std::stoi(argv[++i]); }
130-
else if (arg == "-on" || arg == "--offset-n") { params.offset_n = std::stoi(argv[++i]); }
131-
else if (arg == "-d" || arg == "--duration") { params.duration_ms = std::stoi(argv[++i]); }
132-
else if (arg == "-mc" || arg == "--max-context") { params.max_context = std::stoi(argv[++i]); }
133-
else if (arg == "-ml" || arg == "--max-len") { params.max_len = std::stoi(argv[++i]); }
134-
else if (arg == "-bo" || arg == "--best-of") { params.best_of = std::stoi(argv[++i]); }
135-
else if (arg == "-bs" || arg == "--beam-size") { params.beam_size = std::stoi(argv[++i]); }
136-
else if (arg == "-ac" || arg == "--audio-ctx") { params.audio_ctx = std::stoi(argv[++i]); }
137-
else if (arg == "-wt" || arg == "--word-thold") { params.word_thold = std::stof(argv[++i]); }
138-
else if (arg == "-et" || arg == "--entropy-thold") { params.entropy_thold = std::stof(argv[++i]); }
139-
else if (arg == "-lpt" || arg == "--logprob-thold") { params.logprob_thold = std::stof(argv[++i]); }
140-
else if (arg == "-nth" || arg == "--no-speech-thold") { params.no_speech_thold = std::stof(argv[++i]); }
141-
else if (arg == "-tp" || arg == "--temperature") { params.temperature = std::stof(argv[++i]); }
142-
else if (arg == "-tpi" || arg == "--temperature-inc") { params.temperature_inc = std::stof(argv[++i]); }
132+
#define ARGV_NEXT (((i + 1) < argc) ? argv[++i] : requires_value_error(arg))
133+
else if (arg == "-t" || arg == "--threads") { params.n_threads = std::stoi(ARGV_NEXT); }
134+
else if (arg == "-p" || arg == "--processors") { params.n_processors = std::stoi(ARGV_NEXT); }
135+
else if (arg == "-ot" || arg == "--offset-t") { params.offset_t_ms = std::stoi(ARGV_NEXT); }
136+
else if (arg == "-on" || arg == "--offset-n") { params.offset_n = std::stoi(ARGV_NEXT); }
137+
else if (arg == "-d" || arg == "--duration") { params.duration_ms = std::stoi(ARGV_NEXT); }
138+
else if (arg == "-mc" || arg == "--max-context") { params.max_context = std::stoi(ARGV_NEXT); }
139+
else if (arg == "-ml" || arg == "--max-len") { params.max_len = std::stoi(ARGV_NEXT); }
140+
else if (arg == "-bo" || arg == "--best-of") { params.best_of = std::stoi(ARGV_NEXT); }
141+
else if (arg == "-bs" || arg == "--beam-size") { params.beam_size = std::stoi(ARGV_NEXT); }
142+
else if (arg == "-ac" || arg == "--audio-ctx") { params.audio_ctx = std::stoi(ARGV_NEXT); }
143+
else if (arg == "-wt" || arg == "--word-thold") { params.word_thold = std::stof(ARGV_NEXT); }
144+
else if (arg == "-et" || arg == "--entropy-thold") { params.entropy_thold = std::stof(ARGV_NEXT); }
145+
else if (arg == "-lpt" || arg == "--logprob-thold") { params.logprob_thold = std::stof(ARGV_NEXT); }
146+
else if (arg == "-nth" || arg == "--no-speech-thold") { params.no_speech_thold = std::stof(ARGV_NEXT); }
147+
else if (arg == "-tp" || arg == "--temperature") { params.temperature = std::stof(ARGV_NEXT); }
148+
else if (arg == "-tpi" || arg == "--temperature-inc") { params.temperature_inc = std::stof(ARGV_NEXT); }
143149
else if (arg == "-debug"|| arg == "--debug-mode") { params.debug_mode = true; }
144150
else if (arg == "-tr" || arg == "--translate") { params.translate = true; }
145151
else if (arg == "-di" || arg == "--diarize") { params.diarize = true; }
@@ -151,31 +157,31 @@ static bool whisper_params_parse(int argc, char ** argv, whisper_params & params
151157
else if (arg == "-osrt" || arg == "--output-srt") { params.output_srt = true; }
152158
else if (arg == "-owts" || arg == "--output-words") { params.output_wts = true; }
153159
else if (arg == "-olrc" || arg == "--output-lrc") { params.output_lrc = true; }
154-
else if (arg == "-fp" || arg == "--font-path") { params.font_path = argv[++i]; }
160+
else if (arg == "-fp" || arg == "--font-path") { params.font_path = ARGV_NEXT; }
155161
else if (arg == "-ocsv" || arg == "--output-csv") { params.output_csv = true; }
156162
else if (arg == "-oj" || arg == "--output-json") { params.output_jsn = true; }
157163
else if (arg == "-ojf" || arg == "--output-json-full"){ params.output_jsn_full = params.output_jsn = true; }
158-
else if (arg == "-of" || arg == "--output-file") { params.fname_out.emplace_back(argv[++i]); }
164+
else if (arg == "-of" || arg == "--output-file") { params.fname_out.emplace_back(ARGV_NEXT); }
159165
else if (arg == "-np" || arg == "--no-prints") { params.no_prints = true; }
160166
else if (arg == "-ps" || arg == "--print-special") { params.print_special = true; }
161167
else if (arg == "-pc" || arg == "--print-colors") { params.print_colors = true; }
162168
else if (arg == "-pp" || arg == "--print-progress") { params.print_progress = true; }
163169
else if (arg == "-nt" || arg == "--no-timestamps") { params.no_timestamps = true; }
164-
else if (arg == "-l" || arg == "--language") { params.language = whisper_param_turn_lowercase(argv[++i]); }
170+
else if (arg == "-l" || arg == "--language") { params.language = whisper_param_turn_lowercase(ARGV_NEXT); }
165171
else if (arg == "-dl" || arg == "--detect-language") { params.detect_language = true; }
166-
else if ( arg == "--prompt") { params.prompt = argv[++i]; }
167-
else if (arg == "-m" || arg == "--model") { params.model = argv[++i]; }
168-
else if (arg == "-f" || arg == "--file") { params.fname_inp.emplace_back(argv[++i]); }
169-
else if (arg == "-oved" || arg == "--ov-e-device") { params.openvino_encode_device = argv[++i]; }
170-
else if (arg == "-dtw" || arg == "--dtw") { params.dtw = argv[++i]; }
172+
else if ( arg == "--prompt") { params.prompt = ARGV_NEXT; }
173+
else if (arg == "-m" || arg == "--model") { params.model = ARGV_NEXT; }
174+
else if (arg == "-f" || arg == "--file") { params.fname_inp.emplace_back(ARGV_NEXT); }
175+
else if (arg == "-oved" || arg == "--ov-e-device") { params.openvino_encode_device = ARGV_NEXT; }
176+
else if (arg == "-dtw" || arg == "--dtw") { params.dtw = ARGV_NEXT; }
171177
else if (arg == "-ls" || arg == "--log-score") { params.log_score = true; }
172178
else if (arg == "-ng" || arg == "--no-gpu") { params.use_gpu = false; }
173179
else if (arg == "-fa" || arg == "--flash-attn") { params.flash_attn = true; }
174180
else if (arg == "-sns" || arg == "--suppress-nst") { params.suppress_nst = true; }
175-
else if ( arg == "--suppress-regex") { params.suppress_regex = argv[++i]; }
176-
else if ( arg == "--grammar") { params.grammar = argv[++i]; }
177-
else if ( arg == "--grammar-rule") { params.grammar_rule = argv[++i]; }
178-
else if ( arg == "--grammar-penalty") { params.grammar_penalty = std::stof(argv[++i]); }
181+
else if ( arg == "--suppress-regex") { params.suppress_regex = ARGV_NEXT; }
182+
else if ( arg == "--grammar") { params.grammar = ARGV_NEXT; }
183+
else if ( arg == "--grammar-rule") { params.grammar_rule = ARGV_NEXT; }
184+
else if ( arg == "--grammar-penalty") { params.grammar_penalty = std::stof(ARGV_NEXT); }
179185
else {
180186
fprintf(stderr, "error: unknown argument: %s\n", arg.c_str());
181187
whisper_print_usage(argc, argv, params);

0 commit comments

Comments
 (0)