Skip to content

Commit 72c1ea6

Browse files
authored
Fix this Resolution in Parameter Refinements (#67)
1 parent b57ae7d commit 72c1ea6

File tree

5 files changed

+61
-0
lines changed

5 files changed

+61
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package testSuite.classes.index_out_of_bounds_correct;
2+
3+
import liquidjava.specification.ExternalRefinementsFor;
4+
import liquidjava.specification.Ghost;
5+
import liquidjava.specification.Refinement;
6+
import liquidjava.specification.StateRefinement;
7+
8+
@ExternalRefinementsFor("java.util.ArrayList")
9+
@Ghost("int size")
10+
public interface ArrayListRefinements<E> {
11+
12+
public void ArrayList();
13+
14+
@StateRefinement(to = "size(this) == size(old(this)) + 1")
15+
public boolean add(E elem);
16+
17+
public E get(@Refinement("_ < size(this)") int index);
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package testSuite.classes.index_out_of_bounds_correct;
2+
3+
import java.util.ArrayList;
4+
5+
public class Test {
6+
public static void main(String[] args) {
7+
ArrayList<Integer> l = new ArrayList<>();
8+
l.add(1);
9+
l.get(0);
10+
}
11+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package testSuite.classes.index_out_of_bounds_error;
2+
3+
import liquidjava.specification.ExternalRefinementsFor;
4+
import liquidjava.specification.Ghost;
5+
import liquidjava.specification.Refinement;
6+
import liquidjava.specification.StateRefinement;
7+
8+
@ExternalRefinementsFor("java.util.ArrayList")
9+
@Ghost("int size")
10+
public interface ArrayListRefinements<E> {
11+
12+
public void ArrayList();
13+
14+
@StateRefinement(to = "size(this) == size(old(this)) + 1")
15+
public boolean add(E elem);
16+
17+
public E get(@Refinement("_ < size(this)") int index);
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package testSuite.classes.index_out_of_bounds_error;
2+
3+
import java.util.ArrayList;
4+
5+
public class Test {
6+
public static void main(String[] args) {
7+
ArrayList<Integer> l = new ArrayList<>();
8+
l.get(0); // index out of bounds
9+
}
10+
}

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ private <R> void checkParameters(CtElement invocation, List<CtExpression<?>> arg
376376
for (String s : vars)
377377
if (map.containsKey(s))
378378
c = c.substituteVariable(s, map.get(s));
379+
if (invocation.getMetadata(rtc.TARGET_KEY) != null) {
380+
VariableInstance vi = (VariableInstance) invocation.getMetadata(rtc.TARGET_KEY);
381+
c = c.substituteVariable(rtc.THIS, vi.getName());
382+
}
379383
rtc.checkSMT(c, invocation);
380384
}
381385
}

0 commit comments

Comments
 (0)