Skip to content

Commit fbe8be8

Browse files
author
Daniel Kroening
authored
Merge pull request #1026 from romainbrenguier/bugfix/string-to-char-array#443
Improvements in the code for String.toCharArray in String preprocessing
2 parents 70a9806 + 0619f05 commit fbe8be8

File tree

4 files changed

+49
-21
lines changed

4 files changed

+49
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
CORE
22
test_char_array.class
33
--refine-strings
4-
^EXIT=0$
4+
^EXIT=10$
55
^SIGNAL=0$
6-
^VERIFICATION SUCCESSFUL$
6+
.*assertion.* test_char_array.java line 9 .* SUCCESS$
7+
.*assertion.* test_char_array.java line 10 .* SUCCESS$
8+
.*assertion.* test_char_array.java line 11 .* SUCCESS$
9+
.*assertion.* test_char_array.java line 13 .* FAILURE$
10+
.*assertion.* test_char_array.java line 15 .* FAILURE$
11+
.*assertion.* test_char_array.java line 17 .* FAILURE$
12+
^VERIFICATION FAILED$
713
--
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
public class test_char_array
22
{
3-
public static void main(/*String[] argv*/)
3+
public static void main(int i)
44
{
55
String s = "abc";
66
char [] str = s.toCharArray();
@@ -9,5 +9,11 @@ public static void main(/*String[] argv*/)
99
assert(str.length == 3);
1010
assert(a == 'a');
1111
assert(c == 'c');
12+
if(i==0)
13+
assert(str.length != 3);
14+
if(i==2)
15+
assert(a != 'a');
16+
if(i==3)
17+
assert(c != 'c');
1218
}
1319
}

src/java_bytecode/java_string_library_preprocess.cpp

+34-18
Original file line numberDiff line numberDiff line change
@@ -1138,12 +1138,20 @@ codet java_string_library_preprocesst::make_assign_function_from_call(
11381138
}
11391139

11401140
/// Used to provide our own implementation of the
1141-
/// java.lang.String.toCharArray:()[C function.
1141+
/// `java.lang.String.toCharArray:()[C` function.
11421142
/// \param type: type of the function called
11431143
/// \param loc: location in the source
11441144
/// \param symbol_table: the symbol table
1145-
/// \return Code corresponding to > return_tmp0 = malloc(array[char]); >
1146-
/// return_tmp0->data=&((s->data)[0]) > return_tmp0->length=s->length
1145+
/// \return Code corresponding to
1146+
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1147+
/// lhs = new java::array[char]
1148+
/// string_expr = {length=this->length, content=*(this->data)}
1149+
/// data = new char[]
1150+
/// *data = string_expr.content
1151+
/// lhs->data = &data[0]
1152+
/// lhs->length = string_expr.length
1153+
/// return lhs
1154+
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11471155
codet java_string_library_preprocesst::make_string_to_char_array_code(
11481156
const code_typet &type,
11491157
const source_locationt &loc,
@@ -1154,29 +1162,37 @@ codet java_string_library_preprocesst::make_string_to_char_array_code(
11541162
const code_typet::parametert &p=type.parameters()[0];
11551163
symbol_exprt string_argument(p.get_identifier(), p.type());
11561164
assert(implements_java_char_sequence(string_argument.type()));
1157-
dereference_exprt deref(string_argument, string_argument.type().subtype());
11581165

1159-
// lhs <- malloc(array[char])
1160-
exprt lhs=fresh_array(type.return_type(), loc, symbol_table);
1161-
allocate_dynamic_object_with_decl(
1162-
lhs, lhs.type().subtype(), symbol_table, loc, code);
1166+
// lhs = new java::array[char]
1167+
exprt lhs=allocate_fresh_array(
1168+
type.return_type(), loc, symbol_table, code);
11631169

1164-
// first_element_address is `&((string_argument->data)[0])`
1165-
exprt data=get_data(deref, symbol_table);
1170+
// string_expr = {this->length, this->data}
1171+
string_exprt string_expr=fresh_string_expr(loc, symbol_table, code);
1172+
code.add(code_assign_java_string_to_string_expr(
1173+
string_expr, string_argument, symbol_table));
1174+
exprt string_expr_sym=fresh_string_expr_symbol(
1175+
loc, symbol_table, code);
1176+
code.add(code_assignt(string_expr_sym, string_expr));
1177+
1178+
// data = new char[]
1179+
exprt data=allocate_fresh_array(
1180+
pointer_typet(string_expr.content().type()), loc, symbol_table, code);
1181+
1182+
// *data = string_expr.content
11661183
dereference_exprt deref_data(data, data.type().subtype());
1167-
exprt first_index=from_integer(0, string_length_type());
1168-
index_exprt first_element(deref_data, first_index, java_char_type());
1169-
address_of_exprt first_element_address(first_element);
1184+
code.add(code_assignt(deref_data, string_expr.content()));
11701185

1171-
// lhs->data <- &((string_argument->data)[0])
1186+
// lhs->data = &data[0]
11721187
dereference_exprt deref_lhs(lhs, lhs.type().subtype());
11731188
exprt lhs_data=get_data(deref_lhs, symbol_table);
1174-
code.add(code_assignt(lhs_data, first_element_address));
1189+
index_exprt first_elt(
1190+
deref_data, from_integer(0, java_int_type()), java_char_type());
1191+
code.add(code_assignt(lhs_data, address_of_exprt(first_elt)));
11751192

1176-
// lhs->length <- s->length
1177-
exprt rhs_length=get_length(deref, symbol_table);
1193+
// lhs->length = string_expr.length
11781194
exprt lhs_length=get_length(deref_lhs, symbol_table);
1179-
code.add(code_assignt(lhs_length, rhs_length));
1195+
code.add(code_assignt(lhs_length, string_expr.length()));
11801196

11811197
// return lhs
11821198
code.add(code_returnt(lhs));

0 commit comments

Comments
 (0)