Skip to content

Commit a8315e7

Browse files
committed
goto-instrument: add early output file validation
Validate output file presence before expensive analysis operations to prevent wasted computation when command is malformed. Fixes: #2593
1 parent 1505c36 commit a8315e7

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

src/goto-instrument/goto_instrument_parse_options.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,69 @@ int goto_instrument_parse_optionst::doit()
124124
return CPROVER_EXIT_USAGE_ERROR;
125125
}
126126

127+
// Check if an output file is required before expensive operations
128+
// Most operations that modify the model require an output file
129+
if(cmdline.args.size() < 2)
130+
{
131+
// Check if this is a read-only operation that doesn't require output
132+
// clang-format off
133+
bool is_read_only_operation =
134+
cmdline.isset("call-graph") ||
135+
cmdline.isset("check-call-sequence") ||
136+
cmdline.isset("document-claims-html") ||
137+
cmdline.isset("document-claims-latex") ||
138+
cmdline.isset("document-properties-html") ||
139+
cmdline.isset("document-properties-latex") ||
140+
cmdline.isset("dot") ||
141+
cmdline.isset("dump-c") ||
142+
cmdline.isset("horn") ||
143+
cmdline.isset("interpreter") ||
144+
cmdline.isset("list-calls-args") ||
145+
cmdline.isset("list-goto-functions") ||
146+
cmdline.isset("list-symbols") ||
147+
cmdline.isset("list-undefined-functions") ||
148+
cmdline.isset("print-internal-representation") ||
149+
cmdline.isset("reachable-call-graph") ||
150+
cmdline.isset("show-call-sequences") ||
151+
cmdline.isset("show-claims") ||
152+
cmdline.isset("show-custom-bitvector-analysis") ||
153+
cmdline.isset("show-dependence-graph") ||
154+
cmdline.isset("show-escape-analysis") ||
155+
cmdline.isset("show-global-may-alias") ||
156+
cmdline.isset("show-goto-function-call-graph") ||
157+
cmdline.isset("show-goto-functions") ||
158+
cmdline.isset("show-intervals") ||
159+
cmdline.isset("show-lexical-loops") ||
160+
cmdline.isset("show-local-bitvector-analysis") ||
161+
cmdline.isset("show-local-safe-pointers") ||
162+
cmdline.isset("show-locations") ||
163+
cmdline.isset("show-loops") ||
164+
cmdline.isset("show-natural-loops") ||
165+
cmdline.isset("show-points-to") ||
166+
cmdline.isset("show-properties") ||
167+
cmdline.isset("show-reaching-definitions") ||
168+
cmdline.isset("show-rw-set") ||
169+
cmdline.isset("show-safe-dereferences") ||
170+
cmdline.isset("show-sese-regions") ||
171+
cmdline.isset("show-struct-alignment") ||
172+
cmdline.isset("show-symbol-table") ||
173+
cmdline.isset("show-threaded") ||
174+
cmdline.isset("show-uninitialized") ||
175+
cmdline.isset("show-value-sets") ||
176+
cmdline.isset("validate-goto-binary") ||
177+
cmdline.isset("validate-goto-model") ||
178+
cmdline.isset("xml");
179+
// clang-format on
180+
181+
if(!is_read_only_operation)
182+
{
183+
log.error() << "Error: Output file name required. "
184+
<< "Run 'goto-instrument --help' for usage information."
185+
<< messaget::eom;
186+
return CPROVER_EXIT_USAGE_ERROR;
187+
}
188+
}
189+
127190
messaget::eval_verbosity(
128191
cmdline.get_value("verbosity"), messaget::M_STATUS, ui_message_handler);
129192

0 commit comments

Comments
 (0)