Skip to content

Commit 28c076b

Browse files
authored
Merge pull request #2013 from LAJW/lajw/java-no-load-class
Add --java-no-load-class option
2 parents e6a9127 + 42ecfa2 commit 28c076b

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ class java_bytecode_convert_classt:public messaget
3737
message_handlert &_message_handler,
3838
size_t _max_array_length,
3939
method_bytecodet &method_bytecode,
40-
java_string_library_preprocesst &_string_preprocess)
40+
java_string_library_preprocesst &_string_preprocess,
41+
const std::unordered_set<std::string> &no_load_classes)
4142
: messaget(_message_handler),
4243
symbol_table(_symbol_table),
4344
max_array_length(_max_array_length),
4445
method_bytecode(method_bytecode),
45-
string_preprocess(_string_preprocess)
46+
string_preprocess(_string_preprocess),
47+
no_load_classes(no_load_classes)
4648
{
4749
}
4850

@@ -51,7 +53,9 @@ class java_bytecode_convert_classt:public messaget
5153
// add array types to the symbol table
5254
add_array_types(symbol_table);
5355

54-
bool loading_success=parse_tree.loading_successful;
56+
const bool loading_success =
57+
parse_tree.loading_successful &&
58+
!no_load_classes.count(id2string(parse_tree.parsed_class.name));
5559
if(loading_success)
5660
convert(parse_tree.parsed_class);
5761

@@ -81,6 +85,7 @@ class java_bytecode_convert_classt:public messaget
8185

8286
// see definition below for more info
8387
static void add_array_types(symbol_tablet &symbol_table);
88+
std::unordered_set<std::string> no_load_classes;
8489
};
8590

8691
/// Auxiliary function to extract the generic superclass reference from the
@@ -667,14 +672,16 @@ bool java_bytecode_convert_class(
667672
message_handlert &message_handler,
668673
size_t max_array_length,
669674
method_bytecodet &method_bytecode,
670-
java_string_library_preprocesst &string_preprocess)
675+
java_string_library_preprocesst &string_preprocess,
676+
const std::unordered_set<std::string> &no_load_classes)
671677
{
672678
java_bytecode_convert_classt java_bytecode_convert_class(
673679
symbol_table,
674680
message_handler,
675681
max_array_length,
676682
method_bytecode,
677-
string_preprocess);
683+
string_preprocess,
684+
no_load_classes);
678685

679686
try
680687
{

src/java_bytecode/java_bytecode_convert_class.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#ifndef CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_CONVERT_CLASS_H
1313
#define CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_CONVERT_CLASS_H
1414

15+
#include <unordered_set>
1516
#include <util/symbol_table.h>
1617
#include <util/message.h>
1718

@@ -25,7 +26,8 @@ bool java_bytecode_convert_class(
2526
message_handlert &message_handler,
2627
size_t max_array_length,
2728
method_bytecodet &,
28-
java_string_library_preprocesst &string_preprocess);
29+
java_string_library_preprocesst &string_preprocess,
30+
const std::unordered_set<std::string> &no_load_classes);
2931

3032
void mark_java_implicitly_generic_class_type(
3133
const irep_idt &class_name,

src/java_bytecode/java_bytecode_language.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ void java_bytecode_languaget::get_language_options(const cmdlinet &cmd)
7979
java_load_classes.insert(
8080
java_load_classes.end(), values.begin(), values.end());
8181
}
82+
if(cmd.isset("java-no-load-class"))
83+
{
84+
const auto &values = cmd.get_values("java-no-load-class");
85+
no_load_classes = {values.begin(), values.end()};
86+
}
8287

8388
const std::list<std::string> &extra_entry_points=
8489
cmd.get_values("lazy-methods-extra-entry-point");
@@ -576,13 +581,15 @@ bool java_bytecode_languaget::typecheck(
576581
java_class_loader.class_map.find("java.lang.Object");
577582
if(it!=java_class_loader.class_map.end())
578583
{
579-
if(java_bytecode_convert_class(
580-
it->second,
581-
symbol_table,
582-
get_message_handler(),
583-
max_user_array_length,
584-
method_bytecode,
585-
string_preprocess))
584+
if(
585+
java_bytecode_convert_class(
586+
it->second,
587+
symbol_table,
588+
get_message_handler(),
589+
max_user_array_length,
590+
method_bytecode,
591+
string_preprocess,
592+
no_load_classes))
586593
{
587594
return true;
588595
}
@@ -605,7 +612,8 @@ bool java_bytecode_languaget::typecheck(
605612
get_message_handler(),
606613
max_user_array_length,
607614
method_bytecode,
608-
string_preprocess))
615+
string_preprocess,
616+
no_load_classes))
609617
{
610618
return true;
611619
}

src/java_bytecode/java_bytecode_language.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ Author: Daniel Kroening, [email protected]
3737
"(java-cp-include-files):" \
3838
"(lazy-methods)" \
3939
"(lazy-methods-extra-entry-point):" \
40-
"(java-load-class):"
40+
"(java-load-class):" \
41+
"(java-no-load-class):"
4142

4243
#define JAVA_BYTECODE_LANGUAGE_OPTIONS_HELP /*NOLINT*/ \
4344
" --no-core-models don't load internally provided models for core classes in\n"/* NOLINT(*) */ \
@@ -181,6 +182,8 @@ class java_bytecode_languaget:public languaget
181182
synthetic_methods_mapt synthetic_methods;
182183
stub_global_initializer_factoryt stub_global_initializer_factory;
183184
class_hierarchyt class_hierarchy;
185+
// List of classes to never load
186+
std::unordered_set<std::string> no_load_classes;
184187
};
185188

186189
std::unique_ptr<languaget> new_java_bytecode_language();

0 commit comments

Comments
 (0)