Skip to content

Commit 23e8572

Browse files
authored
Merge pull request diffblue#5110 from danpoe/feature/string-constructors
Tests for constant propagation of string constructors
2 parents f097054 + b40e637 commit 23e8572

26 files changed

+221
-35
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
public class Main {
2+
public void testSuccess1() {
3+
StringBuilder sb = new StringBuilder();
4+
assert sb.toString().equals("");
5+
}
6+
7+
public void testSuccess2() {
8+
StringBuilder sb = new StringBuilder(0);
9+
assert sb.toString().equals("");
10+
sb = new StringBuilder(5);
11+
assert sb.toString().equals("");
12+
}
13+
14+
public void testSuccess3(int i) {
15+
// The capacity argument of StringBuilder is ignored by the constant
16+
// propagator, hence we can still constant propagate the two constructors
17+
StringBuilder sb = new StringBuilder(i);
18+
assert sb.toString().equals("");
19+
sb = new StringBuilder(i);
20+
assert sb.toString().equals("");
21+
}
22+
23+
public void testSuccess4() {
24+
StringBuilder sb = new StringBuilder("abc");
25+
assert sb.toString().equals("abc");
26+
}
27+
28+
public void testSuccess5() {
29+
CharSequence cs = "abc";
30+
StringBuilder sb = new StringBuilder(cs);
31+
assert sb.toString().equals("abc");
32+
}
33+
34+
public void testNoPropagation1(String s) {
35+
StringBuilder sb = new StringBuilder(s);
36+
assert sb.toString().equals("abc");
37+
}
38+
39+
public void testNoPropagation2(CharSequence cs) {
40+
StringBuilder sb = new StringBuilder(cs);
41+
assert sb.toString().equals("abc");
42+
}
43+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE symex-driven-lazy-loading-expected-failure
2+
Main.class
3+
--function Main.testNoPropagation1 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar` --property 'java::Main.testNoPropagation1:(Ljava/lang/String;)V.assertion.1'
4+
^Generated [0-9]+ VCC\(s\), 1 remaining after simplification$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
^VERIFICATION FAILED$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE symex-driven-lazy-loading-expected-failure
2+
Main.class
3+
--function Main.testNoPropagation2 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar` --property 'java::Main.testNoPropagation2:(Ljava/lang/CharSequence;)V.assertion.1'
4+
^Generated [0-9]+ VCC\(s\), 1 remaining after simplification$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
^VERIFICATION FAILED$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess1 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess2 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess3 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess4 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess5 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--

jbmc/regression/jbmc-strings/ConstantEvaluationStringBuilderDefaultConstructor/Main.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

jbmc/regression/jbmc-strings/ConstantEvaluationStringBuilderDefaultConstructor/test.desc

Lines changed: 0 additions & 9 deletions
This file was deleted.
Binary file not shown.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
public class Main {
2+
public void testSuccess1() {
3+
String s = new String();
4+
assert s.equals("");
5+
}
6+
7+
public void testSuccess2() {
8+
String s = new String("abc");
9+
assert s.equals("abc");
10+
}
11+
12+
public void testSuccess3() {
13+
StringBuilder sb = new StringBuilder("abc");
14+
String s = new String(sb);
15+
assert s.equals("abc");
16+
}
17+
18+
public void testSuccess4() {
19+
StringBuffer sb = new StringBuffer("abc");
20+
String s = new String(sb);
21+
assert s.equals("abc");
22+
}
23+
24+
public void testNoPropagation1(String s1) {
25+
String s2 = new String(s1);
26+
assert s2.equals("abc");
27+
}
28+
29+
public void testNoPropagation2(StringBuilder sb) {
30+
String s = new String(sb);
31+
assert s.equals("abc");
32+
}
33+
34+
public void testNoPropagation3(StringBuffer sb) {
35+
String s = new String(sb);
36+
assert s.equals("abc");
37+
}
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE symex-driven-lazy-loading-expected-failure
2+
Main.class
3+
--function Main.testNoPropagation1 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar` --property 'java::Main.testNoPropagation1:(Ljava/lang/String;)V.assertion.1'
4+
^Generated [0-9]+ VCC\(s\), 1 remaining after simplification$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
^VERIFICATION FAILED$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE symex-driven-lazy-loading-expected-failure
2+
Main.class
3+
--function Main.testNoPropagation2 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar` --property 'java::Main.testNoPropagation2:(Ljava/lang/StringBuilder;)V.assertion.1'
4+
^Generated [0-9]+ VCC\(s\), 1 remaining after simplification$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
^VERIFICATION FAILED$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE symex-driven-lazy-loading-expected-failure
2+
Main.class
3+
--function Main.testNoPropagation3 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar` --property 'java::Main.testNoPropagation3:(Ljava/lang/StringBuffer;)V.assertion.1'
4+
^Generated [0-9]+ VCC\(s\), 1 remaining after simplification$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
^VERIFICATION FAILED$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess1 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess2 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess3 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Main.class
3+
--function Main.testSuccess4 --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar`
4+
^Generated [0-9]+ VCC\(s\), 0 remaining after simplification$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL$
8+
--
9+
--
Binary file not shown.

jbmc/regression/jbmc-strings/StringDefaultConstructorConstantEvaluation/Main.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

jbmc/regression/jbmc-strings/StringDefaultConstructorConstantEvaluation/test.desc

Lines changed: 0 additions & 9 deletions
This file was deleted.

jbmc/src/java_bytecode/java_string_library_preprocess.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,9 +1679,21 @@ void java_string_library_preprocesst::initialize_conversion_table()
16791679
std::placeholders::_2,
16801680
std::placeholders::_3,
16811681
std::placeholders::_4);
1682+
conversion_table
1683+
["java::java.lang.StringBuilder.<init>:(Ljava/lang/CharSequence;)V"] =
1684+
std::bind(
1685+
&java_string_library_preprocesst::make_copy_constructor_code,
1686+
this,
1687+
std::placeholders::_1,
1688+
std::placeholders::_2,
1689+
std::placeholders::_3,
1690+
std::placeholders::_4);
16821691
cprover_equivalent_to_java_constructor
16831692
["java::java.lang.StringBuilder.<init>:()V"]=
16841693
ID_cprover_string_empty_string_func;
1694+
cprover_equivalent_to_java_constructor
1695+
["java::java.lang.StringBuilder.<init>:(I)V"] =
1696+
ID_cprover_string_empty_string_func;
16851697

16861698
cprover_equivalent_to_java_assign_and_return_function
16871699
["java::java.lang.StringBuilder.append:(C)Ljava/lang/StringBuilder;"]=

src/goto-symex/goto_symex.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,8 @@ void goto_symext::constant_propagate_empty_string(
359359
const array_typet char_array_type(char_type, length);
360360

361361
DATA_INVARIANT(
362-
f_l1.arguments().size() == 2,
363-
"empty string primitive takes two output arguments");
362+
f_l1.arguments().size() >= 2,
363+
"empty string primitive requires two output arguments");
364364

365365
const array_exprt char_array({}, char_array_type);
366366

0 commit comments

Comments
 (0)