Skip to content

Commit e7259ad

Browse files
authored
Merge pull request #1169 from owen-jones-diffblue/feature/rewrite-add-axioms-for-parse-int#702-again
Rewrite parseint code to use modulo
2 parents a3db858 + 4cfbfb5 commit e7259ad

File tree

47 files changed

+513
-235
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+513
-235
lines changed

regression/strings-smoke-tests/java_parseint/test.desc

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

regression/strings-smoke-tests/java_parseint/test_parseint.java

Lines changed: 0 additions & 12 deletions
This file was deleted.
Binary file not shown.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public class Test
2+
{
3+
public static void foo(int i)
4+
{
5+
if (i == 1) {
6+
String twelve = new String("12");
7+
int parsed1 = Integer.parseInt(twelve);
8+
assert(parsed1 == 12);
9+
assert(parsed1 != 12);
10+
}
11+
else if (i == 2) {
12+
// 2^31-1, max value of Integer
13+
String max_int = new String("2147483647");
14+
int parsed2 = Integer.parseInt(max_int);
15+
assert(parsed2 == 2147483647);
16+
assert(parsed2 != 2147483647);
17+
}
18+
}
19+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
Test.class
3+
--function Test.foo --refine-strings
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
^\[.*assertion.1\].* line 8.* SUCCESS$
7+
^\[.*assertion.2\].* line 9.* FAILURE$
8+
^\[.*assertion.3\].* line 15.* SUCCESS$
9+
^\[.*assertion.4\].* line 16.* FAILURE$
Binary file not shown.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
public class Test
2+
{
3+
public static void foo(String input_string)
4+
{
5+
int parsed1 = Integer.parseInt(input_string);
6+
if (parsed1 == 2) {
7+
assert(false);
8+
}
9+
}
10+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
THOROUGH
2+
Test.class
3+
--function Test.foo --refine-strings
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
^\[.*assertion.1\].* line 7.* FAILURE$
Binary file not shown.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
public class Test
2+
{
3+
public static void foo()
4+
{
5+
// -2^31, min value of Integer, and longest string we could have without
6+
// leading zeroes
7+
String min_int = new String("-2147483648");
8+
int parsed3 = Integer.parseInt(min_int);
9+
assert(parsed3 == -2147483648);
10+
assert(parsed3 != -2147483648);
11+
}
12+
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
KNOWNBUG
2-
test_parseint.class
3-
--refine-strings
2+
Test.class
3+
--refine-strings --function Test.foo
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[.*assertion.1\].* line 9.* SUCCESS$
77
^\[.*assertion.2\].* line 10.* FAILURE$
8-
^\[.*assertion.3\].* line 17.* SUCCESS$
9-
^\[.*assertion.4\].* line 18.* FAILURE$
108
--
119
--
1210
Issue #664 is about turning these tests on
Binary file not shown.

regression/strings-smoke-tests/java_parseint_knownbug/test_parseint.java

Lines changed: 0 additions & 21 deletions
This file was deleted.
Binary file not shown.
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
public class test_parseint_with_radix
1+
public class Test
22
{
3-
public static void main(String[] args)
3+
public static void foo(int i)
44
{
5-
if (args.length == 1) {
5+
if (i == 1) {
66
String str1 = new String("F");
77
int parsed1 = Integer.parseInt(str1, 16);
88
assert(parsed1 == 15);
99
assert(parsed1 != 15);
1010
}
11-
else if (args.length == 2) {
11+
else if (i == 2) {
1212
String str2 = new String("123");
1313
int parsed2 = Integer.parseInt(str2, 10);
1414
assert(parsed2 == 123);
1515
assert(parsed2 != 123);
1616
}
17-
else if (args.length == 3) {
17+
else if (i == 3) {
1818
String str3 = new String("77");
1919
int parsed3 = Integer.parseInt(str3, 8);
2020
assert(parsed3 == 63);
2121
assert(parsed3 != 63);
2222
}
23-
else if (args.length == 4) {
23+
else if (i == 4) {
2424
String str4 = new String("-101");
2525
int parsed4 = Integer.parseInt(str4, 2);
2626
assert(parsed4 == -5);
2727
assert(parsed4 != -5);
2828
}
29-
else if (args.length == 5) {
29+
else if (i == 5) {
3030
String str5 = new String("00aB");
3131
int parsed5 = Integer.parseInt(str5, 16);
3232
assert(parsed5 == 171);

regression/strings-smoke-tests/java_parseint_with_radix/test.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
2-
test_parseint_with_radix.class
3-
--refine-strings
2+
Test.class
3+
--refine-strings --function Test.foo
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[.*assertion.1\].* line 8.* SUCCESS$
Binary file not shown.
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
public class test_parseint_with_radix
1+
public class Test
22
{
3-
public static void main(String[] args)
3+
public static void foo(int i)
44
{
5-
if (args.length == 1) {
5+
if (i == 1) {
66
// 2^31-1, max value of Integer
77
String str1 = new String("7FFFFFFF");
88
int parsed1 = Integer.parseInt(str1, 16);
99
assert(parsed1 == 2147483647);
1010
assert(parsed1 != 2147483647);
1111
}
12-
else if (args.length == 2) {
12+
else if (i == 2) {
1313
// -2^31, min value of Integer, and longest string we could have
1414
String str2 = new String("-100000000000000000000000000000000");
1515
int parsed2 = Integer.parseInt(str2, 2);
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
CBMC version 5.7 64-bit x86_64 linux
2+
Parsing test_parseint_with_radix.class
3+
Java main class: test_parseint_with_radix
4+
Converting
5+
Generating GOTO Program
6+
Adding CPROVER library (x86_64)
7+
Removal of function pointers and virtual functions
8+
Partial Inlining
9+
Generic Property Instrumentation
10+
Starting Bounded Model Checking
11+
Unwinding loop __CPROVER__start.0 iteration 1 thread 0
12+
Unwinding loop __CPROVER__start.0 iteration 2 thread 0
13+
Unwinding loop __CPROVER__start.0 iteration 3 thread 0
14+
Unwinding loop __CPROVER__start.0 iteration 4 thread 0
15+
Unwinding loop __CPROVER__start.0 iteration 5 thread 0
16+
Unwinding recursion java::test_parseint_with_radix::clinit_wrapper iteration 1
17+
Unwinding recursion java::test_parseint_with_radix::clinit_wrapper iteration 1
18+
size of program expression: 530 steps
19+
simple slicing removed 50 assignments
20+
Generated 68 VCC(s), 9 remaining after simplification
21+
Passing problem to string refinement loop with MiniSAT 2.2.1 without simplifier
22+
converting SSA
23+
Running string refinement loop with MiniSAT 2.2.1 without simplifier
24+
BV-Refinement: post-processing
25+
BV-Refinement: iteration 1
26+
54337 variables, 39117 clauses
27+
SAT checker inconsistent: instance is UNSATISFIABLE
28+
BV-Refinement: got UNSAT, and the proof passes => UNSAT
29+
Total iterations: 1
30+
BV-Refinement: post-processing
31+
BV-Refinement: iteration 1
32+
54337 variables, 39117 clauses
33+
SAT checker inconsistent: instance is UNSATISFIABLE
34+
BV-Refinement: got UNSAT, and the proof passes => UNSAT
35+
Total iterations: 1
36+
Runtime decision procedure: 0.386s
37+
38+
** Results:
39+
[pointer_dereference.1] reference is null in *stub_ignored_arg1: SUCCESS
40+
[pointer_dereference.2] reference is null in *stub_ignored_arg1->data: SUCCESS
41+
[pointer_dereference.3] reference is null in *cprover_string_array$7: SUCCESS
42+
[pointer_dereference.4] reference is null in *this: SUCCESS
43+
[pointer_dereference.5] reference is null in *stub_ignored_arg0: SUCCESS
44+
[pointer_dereference.6] reference is null in *stub_ignored_arg0->data: SUCCESS
45+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.1] reference is null in *args: SUCCESS
46+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.2] reference is null in *new_tmp0: SUCCESS
47+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.3] reference is null in *new_tmp2: SUCCESS
48+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.assertion.1] assertion at file test_parseint_with_radix.java line 9 function java::test_parseint_with_radix.main:([Ljava/lang/String;)V bytecode_index 20: SUCCESS
49+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.null-pointer-exception.1] Throw null: SUCCESS
50+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.4] reference is null in *new_tmp3: SUCCESS
51+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.assertion.2] assertion at file test_parseint_with_radix.java line 10 function java::test_parseint_with_radix.main:([Ljava/lang/String;)V bytecode_index 29: SUCCESS
52+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.null-pointer-exception.2] Throw null: SUCCESS
53+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.5] reference is null in *args: SUCCESS
54+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.6] reference is null in *new_tmp4: SUCCESS
55+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.7] reference is null in *new_tmp6: SUCCESS
56+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.assertion.3] assertion at file test_parseint_with_radix.java line 16 function java::test_parseint_with_radix.main:([Ljava/lang/String;)V bytecode_index 52: SUCCESS
57+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.null-pointer-exception.3] Throw null: SUCCESS
58+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.8] reference is null in *new_tmp7: SUCCESS
59+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.assertion.4] assertion at file test_parseint_with_radix.java line 17 function java::test_parseint_with_radix.main:([Ljava/lang/String;)V bytecode_index 61: SUCCESS
60+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.null-pointer-exception.4] Throw null: SUCCESS
61+
[pointer_dereference.7] reference is null in *this: SUCCESS
62+
[array-create-negative-size.1] Array size should be >= 0: SUCCESS
63+
[pointer_dereference.8] reference is null in *cloned_array: SUCCESS
64+
[pointer_dereference.9] reference is null in *cloned_array: SUCCESS
65+
[pointer_dereference.10] reference is null in *this: SUCCESS
66+
[pointer_dereference.11] reference is null in *cloned_array: SUCCESS
67+
[pointer_dereference.12] reference is null in *this: SUCCESS
68+
[pointer_dereference.13] reference is null in *cloned_array: SUCCESS
69+
[pointer_dereference.14] reference is null in cloned_array->data[index]: SUCCESS
70+
[pointer_dereference.15] reference is null in this->data[index]: SUCCESS
71+
[pointer_dereference.16] reference is null in *this: SUCCESS
72+
[array-create-negative-size.2] Array size should be >= 0: SUCCESS
73+
[pointer_dereference.17] reference is null in *cloned_array: SUCCESS
74+
[pointer_dereference.18] reference is null in *cloned_array: SUCCESS
75+
[pointer_dereference.19] reference is null in *this: SUCCESS
76+
[pointer_dereference.20] reference is null in *cloned_array: SUCCESS
77+
[pointer_dereference.21] reference is null in *this: SUCCESS
78+
[pointer_dereference.22] reference is null in *cloned_array: SUCCESS
79+
[pointer_dereference.23] reference is null in cloned_array->data[index]: SUCCESS
80+
[pointer_dereference.24] reference is null in this->data[index]: SUCCESS
81+
[pointer_dereference.25] reference is null in *this: SUCCESS
82+
[array-create-negative-size.3] Array size should be >= 0: SUCCESS
83+
[pointer_dereference.26] reference is null in *cloned_array: SUCCESS
84+
[pointer_dereference.27] reference is null in *cloned_array: SUCCESS
85+
[pointer_dereference.28] reference is null in *this: SUCCESS
86+
[pointer_dereference.29] reference is null in *cloned_array: SUCCESS
87+
[pointer_dereference.30] reference is null in *this: SUCCESS
88+
[pointer_dereference.31] reference is null in *cloned_array: SUCCESS
89+
[pointer_dereference.32] reference is null in cloned_array->data[index]: SUCCESS
90+
[pointer_dereference.33] reference is null in this->data[index]: SUCCESS
91+
[pointer_dereference.34] reference is null in *this: SUCCESS
92+
[array-create-negative-size.4] Array size should be >= 0: SUCCESS
93+
[pointer_dereference.35] reference is null in *cloned_array: SUCCESS
94+
[pointer_dereference.36] reference is null in *cloned_array: SUCCESS
95+
[pointer_dereference.37] reference is null in *this: SUCCESS
96+
[pointer_dereference.38] reference is null in *cloned_array: SUCCESS
97+
[pointer_dereference.39] reference is null in *this: SUCCESS
98+
[pointer_dereference.40] reference is null in *cloned_array: SUCCESS
99+
[pointer_dereference.41] reference is null in cloned_array->data[index]: SUCCESS
100+
[pointer_dereference.42] reference is null in this->data[index]: SUCCESS
101+
[pointer_dereference.43] reference is null in *this: SUCCESS
102+
[array-create-negative-size.5] Array size should be >= 0: SUCCESS
103+
[pointer_dereference.44] reference is null in *cloned_array: SUCCESS
104+
[pointer_dereference.45] reference is null in *cloned_array: SUCCESS
105+
[pointer_dereference.46] reference is null in *this: SUCCESS
106+
[pointer_dereference.47] reference is null in *cloned_array: SUCCESS
107+
[pointer_dereference.48] reference is null in *this: SUCCESS
108+
[pointer_dereference.49] reference is null in *cloned_array: SUCCESS
109+
[pointer_dereference.50] reference is null in cloned_array->data[index]: SUCCESS
110+
[pointer_dereference.51] reference is null in this->data[index]: SUCCESS
111+
[pointer_dereference.52] reference is null in *this: SUCCESS
112+
[array-create-negative-size.6] Array size should be >= 0: SUCCESS
113+
[pointer_dereference.53] reference is null in *cloned_array: SUCCESS
114+
[pointer_dereference.54] reference is null in *cloned_array: SUCCESS
115+
[pointer_dereference.55] reference is null in *this: SUCCESS
116+
[pointer_dereference.56] reference is null in *cloned_array: SUCCESS
117+
[pointer_dereference.57] reference is null in *this: SUCCESS
118+
[pointer_dereference.58] reference is null in *cloned_array: SUCCESS
119+
[pointer_dereference.59] reference is null in cloned_array->data[index]: SUCCESS
120+
[pointer_dereference.60] reference is null in this->data[index]: SUCCESS
121+
[pointer_dereference.61] reference is null in *this: SUCCESS
122+
[array-create-negative-size.7] Array size should be >= 0: SUCCESS
123+
[pointer_dereference.62] reference is null in *cloned_array: SUCCESS
124+
[pointer_dereference.63] reference is null in *cloned_array: SUCCESS
125+
[pointer_dereference.64] reference is null in *this: SUCCESS
126+
[pointer_dereference.65] reference is null in *cloned_array: SUCCESS
127+
[pointer_dereference.66] reference is null in *this: SUCCESS
128+
[pointer_dereference.67] reference is null in *cloned_array: SUCCESS
129+
[pointer_dereference.68] reference is null in cloned_array->data[index]: SUCCESS
130+
[pointer_dereference.69] reference is null in this->data[index]: SUCCESS
131+
[pointer_dereference.70] reference is null in *this: SUCCESS
132+
[array-create-negative-size.8] Array size should be >= 0: SUCCESS
133+
[pointer_dereference.71] reference is null in *cloned_array: SUCCESS
134+
[pointer_dereference.72] reference is null in *cloned_array: SUCCESS
135+
[pointer_dereference.73] reference is null in *this: SUCCESS
136+
[pointer_dereference.74] reference is null in *cloned_array: SUCCESS
137+
[pointer_dereference.75] reference is null in *this: SUCCESS
138+
[pointer_dereference.76] reference is null in *cloned_array: SUCCESS
139+
[pointer_dereference.77] reference is null in cloned_array->data[index]: SUCCESS
140+
[pointer_dereference.78] reference is null in this->data[index]: SUCCESS
141+
[pointer_dereference.79] reference is null in *this: SUCCESS
142+
[array-create-negative-size.9] Array size should be >= 0: SUCCESS
143+
[pointer_dereference.80] reference is null in *cloned_array: SUCCESS
144+
[pointer_dereference.81] reference is null in *cloned_array: SUCCESS
145+
[pointer_dereference.82] reference is null in *this: SUCCESS
146+
[pointer_dereference.83] reference is null in *cloned_array: SUCCESS
147+
[pointer_dereference.84] reference is null in *this: SUCCESS
148+
[pointer_dereference.85] reference is null in *cloned_array: SUCCESS
149+
[pointer_dereference.86] reference is null in cloned_array->data[index]: SUCCESS
150+
[pointer_dereference.87] reference is null in this->data[index]: SUCCESS
151+
[pointer_dereference.88] reference is null in *args: SUCCESS
152+
[pointer_dereference.89] reference is null in *args: SUCCESS
153+
[pointer_dereference.90] reference is null in *args: SUCCESS
154+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.9] reference is null in *args: SUCCESS
155+
[pointer_dereference.91] reference is null in *args: SUCCESS
156+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.10] reference is null in array_data_init$10[array_init_iter$11]: SUCCESS
157+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.11] reference is null in *malloc_site$12: SUCCESS
158+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.12] reference is null in *malloc_site$12: SUCCESS
159+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.13] reference is null in *malloc_site$12: SUCCESS
160+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.14] reference is null in *malloc_site$12: SUCCESS
161+
[java::test_parseint_with_radix.main:([Ljava/lang/String;)V.pointer_dereference.15] reference is null in *malloc_site$13: SUCCESS
162+
163+
** 0 of 123 failed (1 iteration)
164+
VERIFICATION SUCCESSFUL

regression/strings-smoke-tests/java_parseint_with_radix_knownbug/test.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
KNOWNBUG
2-
test_parseint_with_radix.class
3-
--refine-strings
2+
Test.class
3+
--refine-strings --function Test.foo
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[.*assertion.1\].* line 9.* SUCCESS$
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

regression/strings-smoke-tests/java_parselong_5/test_parselong.java renamed to regression/strings-smoke-tests/java_parselong_binary_1/Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
public class test_parselong
1+
public class Test
22
{
3-
public static void main(String[] args)
3+
public static void foo()
44
{
55
// -2^35
66
String str = new String("-100000000000000000000000000000000000");

regression/strings-smoke-tests/java_parselong_3/test.desc renamed to regression/strings-smoke-tests/java_parselong_binary_1/test.desc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
THOROUGH
2-
test_parselong.class
3-
--refine-strings
1+
CORE
2+
Test.class
3+
--refine-strings --function Test.foo
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[.*assertion.1\].* line 8.* SUCCESS$
Binary file not shown.

regression/strings-smoke-tests/java_parselong_1/test_parselong.java renamed to regression/strings-smoke-tests/java_parselong_decimal_1/Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
public class test_parselong
1+
public class Test
22
{
3-
public static void main(String[] args)
3+
public static void foo()
44
{
55
// 2^40
66
String str = new String("1099511627776");

regression/strings-smoke-tests/java_parselong_1/test.desc renamed to regression/strings-smoke-tests/java_parselong_decimal_1/test.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
THOROUGH
2-
test_parselong.class
3-
--refine-strings
2+
Test.class
3+
--refine-strings --function Test.foo
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[.*assertion.1\].* line 8.* SUCCESS$
Binary file not shown.

0 commit comments

Comments
 (0)