Skip to content

Commit d41403f

Browse files
author
Thomas Kiley
authored
Merge pull request #1665 from romainbrenguier/bugfix/string-out-of-bound#TG-1808
Make clear that cbmc version of charAt and substring do not throw OutOfBound TG-1808
2 parents bcfaaa4 + ac7e649 commit d41403f

29 files changed

+94
-31
lines changed
Binary file not shown.

regression/jbmc-strings/StringLastIndexOf/Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public void check(String input_String1, String input_String2, int i) {
1313
// Contradiction with the previous condition (should fail).
1414
assert "foo".lastIndexOf("") != 3;
1515
} else if (i == 2 && input_String2.length() > 0) {
16-
int lio = input_String1.lastIndexOf(input_String2.charAt(0), fromIndex);
16+
int lio = input_String1.lastIndexOf(org.cprover.CProverString.charAt(input_String2, 0), fromIndex);
1717
if (input_String2.length() == 0)
1818
assert lio == fromIndex;
1919
} else if (i == 3) {
Binary file not shown.

regression/jbmc-strings/StringMiscellaneous04/StringMiscellaneous04.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ public static char[] toCharArray(String s)
88
char arr[]=new char[s.length()];
99
// We limit arbitrarly the loop unfolding to 10
1010
for(int i=0; i<length && i<10; i++)
11-
arr[i]=s.charAt(i);
11+
arr[i]=org.cprover.CProverString.charAt(s, i);
1212
return arr;
1313
}
1414

1515
public static void main(String[] args)
1616
{
1717
String s1 = "diffblue";
1818
String s2 = "TESTGENERATION";
19-
String s3 = " automated ";
19+
String s3 = " automated ";
2020

2121
assert s1.equals("diffblue");
2222
assert s2.equals("TESTGENERATION");
23-
assert s3.equals(" automated ");
23+
assert s3.equals(" automated ");
2424

2525
System.out.printf(
2626
"Replace 'f' with 'F' in s1: %s\n\n", s1.replace('f', 'F'));
@@ -43,7 +43,7 @@ public static void main(String[] args)
4343
int i=0;
4444
for (char character : charArray)
4545
{
46-
assert character=="diffblue".charAt(i);
46+
assert character==org.cprover.CProverString.charAt("diffblue", i);
4747
++i;
4848
}
4949

Binary file not shown.
Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
public class SubString01
22
{
3-
public static void main(String[] args)
4-
{
5-
String letters = "automatictestcasegenerationatdiffblue";
3+
public static void main(String[] args)
4+
{
5+
String letters = "automatictestcasegenerationatdiffblue";
66

7-
String tmp=letters.substring(20);
8-
assert tmp.equals("erationatdiffblue");
9-
10-
tmp=letters.substring(9, 13);
11-
assert tmp.equals("test");
12-
}
7+
String tmp=org.cprover.CProverString.substring(letters, 20);
8+
assert tmp.equals("erationatdiffblue");
9+
tmp=org.cprover.CProverString.substring(letters, 9, 13);
10+
assert tmp.equals("test");
11+
}
1312
}
790 Bytes
Binary file not shown.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.cprover;
2+
3+
public final class CProverString {
4+
public static char charAt(String s, int i) {
5+
if (0 <= i && i < s.length())
6+
return s.charAt(i);
7+
else
8+
return '\u0000';
9+
}
10+
11+
public static String substring(String s, int i) {
12+
if (i <= 0)
13+
return s;
14+
else if (i >= s.length())
15+
return "";
16+
else
17+
return s.substring(i);
18+
}
19+
20+
public static String substring(String s, int i, int j) {
21+
if (i < 0)
22+
return substring(s, 0, j);
23+
if (j >= s.length())
24+
return substring(s, 0, s.length() - 1);
25+
if (i >= j)
26+
return "";
27+
return s.substring(i, j);
28+
}
29+
}
Binary file not shown.

regression/jbmc-strings/java_char_array_init/test_init.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static String stringOfCharArray(char arr[])
1313

1414
public static String stringOfCharArray(char arr[], int i, int j)
1515
{
16-
return stringOfCharArray(arr).substring(i, i+j);
16+
return org.cprover.CProverString.substring(stringOfCharArray(arr), i, i+j);
1717
}
1818

1919
public static void main(int i)

0 commit comments

Comments
 (0)