Skip to content

Commit 45a0260

Browse files
romainbrenguierJoel Allred
authored and
Joel Allred
committed
Merging string and character preprocess as one argument of bytecode conversion
Removing add_string_type declaration, not used anymore
1 parent af2fd46 commit 45a0260

8 files changed

+37
-93
lines changed

src/java_bytecode/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ SRC = bytecode_info.cpp \
2020
java_object_factory.cpp \
2121
java_pointer_casts.cpp \
2222
java_root_class.cpp \
23+
java_string_library_preprocess.cpp \
2324
java_types.cpp \
2425
java_utils.cpp \
2526
# Empty last line

src/java_bytecode/java_bytecode_convert_class.cpp

+9-81
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ class java_bytecode_convert_classt:public messaget
3131
size_t _max_array_length,
3232
lazy_methodst& _lazy_methods,
3333
lazy_methods_modet _lazy_methods_mode,
34-
bool _string_refinement_enabled):
34+
const java_string_library_preprocesst &_string_preprocess):
3535
messaget(_message_handler),
3636
symbol_table(_symbol_table),
3737
max_array_length(_max_array_length),
3838
lazy_methods(_lazy_methods),
3939
lazy_methods_mode(_lazy_methods_mode),
40-
string_refinement_enabled(_string_refinement_enabled)
40+
string_preprocess(_string_preprocess)
4141
{
4242
}
4343

@@ -47,18 +47,10 @@ class java_bytecode_convert_classt:public messaget
4747

4848
if(parse_tree.loading_successful)
4949
convert(parse_tree.parsed_class);
50-
else if(string_refinement_enabled &&
51-
parse_tree.parsed_class.name=="java.lang.String")
52-
add_string_type("java.lang.String");
53-
else if(string_refinement_enabled &&
54-
parse_tree.parsed_class.name=="java.lang.StringBuilder")
55-
add_string_type("java.lang.StringBuilder");
56-
else if(string_refinement_enabled &&
57-
parse_tree.parsed_class.name=="java.lang.CharSequence")
58-
add_string_type("java.lang.CharSequence");
59-
else if(string_refinement_enabled &&
60-
parse_tree.parsed_class.name=="java.lang.StringBuffer")
61-
add_string_type("java.lang.StringBuffer");
50+
else if(string_preprocess.is_known_string_type(
51+
parse_tree.parsed_class.name))
52+
string_preprocess.add_string_type(
53+
parse_tree.parsed_class.name, symbol_table);
6254
else
6355
generate_class_stub(parse_tree.parsed_class.name);
6456
}
@@ -71,15 +63,14 @@ class java_bytecode_convert_classt:public messaget
7163
const size_t max_array_length;
7264
lazy_methodst &lazy_methods;
7365
lazy_methods_modet lazy_methods_mode;
74-
bool string_refinement_enabled;
66+
java_string_library_preprocesst string_preprocess;
7567

7668
// conversion
7769
void convert(const classt &c);
7870
void convert(symbolt &class_symbol, const fieldt &f);
7971

8072
void generate_class_stub(const irep_idt &class_name);
8173
void add_array_types();
82-
void add_string_type(const irep_idt &class_name);
8374
};
8475

8576
/*******************************************************************\
@@ -486,15 +477,15 @@ bool java_bytecode_convert_class(
486477
size_t max_array_length,
487478
lazy_methodst &lazy_methods,
488479
lazy_methods_modet lazy_methods_mode,
489-
bool string_refinement_enabled)
480+
const java_string_library_preprocesst &string_preprocess)
490481
{
491482
java_bytecode_convert_classt java_bytecode_convert_class(
492483
symbol_table,
493484
message_handler,
494485
max_array_length,
495486
lazy_methods,
496487
lazy_methods_mode,
497-
string_refinement_enabled);
488+
string_preprocess);
498489

499490
try
500491
{
@@ -518,66 +509,3 @@ bool java_bytecode_convert_class(
518509

519510
return true;
520511
}
521-
522-
/*******************************************************************\
523-
524-
Function: java_bytecode_convert_classt::add_string_type
525-
526-
Inputs: a name for the class such as "java.lang.String"
527-
528-
Purpose: Implements the java.lang.String type in the case that
529-
we provide an internal implementation.
530-
531-
\*******************************************************************/
532-
533-
void java_bytecode_convert_classt::add_string_type(const irep_idt &class_name)
534-
{
535-
class_typet string_type;
536-
string_type.set_tag(class_name);
537-
string_type.components().resize(3);
538-
string_type.components()[0].set_name("@java.lang.Object");
539-
string_type.components()[0].set_pretty_name("@java.lang.Object");
540-
string_type.components()[0].type()=symbol_typet("java::java.lang.Object");
541-
string_type.components()[1].set_name("length");
542-
string_type.components()[1].set_pretty_name("length");
543-
string_type.components()[1].type()=java_int_type();
544-
string_type.components()[2].set_name("data");
545-
string_type.components()[2].set_pretty_name("data");
546-
// Use a pointer-to-unbounded-array instead of a pointer-to-char.
547-
// Saves some casting in the string refinement algorithm but may
548-
// be unnecessary.
549-
string_type.components()[2].type()=pointer_typet(
550-
array_typet(java_char_type(), infinity_exprt(java_int_type())));
551-
string_type.add_base(symbol_typet("java::java.lang.Object"));
552-
553-
symbolt string_symbol;
554-
string_symbol.name="java::"+id2string(class_name);
555-
string_symbol.base_name=id2string(class_name);
556-
string_symbol.type=string_type;
557-
string_symbol.is_type=true;
558-
559-
symbol_table.add(string_symbol);
560-
561-
// Also add a stub of `String.equals` so that remove-virtual-functions
562-
// generates a check for Object.equals vs. String.equals.
563-
// No need to fill it in, as pass_preprocess will replace the calls again.
564-
symbolt string_equals_symbol;
565-
string_equals_symbol.name=
566-
"java::java.lang.String.equals:(Ljava/lang/Object;)Z";
567-
string_equals_symbol.base_name=id2string(class_name)+".equals";
568-
string_equals_symbol.pretty_name=id2string(class_name)+".equals";
569-
string_equals_symbol.mode=ID_java;
570-
571-
code_typet string_equals_type;
572-
string_equals_type.return_type()=java_boolean_type();
573-
code_typet::parametert thisparam;
574-
thisparam.set_this();
575-
thisparam.type()=pointer_typet(symbol_typet(string_symbol.name));
576-
code_typet::parametert otherparam;
577-
otherparam.type()=pointer_typet(symbol_typet("java::java.lang.Object"));
578-
string_equals_type.parameters().push_back(thisparam);
579-
string_equals_type.parameters().push_back(otherparam);
580-
string_equals_symbol.type=std::move(string_equals_type);
581-
582-
symbol_table.add(string_equals_symbol);
583-
}

src/java_bytecode/java_bytecode_convert_class.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ bool java_bytecode_convert_class(
2222
size_t max_array_length,
2323
lazy_methodst &,
2424
lazy_methods_modet,
25-
bool string_refinement_enabled);
25+
const java_string_library_preprocesst &string_preprocess);
2626

2727
#endif // CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_CONVERT_CLASS_H

src/java_bytecode/java_bytecode_convert_method.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1556,8 +1556,8 @@ codet java_bytecode_convert_methodt::convert_instructions(
15561556
symbol.name,
15571557
symbol_table);
15581558

1559-
// functions of the String libraries can have code
1560-
// generated for them
1559+
// The string refinement module may provide a definition for this
1560+
// function.
15611561
symbol.value=string_preprocess.code_for_function(
15621562
id, to_code_type(symbol.type), loc, symbol_table);
15631563

src/java_bytecode/java_bytecode_convert_method.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#include <util/symbol_table.h>
1313
#include <util/message.h>
1414
#include <util/safe_pointer.h>
15+
#include "java_string_library_preprocess.h"
1516

1617
#include "java_bytecode_parse_tree.h"
1718
#include "ci_lazy_methods.h"
@@ -24,22 +25,25 @@ void java_bytecode_convert_method(
2425
symbol_tablet &symbol_table,
2526
message_handlert &message_handler,
2627
size_t max_array_length,
27-
safe_pointer<ci_lazy_methodst> lazy_methods);
28+
safe_pointer<ci_lazy_methodst> lazy_methods,
29+
const java_string_library_preprocesst &string_preprocess);
2830

2931
inline void java_bytecode_convert_method(
3032
const symbolt &class_symbol,
3133
const java_bytecode_parse_treet::methodt &method,
3234
symbol_tablet &symbol_table,
3335
message_handlert &message_handler,
34-
size_t max_array_length)
36+
size_t max_array_length,
37+
const java_string_library_preprocesst &string_preprocess)
3538
{
3639
java_bytecode_convert_method(
3740
class_symbol,
3841
method,
3942
symbol_table,
4043
message_handler,
4144
max_array_length,
42-
safe_pointer<ci_lazy_methodst>::create_null());
45+
safe_pointer<ci_lazy_methodst>::create_null(),
46+
string_preprocess);
4347
}
4448

4549
void java_bytecode_convert_method_lazy(

src/java_bytecode/java_bytecode_convert_method_class.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ class java_bytecode_convert_methodt:public messaget
3232
symbol_tablet &_symbol_table,
3333
message_handlert &_message_handler,
3434
size_t _max_array_length,
35-
safe_pointer<ci_lazy_methodst> _lazy_methods):
35+
safe_pointer<ci_lazy_methodst> _lazy_methods,
36+
const java_string_library_preprocesst &_string_preprocess):
3637
messaget(_message_handler),
3738
symbol_table(_symbol_table),
3839
max_array_length(_max_array_length),
39-
lazy_methods(_lazy_methods)
40+
lazy_methods(_lazy_methods),
41+
string_preprocess(_string_preprocess)
4042
{
4143
}
4244

@@ -59,6 +61,7 @@ class java_bytecode_convert_methodt:public messaget
5961
irep_idt method_id;
6062
irep_idt current_method;
6163
typet method_return_type;
64+
java_string_library_preprocesst string_preprocess;
6265

6366
public:
6467
struct holet

src/java_bytecode/java_bytecode_language.cpp

+10-4
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,9 @@ bool java_bytecode_languaget::typecheck(
511511
symbol_tablet &symbol_table,
512512
const std::string &module)
513513
{
514+
if(string_refinement_enabled)
515+
string_preprocess.initialize_conversion_table();
516+
514517
// first convert all
515518
for(java_class_loadert::class_mapt::const_iterator
516519
c_it=java_class_loader.class_map.begin();
@@ -529,7 +532,7 @@ bool java_bytecode_languaget::typecheck(
529532
max_user_array_length,
530533
lazy_methods,
531534
lazy_methods_mode,
532-
string_refinement_enabled))
535+
string_preprocess))
533536
return true;
534537
}
535538

@@ -551,7 +554,8 @@ bool java_bytecode_languaget::typecheck(
551554
*method_sig.second.second,
552555
symbol_table,
553556
get_message_handler(),
554-
max_user_array_length);
557+
max_user_array_length,
558+
string_preprocess);
555559
}
556560
}
557561
// Otherwise our caller is in charge of elaborating methods on demand.
@@ -678,7 +682,8 @@ bool java_bytecode_languaget::do_ci_lazy_method_conversion(
678682
symbol_table,
679683
get_message_handler(),
680684
max_user_array_length,
681-
safe_pointer<ci_lazy_methodst>::create_non_null(&lazy_methods));
685+
safe_pointer<ci_lazy_methodst>::create_non_null(&lazy_methods),
686+
string_preprocess);
682687
gather_virtual_callsites(
683688
symbol_table.lookup(mname).value,
684689
virtual_callsites);
@@ -788,7 +793,8 @@ void java_bytecode_languaget::convert_lazy_method(
788793
*lazy_method_entry.second,
789794
symtab,
790795
get_message_handler(),
791-
max_user_array_length);
796+
max_user_array_length,
797+
string_preprocess);
792798
}
793799

794800
/*******************************************************************\

src/java_bytecode/java_bytecode_language.h

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Author: Daniel Kroening, [email protected]
1313
#include <util/cmdline.h>
1414

1515
#include "java_class_loader.h"
16+
#include "java_string_library_preprocess.h"
1617

1718
#define MAX_NONDET_ARRAY_LENGTH_DEFAULT 5
1819

@@ -99,6 +100,7 @@ class java_bytecode_languaget:public languaget
99100
lazy_methodst lazy_methods;
100101
lazy_methods_modet lazy_methods_mode;
101102
bool string_refinement_enabled;
103+
java_string_library_preprocesst string_preprocess;
102104
std::string java_cp_include_files;
103105
};
104106

0 commit comments

Comments
 (0)