Skip to content

Commit f1489fd

Browse files
Merge pull request #2911 from peterschrammel/parse-object-factory-params
Separate parsing of language options from languaget
2 parents faf9746 + 5b467d1 commit f1489fd

27 files changed

+259
-124
lines changed

jbmc/src/janalyzer/janalyzer_parse_options.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ void janalyzer_parse_optionst::get_command_line_options(optionst &options)
7777
exit(CPROVER_EXIT_USAGE_ERROR);
7878
}
7979

80+
parse_java_language_options(cmdline, options);
81+
8082
// check assertions
8183
if(cmdline.isset("no-assertions"))
8284
options.set_option("assertions", false);
@@ -350,7 +352,7 @@ int janalyzer_parse_optionst::doit()
350352

351353
try
352354
{
353-
goto_model = initialize_goto_model(cmdline, get_message_handler());
355+
goto_model = initialize_goto_model(cmdline, get_message_handler(), options);
354356
}
355357

356358
catch(const char *e)

jbmc/src/java_bytecode/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ SRC = bytecode_info.cpp \
3535
java_types.cpp \
3636
java_utils.cpp \
3737
load_method_by_regex.cpp \
38+
object_factory_parameters.cpp \
3839
mz_zip_archive.cpp \
3940
remove_exceptions.cpp \
4041
remove_instanceof.cpp \

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 79 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ Author: Daniel Kroening, [email protected]
1010

1111
#include <string>
1212

13-
#include <util/symbol_table.h>
14-
#include <util/suffix.h>
15-
#include <util/config.h>
1613
#include <util/cmdline.h>
14+
#include <util/config.h>
1715
#include <util/expr_iterator.h>
16+
#include <util/invariant.h>
1817
#include <util/journalling_symbol_table.h>
18+
#include <util/options.h>
1919
#include <util/string2int.h>
20-
#include <util/invariant.h>
20+
#include <util/suffix.h>
21+
#include <util/symbol_table.h>
22+
2123
#include <json/json_parser.h>
2224

2325
#include <goto-programs/class_hierarchy.h>
@@ -39,82 +41,108 @@ Author: Daniel Kroening, [email protected]
3941
#include "expr2java.h"
4042
#include "load_method_by_regex.h"
4143

42-
/// Consume options that are java bytecode specific.
43-
/// \param Command:line options
44-
/// \return None
45-
void java_bytecode_languaget::get_language_options(const cmdlinet &cmd)
44+
/// Parse options that are java bytecode specific.
45+
/// \param cmd Command line
46+
/// \param [out] options The options object that will be updated.
47+
void parse_java_language_options(const cmdlinet &cmd, optionst &options)
4648
{
47-
assume_inputs_non_null=cmd.isset("java-assume-inputs-non-null");
48-
string_refinement_enabled = !cmd.isset("no-refine-strings");
49-
throw_runtime_exceptions = cmd.isset("throw-runtime-exceptions");
50-
assert_uncaught_exceptions = !cmd.isset("disable-uncaught-exception-check");
51-
throw_assertion_error = cmd.isset("throw-assertion-error");
52-
threading_support = cmd.isset("java-threading");
53-
54-
if(cmd.isset("max-nondet-array-length"))
49+
options.set_option(
50+
"java-assume-inputs-non-null", cmd.isset("java-assume-inputs-non-null"));
51+
options.set_option(
52+
"throw-runtime-exceptions", cmd.isset("throw-runtime-exceptions"));
53+
options.set_option(
54+
"uncaught-exception-check", !cmd.isset("disable-uncaught-exception-check"));
55+
options.set_option(
56+
"throw-assertion-error", cmd.isset("throw-assertion-error"));
57+
options.set_option("java-threading", cmd.isset("java-threading"));
58+
59+
if(cmd.isset("java-max-vla-length"))
5560
{
56-
object_factory_parameters.max_nondet_array_length =
57-
safe_string2size_t(cmd.get_value("max-nondet-array-length"));
61+
options.set_option(
62+
"java-max-vla-length", cmd.get_value("java-max-vla-length"));
5863
}
5964

60-
if(cmd.isset("max-nondet-tree-depth"))
65+
options.set_option(
66+
"symex-driven-lazy-loading", cmd.isset("symex-driven-lazy-loading"));
67+
68+
if(cmd.isset("java-load-class"))
69+
options.set_option("java-load-class", cmd.get_values("java-load-class"));
70+
71+
if(cmd.isset("java-no-load-class"))
6172
{
62-
object_factory_parameters.max_nondet_tree_depth =
63-
safe_string2size_t(cmd.get_value("max-nondet-tree-depth"));
73+
options.set_option(
74+
"java-no-load-class", cmd.get_values("java-no-load-class"));
6475
}
65-
66-
if(cmd.isset("max-nondet-string-length"))
76+
if(cmd.isset("lazy-methods-extra-entry-point"))
77+
{
78+
options.set_option(
79+
"lazy-methods-extra-entry-point",
80+
cmd.get_values("lazy-methods-extra-entry-point"));
81+
}
82+
if(cmd.isset("java-cp-include-files"))
6783
{
68-
object_factory_parameters.max_nondet_string_length =
69-
safe_string2size_t(cmd.get_value("max-nondet-string-length"));
84+
options.set_option(
85+
"java-cp-include-files", cmd.get_value("java-cp-include-files"));
7086
}
71-
if(cmd.isset("string-non-empty"))
72-
object_factory_parameters.min_nondet_string_length = 1;
87+
}
7388

74-
object_factory_parameters.string_printable = cmd.isset("string-printable");
75-
if(cmd.isset("java-max-vla-length"))
76-
max_user_array_length =
77-
safe_string2size_t(cmd.get_value("java-max-vla-length"));
78-
if(cmd.isset("symex-driven-lazy-loading"))
89+
/// Consume options that are java bytecode specific.
90+
void java_bytecode_languaget::set_language_options(const optionst &options)
91+
{
92+
object_factory_parameters.set(options);
93+
94+
assume_inputs_non_null =
95+
options.get_bool_option("java-assume-inputs-non-null");
96+
string_refinement_enabled = options.get_bool_option("refine-strings");
97+
throw_runtime_exceptions =
98+
options.get_bool_option("throw-runtime-exceptions");
99+
assert_uncaught_exceptions =
100+
options.get_bool_option("uncaught-exception-check");
101+
throw_assertion_error = options.get_bool_option("throw-assertion-error");
102+
threading_support = options.get_bool_option("java-threading");
103+
max_user_array_length =
104+
options.get_unsigned_int_option("java-max-vla-length");
105+
106+
if(options.get_bool_option("symex-driven-lazy-loading"))
79107
lazy_methods_mode=LAZY_METHODS_MODE_EXTERNAL_DRIVER;
80-
else if(!cmd.isset("no-lazy-methods"))
108+
else if(options.get_bool_option("lazy-methods"))
81109
lazy_methods_mode=LAZY_METHODS_MODE_CONTEXT_INSENSITIVE;
82110
else
83111
lazy_methods_mode=LAZY_METHODS_MODE_EAGER;
84112

85113
if(throw_runtime_exceptions)
86114
{
87115
java_load_classes.insert(
88-
java_load_classes.end(),
89-
exception_needed_classes.begin(),
90-
exception_needed_classes.end());
116+
java_load_classes.end(),
117+
exception_needed_classes.begin(),
118+
exception_needed_classes.end());
91119
}
92-
if(cmd.isset("java-load-class"))
120+
121+
if(options.is_set("java-load-class"))
93122
{
94-
const auto &values = cmd.get_values("java-load-class");
123+
const auto &load_values = options.get_list_option("java-load-class");
95124
java_load_classes.insert(
96-
java_load_classes.end(), values.begin(), values.end());
125+
java_load_classes.end(), load_values.begin(), load_values.end());
97126
}
98-
if(cmd.isset("java-no-load-class"))
127+
if(options.is_set("java-no-load-class"))
99128
{
100-
const auto &values = cmd.get_values("java-no-load-class");
101-
no_load_classes = {values.begin(), values.end()};
129+
const auto &no_load_values = options.get_list_option("java-no-load-class");
130+
no_load_classes = {no_load_values.begin(), no_load_values.end()};
102131
}
103-
104-
const std::list<std::string> &extra_entry_points=
105-
cmd.get_values("lazy-methods-extra-entry-point");
132+
const std::list<std::string> &extra_entry_points =
133+
options.get_list_option("lazy-methods-extra-entry-point");
106134
std::transform(
107135
extra_entry_points.begin(),
108136
extra_entry_points.end(),
109137
std::back_inserter(extra_methods),
110138
build_load_method_by_regex);
111-
const auto &new_points = build_extra_entry_points(cmd);
139+
const auto &new_points = build_extra_entry_points(options);
112140
extra_methods.insert(
113141
extra_methods.end(), new_points.begin(), new_points.end());
114142

115-
if(cmd.isset("java-cp-include-files"))
143+
java_cp_include_files = options.get_option("java-cp-include-files");
144+
if(!java_cp_include_files.empty())
116145
{
117-
java_cp_include_files=cmd.get_value("java-cp-include-files");
118146
// load file list from JSON file
119147
if(java_cp_include_files[0]=='@')
120148
{
@@ -129,7 +157,7 @@ void java_bytecode_languaget::get_language_options(const cmdlinet &cmd)
129157
throw "the JSON file has a wrong format";
130158
jsont include_files=json_cp_config["jar"];
131159
if(!include_files.is_array())
132-
throw "the JSON file has a wrong format";
160+
throw "the JSON file has a wrong format";
133161

134162
// add jars from JSON config file to classpath
135163
for(const jsont &file_entry : include_files.array)
@@ -145,7 +173,7 @@ void java_bytecode_languaget::get_language_options(const cmdlinet &cmd)
145173
else
146174
java_cp_include_files=".*";
147175

148-
nondet_static = cmd.isset("nondet-static");
176+
nondet_static = options.get_bool_option("nondet-static");
149177

150178
language_options_initialized=true;
151179
}
@@ -1219,8 +1247,7 @@ java_bytecode_languaget::~java_bytecode_languaget()
12191247
/// specifying extra entry points. To provide a regex entry point, the command
12201248
/// line option `--lazy-methods-extra-entry-point` can be used directly.
12211249
std::vector<load_extra_methodst>
1222-
java_bytecode_languaget::build_extra_entry_points(
1223-
const cmdlinet &command_line) const
1250+
java_bytecode_languaget::build_extra_entry_points(const optionst &options) const
12241251
{
12251252
return {};
12261253
}

jbmc/src/java_bytecode/java_bytecode_language.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ enum lazy_methods_modet
8888
class java_bytecode_languaget:public languaget
8989
{
9090
public:
91-
virtual void get_language_options(const cmdlinet &) override;
91+
void set_language_options(const optionst &) override;
9292

9393
virtual bool preprocess(
9494
std::istream &instream,
@@ -196,7 +196,7 @@ class java_bytecode_languaget:public languaget
196196

197197
private:
198198
virtual std::vector<load_extra_methodst>
199-
build_extra_entry_points(const cmdlinet &command_line) const;
199+
build_extra_entry_points(const optionst &) const;
200200
const std::unique_ptr<const select_pointer_typet> pointer_type_selector;
201201

202202
/// Maps synthetic method names on to the particular type of synthetic method
@@ -213,4 +213,6 @@ class java_bytecode_languaget:public languaget
213213

214214
std::unique_ptr<languaget> new_java_bytecode_language();
215215

216+
void parse_java_language_options(const cmdlinet &cmd, optionst &options);
217+
216218
#endif // CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_LANGUAGE_H

jbmc/src/java_bytecode/java_class_loader_limit.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Author: Daniel Kroening, [email protected]
1313

1414
#include <json/json_parser.h>
1515

16+
#include <util/invariant.h>
17+
1618
/// Initializes class with either regex matcher or match set. If the string
1719
/// starts with an `@` it is treated as a path to a JSON file. Otherwise, it is
1820
/// treated as a regex.
@@ -48,8 +50,7 @@ Author: Daniel Kroening, [email protected]
4850
void java_class_loader_limitt::setup_class_load_limit(
4951
const std::string &java_cp_include_files)
5052
{
51-
if(java_cp_include_files.empty())
52-
throw "class regexp cannot be empty, `get_language_options` not called?";
53+
PRECONDITION(!java_cp_include_files.empty());
5354

5455
// '@' signals file reading with list of class files to load
5556
use_regex_match = java_cp_include_files[0] != '@';
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*******************************************************************\
2+
3+
Module: Java Object Factory
4+
5+
Author: Diffblue Ltd
6+
7+
\*******************************************************************/
8+
9+
#include "object_factory_parameters.h"
10+
11+
#include <util/cmdline.h>
12+
#include <util/options.h>
13+
14+
void object_factory_parameterst::set(const optionst &options)
15+
{
16+
if(options.is_set("max-nondet-array-length"))
17+
{
18+
max_nondet_array_length =
19+
options.get_unsigned_int_option("max-nondet-array-length");
20+
}
21+
if(options.is_set("max-nondet-tree-depth"))
22+
{
23+
max_nondet_tree_depth =
24+
options.get_unsigned_int_option("max-nondet-tree-depth");
25+
}
26+
if(options.is_set("max-nondet-string-length"))
27+
{
28+
max_nondet_string_length =
29+
options.get_unsigned_int_option("max-nondet-string-length");
30+
}
31+
if(options.is_set("string-printable"))
32+
{
33+
string_printable = options.get_bool_option("string-printable");
34+
}
35+
if(options.is_set("min-nondet-string-length"))
36+
{
37+
min_nondet_string_length =
38+
options.get_unsigned_int_option("min-nondet-string-length");
39+
}
40+
}
41+
42+
/// Parse the object factory parameters from a given command line
43+
/// \param cmdline Command line
44+
/// \param [out] options The options object that will be updated.
45+
void parse_object_factory_options(const cmdlinet &cmdline, optionst &options)
46+
{
47+
if(cmdline.isset("max-nondet-array-length"))
48+
{
49+
options.set_option(
50+
"max-nondet-array-length", cmdline.get_value("max-nondet-array-length"));
51+
}
52+
if(cmdline.isset("max-nondet-tree-depth"))
53+
{
54+
options.set_option(
55+
"max-nondet-tree-depth", cmdline.get_value("max-nondet-tree-depth"));
56+
}
57+
if(cmdline.isset("max-nondet-string-length"))
58+
{
59+
options.set_option(
60+
"max-nondet-string-length",
61+
cmdline.get_value("max-nondet-string-length"));
62+
}
63+
if(cmdline.isset("string-printable"))
64+
{
65+
options.set_option("string-printable", cmdline.isset("string-printable"));
66+
}
67+
if(cmdline.isset("string-non-empty"))
68+
{
69+
options.set_option("min-nondet-string-length", 1);
70+
}
71+
}

jbmc/src/java_bytecode/object_factory_parameters.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ Author: Daniel Kroening, [email protected]
1414

1515
#include <util/irep.h>
1616

17+
class cmdlinet;
18+
class optionst;
19+
1720
#define MAX_NONDET_ARRAY_LENGTH_DEFAULT 5
1821
#define MAX_NONDET_STRING_LENGTH \
1922
static_cast<std::size_t>(std::numeric_limits<std::int32_t>::max())
@@ -56,6 +59,11 @@ struct object_factory_parameterst final
5659

5760
/// Function id, used as a prefix for identifiers of temporaries
5861
irep_idt function_id;
62+
63+
/// Assigns the parameters from given options
64+
void set(const optionst &);
5965
};
6066

67+
void parse_object_factory_options(const cmdlinet &, optionst &);
68+
6169
#endif

0 commit comments

Comments
 (0)