Skip to content

TG-58 New PR for Complete rework of string solver to avoid using infinite arrays #1539

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
c71c64b
Regression: include model for string to char array
romainbrenguier Sep 5, 2017
76cd14d
Unit test for gen_nondet_string_init
romainbrenguier Sep 14, 2017
fa45b34
Regression test mprovement for if expressions
romainbrenguier Sep 25, 2017
36d6e6d
[util/irep_ids] Additional identifiers
romainbrenguier Sep 25, 2017
6378400
Style improvements in the string solver
Sep 29, 2017
2505982
Extra preconditions in string solver
Sep 29, 2017
e89f5e4
[string-preprocess] Refactor java_types_matches_tag
romainbrenguier Sep 27, 2017
0ae71b0
[string-preprocessing] New functions for calling string primitives in
romainbrenguier Sep 27, 2017
1d112d5
Java object factory for nondet strings
romainbrenguier Sep 27, 2017
4adf5d0
New class for union find replace
romainbrenguier Oct 28, 2017
9ea2eda
Unit tests for union_find_replacet
romainbrenguier Sep 14, 2017
edf7057
Complete string solver rework
romainbrenguier Oct 28, 2017
b6b2669
Style changes in string_constraint_generator_testing
romainbrenguier Sep 26, 2017
dcae158
[string-refinement] Removing unused functions
romainbrenguier Sep 25, 2017
369dd62
Unit test: adapte instantiate_nc for new signature
romainbrenguier Sep 25, 2017
b80d063
Doxygen corrections
romainbrenguier Oct 27, 2017
302f92e
Make string primitives return return_code_type
romainbrenguier Oct 27, 2017
05a6b09
[constraint-generator] Removing declarations of unimplemented functions
romainbrenguier Sep 26, 2017
b76b116
Minor improvements in string preprocessing
romainbrenguier Sep 26, 2017
26ae9a9
Unit test improve convert exprt to string exprt
romainbrenguier Sep 26, 2017
15fd1b4
Fix typos in strings and comments of string solver
Sep 29, 2017
a83daa7
Minor indentation, naming and const-fixes
Sep 27, 2017
982a5fc
Style and documentation fixes in preprocessing
romainbrenguier Oct 10, 2017
1a22916
[string-refinement] Display debug info for index-set
romainbrenguier Sep 27, 2017
b88fe35
[string-refinement] Check for char type
romainbrenguier Sep 27, 2017
c9c612d
[string-refinement] Do not update index set of constant arrays
romainbrenguier Sep 27, 2017
86e4782
[string-refinement] Allow index set saturation if
romainbrenguier Sep 27, 2017
9edbb90
[string-refinement] Change get_array to return optional
romainbrenguier Sep 28, 2017
f2122c6
Correct signature of convert_exprt_to_string_exprt_unit_test
romainbrenguier Sep 29, 2017
61f0e1b
Making check_axioms for string_constraints and
romainbrenguier Sep 29, 2017
e6700ff
Minor improvements in bytecode typecheck
romainbrenguier Oct 10, 2017
c410159
Regression: StringBuilder append with int argument
romainbrenguier Oct 12, 2017
6861b9d
Documentation fixes in stirng constraint generator
romainbrenguier Oct 12, 2017
28590fe
Correction in constraints for concat
romainbrenguier Oct 12, 2017
fef1c5f
Correction in debug model
romainbrenguier Oct 12, 2017
86e1444
Refactoring: use begin()+3 instead of 3 times next
romainbrenguier Oct 12, 2017
3d5465e
Minor code improvements in generator_insert
romainbrenguier Oct 12, 2017
3e5b3f1
Minor code improvements in string refinement
romainbrenguier Oct 12, 2017
145364c
String refinement: Improve debug information
romainbrenguier Oct 12, 2017
92897f7
Style fixes in string_constraint_generator.h
romainbrenguier Oct 13, 2017
ca8213f
Simplify not_contains constraints before negation
romainbrenguier Oct 16, 2017
4b8a421
Make get_array return array of unknown expr
romainbrenguier Oct 16, 2017
26e895d
Distinguish strings and char arrays in get
romainbrenguier Oct 16, 2017
2355e8e
Fix set of created strings in generator and use it
romainbrenguier Oct 12, 2017
bb22700
Cleanup unused fields of constraint generator
romainbrenguier Oct 17, 2017
73d51fc
Remove insert_long which duplicates insert_int
romainbrenguier Oct 17, 2017
038b476
Allow index for argument of associate array to pointer
romainbrenguier Oct 19, 2017
e59349f
Remove redundant check in from_int_with_radix
romainbrenguier Oct 17, 2017
ad65847
Style: rename i in chr_int to avoid clash
romainbrenguier Oct 17, 2017
daef30f
Splitting is_string and init_string parts of init
romainbrenguier Oct 18, 2017
a2d7811
Use dynamic object instead of tmp_object in init
romainbrenguier Oct 19, 2017
232617c
Add code for String constructor from array
romainbrenguier Oct 18, 2017
90c8495
Improve tests for StringBuilder.append([C)
romainbrenguier Oct 20, 2017
d03b8cc
Remove regression test that is not checking anything
romainbrenguier Oct 20, 2017
5a0d6b4
Rename first_index in array_expr
romainbrenguier Oct 23, 2017
539ff9f
Refactoring: simplify and remove unused expression
romainbrenguier Oct 23, 2017
3ee3b25
Refactor: remove m_ prefix from member fields
romainbrenguier Oct 27, 2017
21b2641
Move make_function_application to java_utils
romainbrenguier Oct 30, 2017
aa94fe8
Style: add nolint marker on lines formated by clang
romainbrenguier Oct 30, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,40 +1,52 @@
public class StringMiscellaneous04
{
public static void main(String[] args)
{
String s1 = "diffblue";
String s2 = "TESTGENERATION";
String s3 = " automated ";

assert s1.equals("diffblue");
assert s2.equals("TESTGENERATION");
assert s3.equals(" automated ");

System.out.printf(
"Replace 'f' with 'F' in s1: %s\n\n", s1.replace('f', 'F'));
String tmp=s1.replace('f', 'F');
assert tmp.equals("diFFblue");

tmp=s1.toUpperCase();
assert tmp.equals("DIFFBLUE");

tmp=s2.toLowerCase();
assert tmp.equals("testgeneration");

tmp=s3.trim();
assert tmp.equals("automated");

// test toCharArray method
char[] charArray = s1.toCharArray();
System.out.print("s1 as a character array = ");

int i=0;
for (char character : charArray)
{
assert character=="diffblue".charAt(i);
++i;
}

System.out.println();
}
// This is a model of the String.toCharArray method
public static char[] toCharArray(String s)
{
int length=s.length();
assert(length<10);
char arr[]=new char[s.length()];
// We limit arbitrarly the loop unfolding to 10
for(int i=0; i<length && i<10; i++)
arr[i]=s.charAt(i);
return arr;
}

public static void main(String[] args)
{
String s1 = "diffblue";
String s2 = "TESTGENERATION";
String s3 = " automated ";

assert s1.equals("diffblue");
assert s2.equals("TESTGENERATION");
assert s3.equals(" automated ");

System.out.printf(
"Replace 'f' with 'F' in s1: %s\n\n", s1.replace('f', 'F'));
String tmp=s1.replace('f', 'F');
assert tmp.equals("diFFblue");

tmp=s1.toUpperCase();
assert tmp.equals("DIFFBLUE");

tmp=s2.toLowerCase();
assert tmp.equals("testgeneration");

tmp=s3.trim();
assert tmp.equals("automated");

// test toCharArray method
char[] charArray = toCharArray(s1);
System.out.print("s1 as a character array = ");

int i=0;
for (char character : charArray)
{
assert character=="diffblue".charAt(i);
++i;
}

System.out.println();
}
}
3 changes: 2 additions & 1 deletion regression/jbmc-strings/java_append_char/test.desc
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ test_append_char.class
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
^\[.*assertion\.1\].* line 15.* FAILURE$
^\[.*assertion\.1\].* line 16.* SUCCESS$
^\[.*assertion\.2\].* line 18.* FAILURE$
--
Binary file modified regression/jbmc-strings/java_append_char/test_append_char.class
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
public class test_append_char
{
public static void main(/*String[] args*/)
public static void main(boolean b)
{
char[] diff = {'d', 'i', 'f', 'f'};
char[] blue = {'b', 'l', 'u', 'e'};
Expand All @@ -12,6 +12,9 @@ public static void main(/*String[] args*/)

String tmp=buffer.toString();
System.out.println(tmp);
assert(!tmp.equals("diffblue"));
if(b)
assert(tmp.equals("diffblue"));
else
assert(!tmp.equals("diffblue"));
}
}
5 changes: 4 additions & 1 deletion regression/jbmc-strings/java_char_array_init/test.desc
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@ test_init.class
--refine-strings --string-max-length 1000
^EXIT=10$
^SIGNAL=0$
^\[.*assertion.1\].* line 14.* FAILURE$
assertion.* file test_init.java line 31 .* SUCCESS$
assertion.* file test_init.java line 33 .* SUCCESS$
assertion.* file test_init.java line 35 .* FAILURE$
assertion.* file test_init.java line 37 .* FAILURE$
--
Binary file modified regression/jbmc-strings/java_char_array_init/test_init.class
Binary file not shown.
51 changes: 36 additions & 15 deletions regression/jbmc-strings/java_char_array_init/test_init.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,39 @@
public class test_init {
public class test_init
{
// These are models for the constructors of strings from char arrays
public static String stringOfCharArray(char arr[])
{
// We give an arbitrary limit on the size of arrays
assert(arr.length<11);
StringBuilder sb=new StringBuilder("");
for(int i=0; i<arr.length && i<11; i++)
sb.append(arr[i]);
return sb.toString();
}

public static void main(/*String[] argv*/)
{
char [] str = new char[10];
str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
String s = new String(str);
String t = new String(str,1,2);
public static String stringOfCharArray(char arr[], int i, int j)
{
return stringOfCharArray(arr).substring(i, i+j);
}

assert(s.length() != 10 ||
!t.equals("el") ||
!s.startsWith("Hello"));
}
public static void main(int i)
{
char [] str = new char[10];
str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
String s = stringOfCharArray(str);
String t = stringOfCharArray(str,1,2);

if(i==0)
assert(s.startsWith("Hello"));
else if(i==1)
assert(t.equals("el"));
else if(i==2)
assert(!s.startsWith("Hello"));
else
assert(!t.equals("el"));
}
}
3 changes: 2 additions & 1 deletion regression/jbmc-strings/java_insert_char_array/test.desc
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ test_insert_char_array.class
--refine-strings --string-max-length 1000
^EXIT=10$
^SIGNAL=0$
^\[.*assertion\.1\].* line 12.* FAILURE$
assertion.* line 28.* SUCCESS$
assertion.* line 30.* FAILURE$
--
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,14 +1,30 @@
public class test_insert_char_array
{
public static void main(/*String[] argv*/)
{
StringBuilder sb = new StringBuilder("ad");
char[] array = new char[2];
array[0] = 'b';
array[1] = 'c';
sb.insert(1, array);
String s = sb.toString();
System.out.println(s);
assert(!s.equals("abcd"));
}
// These are models of the String methods manipulating char arrays
public static String stringOfCharArray(char arr[])
{
StringBuilder sb=new StringBuilder("");
for(int i=0; i<arr.length; i++)
sb.append(arr[i]);
return sb.toString();
}
public static void insert(StringBuilder sb, int pos, char arr[])
{
String s=stringOfCharArray(arr);
sb.insert(pos, s);
}
public static void main(int i)
{
StringBuilder sb = new StringBuilder("ad");
char[] array = new char[2];
array[0] = 'b';
array[1] = 'c';
insert(sb, 1, array);
String s = sb.toString();
System.out.println(s);
if(i==0)
assert(s.equals("abcd"));
else
assert(!s.equals("abcd"));
}
}
5 changes: 3 additions & 2 deletions regression/strings-smoke-tests/java_append_char/test.desc
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
CORE
test_append_char.class
--refine-strings --string-max-length 1000
^EXIT=0$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION SUCCESSFUL$
assertion.* file test_append_char.java line 23 .* SUCCESS
assertion.* file test_append_char.java line 25 .* FAILURE
--
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
public class test_append_char
{
public static void main(/*String[] args*/)
{
char[] diff = {'d', 'i', 'f', 'f'};
char[] blue = {'b', 'l', 'u', 'e'};
public static String ofCharArray(char arr[])
{
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < arr.length; i++)
sb.append(arr[i]);
return sb.toString();
}
public static void main(String[] args)
{
char[] diff = {'d', 'i', 'f', 'f'};
char[] blue = {'b', 'l', 'u', 'e'};

StringBuilder buffer = new StringBuilder();
StringBuilder buffer = new StringBuilder();

buffer.append(diff)
.append(blue);
buffer.append(ofCharArray(diff))
.append(ofCharArray(blue));

String tmp=buffer.toString();
System.out.println(tmp);
assert tmp.equals("diffblue");
}
String tmp=buffer.toString();
System.out.println(tmp);
if(args.length == 0)
assert tmp.equals("diffblue");
else
assert !tmp.equals("diffblue");
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
public class test_append_string
{
public static void main(/*String[] args*/)
{
String di = new String("di");
StringBuilder diff = new StringBuilder();
diff.append(di);
diff.append("ff");
System.out.println(diff);
String s = diff.toString();
System.out.println(s);
assert s.equals("diff");
}
public static void main()
{
String di = new String("di");
StringBuilder diff = new StringBuilder();
diff.append(di);
diff.append("ff");
System.out.println(diff);
String s = diff.toString();
System.out.println(s);
assert s.equals("diff");
}

public static void check(StringBuilder sb, String str)
{
String init = sb.toString();
if(str.length() >= 4)
{
sb.append(str, 2, 4);
String res = sb.toString();
assert(res.startsWith(init));
assert(res.endsWith(str.substring(2, 4)));
assert(res.length() == init.length() + 2);
assert(!res.equals("foobarfuz"));
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE
test_append_string.class
--refine-strings --string-max-length 10 --function test_append_string.check --java-assume-inputs-non-null
^EXIT=10$
^SIGNAL=0$
^\[.*assertion.*\].* line 22.* SUCCESS$
^\[.*assertion.*\].* line 23.* SUCCESS$
^\[.*assertion.*\].* line 24.* SUCCESS$
^\[.*assertion.*\].* line 25.* FAILURE$
--
13 changes: 7 additions & 6 deletions regression/strings-smoke-tests/java_char_array/test.desc
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ test_char_array.class
--refine-strings --string-max-length 1000
^EXIT=10$
^SIGNAL=0$
.*assertion.* test_char_array.java line 9 .* SUCCESS$
.*assertion.* test_char_array.java line 10 .* SUCCESS$
.*assertion.* test_char_array.java line 11 .* SUCCESS$
.*assertion.* test_char_array.java line 13 .* FAILURE$
.*assertion.* test_char_array.java line 15 .* FAILURE$
.*assertion.* test_char_array.java line 17 .* FAILURE$
.*assertion.* test_char_array.java line 7 .* SUCCESS$
.*assertion.* test_char_array.java line 21 .* SUCCESS$
.*assertion.* test_char_array.java line 22 .* SUCCESS$
.*assertion.* test_char_array.java line 23 .* SUCCESS$
.*assertion.* test_char_array.java line 25 .* FAILURE$
.*assertion.* test_char_array.java line 27 .* FAILURE$
.*assertion.* test_char_array.java line 29 .* FAILURE$
^VERIFICATION FAILED$
--
Binary file not shown.
Loading