CBMC
goto_diff_parse_options.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: GOTO-DIFF Command Line Option Processing
4 
5 Author: Peter Schrammel
6 
7 \*******************************************************************/
8 
11 
13 
14 #include <util/config.h>
15 #include <util/exit_codes.h>
16 #include <util/options.h>
17 #include <util/version.h>
18 
21 #include <goto-programs/loop_ids.h>
26 
27 #include <ansi-c/cprover_library.h>
28 #include <ansi-c/gcc_version.h>
29 #include <assembler/remove_asm.h>
30 #include <cpp/cprover_library.h>
31 #include <goto-instrument/cover.h>
32 
33 #include "change_impact.h"
34 #include "syntactic_diff.h"
35 #include "unified_diff.h"
36 
37 #include <cstdlib> // exit()
38 #include <fstream>
39 #include <iostream>
40 
44  argc,
45  argv,
46  std::string("GOTO-DIFF ") + CBMC_VERSION)
47 {
48 }
49 
51 {
52  if(config.set(cmdline))
53  {
54  usage_error();
55  exit(1);
56  }
57 
58  if(cmdline.isset("cover"))
59  parse_cover_options(cmdline, options);
60 
61  // all checks supported by goto_check
63 
64  options.set_option("show-properties", cmdline.isset("show-properties"));
65 
66  // Options for process_goto_program
67  options.set_option("rewrite-union", true);
68 }
69 
72 {
73  if(cmdline.isset("version"))
74  {
75  std::cout << CBMC_VERSION << '\n';
76  return CPROVER_EXIT_SUCCESS;
77  }
78 
79  //
80  // command line options
81  //
82 
83  optionst options;
84  get_command_line_options(options);
87 
88  log_version_and_architecture("GOTO-DIFF");
89 
90  if(cmdline.args.size()!=2)
91  {
92  log.error() << "Please provide two programs to compare" << messaget::eom;
94  }
95 
97 
98  goto_modelt goto_model1 =
100 
101  // configure gcc, if required -- initialize_goto_model will have set config
103  {
104  gcc_versiont gcc_version;
105  gcc_version.get("gcc");
106  configure_gcc(gcc_version);
107  }
108 
109  if(process_goto_program(options, goto_model1))
111  goto_modelt goto_model2 =
113  if(process_goto_program(options, goto_model2))
115 
116  if(cmdline.isset("show-loops"))
117  {
118  show_loop_ids(ui_message_handler.get_ui(), goto_model1);
119  show_loop_ids(ui_message_handler.get_ui(), goto_model2);
120  return CPROVER_EXIT_SUCCESS;
121  }
122 
123  if(
124  cmdline.isset("show-goto-functions") ||
125  cmdline.isset("list-goto-functions"))
126  {
128  goto_model1, ui_message_handler, cmdline.isset("list-goto-functions"));
130  goto_model2, ui_message_handler, cmdline.isset("list-goto-functions"));
131  return CPROVER_EXIT_SUCCESS;
132  }
133 
134  if(cmdline.isset("change-impact") ||
135  cmdline.isset("forward-impact") ||
136  cmdline.isset("backward-impact"))
137  {
138  impact_modet impact_mode=
139  cmdline.isset("forward-impact") ?
141  (cmdline.isset("backward-impact") ?
145  goto_model1,
146  goto_model2,
147  impact_mode,
148  cmdline.isset("compact-output"));
149 
150  return CPROVER_EXIT_SUCCESS;
151  }
152 
153  if(cmdline.isset("unified") ||
154  cmdline.isset('u'))
155  {
156  unified_difft u(goto_model1, goto_model2);
157  u();
158  u.output(std::cout);
159 
160  return CPROVER_EXIT_SUCCESS;
161  }
162 
163  syntactic_difft sd(goto_model1, goto_model2, options, ui_message_handler);
164  sd();
165  sd.output_functions();
166 
167  return CPROVER_EXIT_SUCCESS;
168 }
169 
171  const optionst &options,
172  goto_modelt &goto_model)
173 {
174  // Remove inline assembler; this needs to happen before
175  // adding the library.
176  remove_asm(goto_model);
177 
178  // add the library
179  log.status() << "Adding CPROVER library (" << config.ansi_c.arch << ")"
180  << messaget::eom;
183 
184  // Common removal of types and complex constructs
185  if(::process_goto_program(goto_model, options, log))
186  return true;
187 
188  // instrument cover goals
189  if(cmdline.isset("cover"))
190  {
191  // remove skips such that trivial GOTOs are deleted and not considered
192  // for coverage annotation:
193  remove_skip(goto_model);
194 
195  const auto cover_config =
196  get_cover_config(options, goto_model.symbol_table, ui_message_handler);
197  if(instrument_cover_goals(cover_config, goto_model, ui_message_handler))
198  return true;
199 
200  goto_model.goto_functions.update();
201  }
202 
203  // label the assertions
204  // This must be done after adding assertions and
205  // before using the argument of the "property" option.
206  // Do not re-label after using the property slicer because
207  // this would cause the property identifiers to change.
208  label_properties(goto_model);
209 
210  // remove any skips introduced since coverage instrumentation
211  remove_skip(goto_model);
212 
213  return false;
214 }
215 
218 {
219  // clang-format off
220  std::cout << '\n' << banner_string("GOTO_DIFF", CBMC_VERSION) << '\n'
221  << align_center_with_border("Copyright (C) 2016") << '\n'
222  << align_center_with_border("Daniel Kroening, Peter Schrammel") << '\n' // NOLINT (*)
223  << align_center_with_border("kroening@kroening.com") << '\n'
224  <<
225  "\n"
226  "Usage: Purpose:\n"
227  "\n"
228  " goto_diff [-?] [-h] [--help] show help\n"
229  " goto_diff old new goto binaries to be compared\n"
230  "\n"
231  "Diff options:\n"
234  " --show-loops show the loops in the programs\n"
235  " -u | --unified output unified diff\n"
236  " --change-impact | \n"
237  " --forward-impact |\n"
238  // NOLINTNEXTLINE(whitespace/line_length)
239  " --backward-impact output unified diff with forward&backward/forward/backward dependencies\n"
240  " --compact-output output dependencies in compact mode\n"
241  "\n"
242  "Program instrumentation options:\n"
244  HELP_COVER
245  "\n"
246  "Other options:\n"
247  " --version show version and exit\n"
248  " --json-ui use JSON-formatted output\n"
249  HELP_FLUSH
250  " --verbosity # verbosity level\n"
252  "\n";
253  // clang-format on
254 }
cprover_library.h
cmdlinet::args
argst args
Definition: cmdline.h:145
cover.h
HELP_SHOW_GOTO_FUNCTIONS
#define HELP_SHOW_GOTO_FUNCTIONS
Definition: show_goto_functions.h:25
goto_diff_parse_optionst::process_goto_program
bool process_goto_program(const optionst &options, goto_modelt &goto_model)
Definition: goto_diff_parse_options.cpp:170
HELP_GOTO_CHECK
#define HELP_GOTO_CHECK
Definition: goto_check_c.h:53
impact_modet
impact_modet
Definition: change_impact.h:18
gcc_versiont::get
void get(const std::string &executable)
Definition: gcc_version.cpp:18
goto_diff_parse_optionst::doit
int doit() override
invoke main modules
Definition: goto_diff_parse_options.cpp:71
unified_difft::output
void output(std::ostream &os) const
Definition: unified_diff.cpp:375
parse_options_baset::ui_message_handler
ui_message_handlert ui_message_handler
Definition: parse_options.h:45
parse_options_baset
Definition: parse_options.h:19
GOTO_DIFF_OPTIONS
#define GOTO_DIFF_OPTIONS
Definition: goto_diff_parse_options.h:29
cmdlinet::isset
virtual bool isset(char option) const
Definition: cmdline.cpp:30
impact_modet::BACKWARD
@ BACKWARD
optionst
Definition: options.h:22
gcc_version.h
messaget::M_STATISTICS
@ M_STATISTICS
Definition: message.h:171
goto_diff_parse_optionst::help
void help() override
display command line help
Definition: goto_diff_parse_options.cpp:217
messaget::status
mstreamt & status() const
Definition: message.h:414
remove_skip
void remove_skip(goto_programt &goto_program, goto_programt::targett begin, goto_programt::targett end)
remove unnecessary skip statements
Definition: remove_skip.cpp:87
remove_asm.h
configure_gcc
void configure_gcc(const gcc_versiont &gcc_version)
Definition: gcc_version.cpp:147
change_impact
void change_impact(const goto_modelt &model_old, const goto_modelt &model_new, impact_modet impact_mode, bool compact_output)
Definition: change_impact.cpp:753
goto_modelt
Definition: goto_model.h:25
show_loop_ids
void show_loop_ids(ui_message_handlert::uit ui, const goto_modelt &goto_model)
Definition: loop_ids.cpp:21
HELP_COVER
#define HELP_COVER
Definition: cover.h:32
options.h
optionst::set_option
void set_option(const std::string &option, const bool value)
Definition: options.cpp:28
parse_options_baset::log_version_and_architecture
void log_version_and_architecture(const std::string &front_end)
Write version and system architecture to log.status().
Definition: parse_options.cpp:152
messaget::eom
static eomt eom
Definition: message.h:297
instrument_cover_goals
static void instrument_cover_goals(const irep_idt &function_id, goto_programt &goto_program, const cover_instrumenterst &instrumenters, const irep_idt &mode, message_handlert &message_handler, const cover_instrumenter_baset::assertion_factoryt &make_assertion)
Applies instrumenters to given goto program.
Definition: cover.cpp:37
impact_modet::BOTH
@ BOTH
configt::ansi_c
struct configt::ansi_ct ansi_c
version.h
unified_difft
Definition: unified_diff.h:29
label_properties
void label_properties(goto_modelt &goto_model)
Definition: set_properties.cpp:45
syntactic_difft
Definition: syntactic_diff.h:17
ui_message_handlert::get_ui
virtual uit get_ui() const
Definition: ui_message.h:33
parse_options_baset::usage_error
virtual void usage_error()
Definition: parse_options.cpp:49
unified_diff.h
set_properties.h
get_cover_config
cover_configt get_cover_config(const optionst &options, const symbol_tablet &symbol_table, message_handlert &message_handler)
Build data structures controlling coverage from command-line options.
Definition: cover.cpp:186
goto_diff_parse_optionst::register_languages
void register_languages() override
Definition: goto_diff_languages.cpp:19
goto_difft::output_functions
virtual void output_functions() const
Output diff result.
Definition: goto_diff_base.cpp:21
CBMC_VERSION
const char * CBMC_VERSION
messaget::error
mstreamt & error() const
Definition: message.h:399
initialize_goto_model.h
banner_string
std::string banner_string(const std::string &front_end, const std::string &version)
Definition: parse_options.cpp:174
configt::ansi_ct::preprocessor
preprocessort preprocessor
Definition: config.h:248
syntactic_diff.h
show_properties.h
cmdlinet::get_value
std::string get_value(char option) const
Definition: cmdline.cpp:48
HELP_SHOW_PROPERTIES
#define HELP_SHOW_PROPERTIES
Definition: show_properties.h:30
configt::ansi_ct::arch
irep_idt arch
Definition: config.h:206
show_goto_functions
void show_goto_functions(const namespacet &ns, ui_message_handlert &ui_message_handler, const goto_functionst &goto_functions, bool list_only)
Definition: show_goto_functions.cpp:20
PARSE_OPTIONS_GOTO_CHECK
#define PARSE_OPTIONS_GOTO_CHECK(cmdline, options)
Definition: goto_check_c.h:74
parse_cover_options
void parse_cover_options(const cmdlinet &cmdline, optionst &options)
Parses coverage-related command line options.
Definition: cover.cpp:148
goto_diff_parse_options.h
impact_modet::FORWARD
@ FORWARD
CPROVER_EXIT_INCORRECT_TASK
#define CPROVER_EXIT_INCORRECT_TASK
The command line is correctly structured but cannot be carried out due to missing files,...
Definition: exit_codes.h:49
configt::ansi_ct::preprocessort::GCC
@ GCC
config
configt config
Definition: config.cpp:25
gcc_versiont
Definition: gcc_version.h:19
parse_options_baset::log
messaget log
Definition: parse_options.h:46
goto_modelt::goto_functions
goto_functionst goto_functions
GOTO functions.
Definition: goto_model.h:33
goto_diff_parse_optionst::goto_diff_parse_optionst
goto_diff_parse_optionst(int argc, const char **argv)
Definition: goto_diff_parse_options.cpp:41
cprover_c_library_factory
void cprover_c_library_factory(const std::set< irep_idt > &functions, symbol_tablet &symbol_table, message_handlert &message_handler)
Definition: cprover_library.cpp:98
configt::set
bool set(const cmdlinet &cmdline)
Definition: config.cpp:798
exit_codes.h
goto_functionst::update
void update()
Definition: goto_functions.h:83
remove_asm
void remove_asm(goto_functionst &goto_functions, symbol_tablet &symbol_table)
Replaces inline assembly instructions in the goto program (i.e., instructions of kind OTHER with a co...
Definition: remove_asm.cpp:512
change_impact.h
config.h
loop_ids.h
CPROVER_EXIT_INTERNAL_ERROR
#define CPROVER_EXIT_INTERNAL_ERROR
An error has been encountered during processing the requested analysis.
Definition: exit_codes.h:45
initialize_goto_model
goto_modelt initialize_goto_model(const std::vector< std::string > &files, message_handlert &message_handler, const optionst &options)
Definition: initialize_goto_model.cpp:178
goto_diff_parse_optionst::get_command_line_options
void get_command_line_options(optionst &options)
Definition: goto_diff_parse_options.cpp:50
CPROVER_EXIT_SUCCESS
#define CPROVER_EXIT_SUCCESS
Success indicates the required analysis has been performed without error.
Definition: exit_codes.h:16
messaget::eval_verbosity
static unsigned eval_verbosity(const std::string &user_input, const message_levelt default_verbosity, message_handlert &dest)
Parse a (user-)provided string as a verbosity level and set it as the verbosity of dest.
Definition: message.cpp:105
remove_skip.h
parse_options_baset::cmdline
cmdlinet cmdline
Definition: parse_options.h:28
goto_modelt::symbol_table
symbol_tablet symbol_table
Symbol table.
Definition: goto_model.h:30
align_center_with_border
std::string align_center_with_border(const std::string &text)
Utility for displaying help centered messages borderered by "* *".
Definition: parse_options.cpp:161
cprover_library.h
process_goto_program.h
HELP_TIMESTAMP
#define HELP_TIMESTAMP
Definition: timestamper.h:14
HELP_FLUSH
#define HELP_FLUSH
Definition: ui_message.h:108
cprover_cpp_library_factory
void cprover_cpp_library_factory(const std::set< irep_idt > &functions, symbol_tablet &symbol_table, message_handlert &message_handler)
Definition: cprover_library.cpp:38