Skip to content

Commit 8e7b6e7

Browse files
committed
Java object factory: initialize AbstractStringBuilder-derived types correctly
These are currently initialized as if they are directly derived from Object, which causes a crash due to the type inconsistency between StringBuilder { AbstractStringBuilder { Object { } } } and StringBuilder { Object { } } With this change they are initialised more like normal types, which has the side-effect that any fields they possess that are *not* special-cased by `initialize_nondet_string_fields` are nondet-initialized as for any other type. I add a test verifying this new behaviour, and a simpler test checking that Builder and Buffer are usable as nondet arguments at all.
1 parent 6566d10 commit 8e7b6e7

31 files changed

+277
-178
lines changed
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public class Test {
2+
3+
public static void testme(StringBuilder builder, StringBuffer buffer) {
4+
5+
}
6+
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
public class AbstractStringBuilder implements CharSequence {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
interface CharSequence {
4+
5+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
public class String implements CharSequence {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
public class StringBuffer extends AbstractStringBuilder {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
public class StringBuilder extends AbstractStringBuilder {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CORE
2+
Test.class
3+
--function Test.testme
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
type mismatch
9+
--
10+
Before cbmc#2472 this would assume that StringBuilder's direct parent was
11+
java.lang.Object, causing a type mismatch when --refine-strings was not in use
12+
(which at the time would assume that parent-child relationship)
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
public class Test {
2+
3+
public static void testme(StringBuilder builder, StringBuffer buffer, String str) {
4+
5+
// In this test the versions of String, StringBuilder and
6+
// StringBuffer.class supplied have fields beyond the expected situation
7+
// of either no fields at all (without --refine-strings) or only 'length'
8+
// and 'data' (with --refine-strings). We check they have been nondet-
9+
// initialized as expected by making sure we can reach the final
10+
// 'assert false'.
11+
12+
if(str != null &&
13+
builder != null &&
14+
buffer != null &&
15+
str.a != null &&
16+
builder.i != null &&
17+
buffer.i != null &&
18+
str.a.x >= 5 &&
19+
str.a.y <= -10.0f &&
20+
builder.d >= 100.0 &&
21+
buffer.b == true) {
22+
23+
assert builder instanceof StringBuilder;
24+
assert buffer instanceof StringBuffer;
25+
assert str instanceof String;
26+
27+
assert str.a instanceof A;
28+
assert builder.i instanceof Integer;
29+
assert buffer.i instanceof Integer;
30+
31+
assert false;
32+
}
33+
34+
}
35+
36+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package java.lang;
2+
3+
public class A {
4+
5+
public int x;
6+
public float y;
7+
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package java.lang;
2+
3+
public class AbstractStringBuilder implements CharSequence {
4+
5+
public Integer i;
6+
7+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package java.lang;
2+
3+
interface CharSequence {
4+
5+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package java.lang;
2+
3+
public class String implements CharSequence {
4+
5+
public A a;
6+
7+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package java.lang;
2+
3+
public class StringBuffer extends AbstractStringBuilder {
4+
5+
public boolean b;
6+
7+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package java.lang;
2+
3+
public class StringBuilder extends AbstractStringBuilder {
4+
5+
public double d;
6+
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
CORE
2+
Test.class
3+
--function Test.testme
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
assertion at file Test.java line 23 .* SUCCESS
7+
assertion at file Test.java line 24 .* SUCCESS
8+
assertion at file Test.java line 25 .* SUCCESS
9+
assertion at file Test.java line 27 .* SUCCESS
10+
assertion at file Test.java line 28 .* SUCCESS
11+
assertion at file Test.java line 29 .* SUCCESS
12+
assertion at file Test.java line 31 .* FAILURE
13+
--
14+
type mismatch

0 commit comments

Comments
 (0)