1
+ // Any copyright is dedicated to the Public Domain.
2
+ // http://creativecommons.org/publicdomain/zero/1.0/
3
+
4
+
5
+ predicate P(r: Ref) {forall e : Ref :: e in refs(r) ==> acc(Q(e), wildcard)}
6
+ predicate P2(r: Ref) {forall e : Ref :: e in refs(r) ==> acc(Q(e), 1/2)}
7
+ predicate R(r: Ref) {forall e : Ref :: e in refs(r) ==> acc(e.q, wildcard)}
8
+ predicate R2(r: Ref) {forall e : Ref :: e in refs(r) ==> acc(e.q, 1/2)}
9
+ predicate Q(r: Ref)
10
+
11
+ field q: Ref
12
+
13
+ function refs(r: Ref) : Set[Ref]
14
+
15
+ function get(r: Ref): Ref
16
+ ensures result in refs(r)
17
+
18
+ function tester(r: Ref): Ref
19
+ requires acc(Q(r), wildcard)
20
+
21
+ function testerFull(r: Ref): Ref
22
+ requires acc(Q(r), write)
23
+
24
+ function testerfield(r: Ref): Ref
25
+ requires acc(r.q, wildcard)
26
+
27
+ function testerfieldFull(r: Ref): Ref
28
+ requires acc(r.q, write)
29
+
30
+ method pred1(r: Ref)
31
+ requires acc(P(r), wildcard)
32
+ {
33
+ unfold acc(P(r), wildcard)
34
+ fold acc(P(r), wildcard)
35
+ unfold acc(P(r), wildcard)
36
+ var r2 : Ref := tester(get(r))
37
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
38
+ var r3 : Ref := testerFull(get(r))
39
+ }
40
+
41
+ method pred2(r: Ref)
42
+ requires acc(P(r), write)
43
+ {
44
+ unfold acc(P(r))
45
+ fold acc(P(r))
46
+ unfold acc(P(r))
47
+ var r2 : Ref := tester(get(r))
48
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
49
+ var r3 : Ref := testerFull(get(r))
50
+ }
51
+
52
+ method pred3(r: Ref)
53
+ requires acc(P(r), write)
54
+ {
55
+ unfold acc(P(r), 1/2)
56
+ fold acc(P(r), 1/2)
57
+ unfold acc(P(r), 1/2)
58
+ var r2 : Ref := tester(get(r))
59
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
60
+ var r3 : Ref := testerFull(get(r))
61
+ }
62
+
63
+ method pred4(r: Ref)
64
+ requires acc(P2(r), write)
65
+ {
66
+ unfold acc(P2(r), wildcard)
67
+ fold acc(P2(r), wildcard)
68
+ unfold acc(P2(r), wildcard)
69
+ var r2 : Ref := tester(get(r))
70
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
71
+ var r3 : Ref := testerFull(get(r))
72
+ }
73
+
74
+ method func1(r: Ref)
75
+ requires acc(R(r), wildcard)
76
+ {
77
+ unfold acc(R(r), wildcard)
78
+ fold acc(R(r), wildcard)
79
+ unfold acc(R(r), wildcard)
80
+ var r2 : Ref := testerfield(get(r))
81
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
82
+ var r3 : Ref := testerfieldFull(get(r))
83
+ }
84
+
85
+ method func2(r: Ref)
86
+ requires acc(R(r), write)
87
+ {
88
+ unfold acc(R(r))
89
+ fold acc(R(r))
90
+ unfold acc(R(r))
91
+ var r2 : Ref := testerfield(get(r))
92
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
93
+ var r3 : Ref := testerfieldFull(get(r))
94
+ }
95
+
96
+ method func3(r: Ref)
97
+ requires acc(R(r), write)
98
+ {
99
+ unfold acc(R(r), 1/2)
100
+ fold acc(R(r), 1/2)
101
+ unfold acc(R(r), 1/2)
102
+ var r2 : Ref := testerfield(get(r))
103
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
104
+ var r3 : Ref := testerfieldFull(get(r))
105
+ }
106
+
107
+ method func4(r: Ref)
108
+ requires acc(R2(r), write)
109
+ {
110
+ unfold acc(R2(r), wildcard)
111
+ fold acc(R2(r), wildcard)
112
+ unfold acc(R2(r), wildcard)
113
+ var r2 : Ref := testerfield(get(r))
114
+ //:: ExpectedOutput(application.precondition:insufficient.permission)
115
+ var r3 : Ref := testerfieldFull(get(r))
116
+ }
0 commit comments