-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpointers.adb
220 lines (158 loc) · 4.08 KB
/
pointers.adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
package Pointers with
SPARK_Mode
is
-- Single level of pointers
type Int_Ptr is access Integer;
procedure Bad_Swap (X, Y : in out Int_Ptr);
procedure Swap (X, Y : in out Int_Ptr);
X, Y : Int_Ptr;
procedure Bad_Swap with
Global => (In_Out => (X, Y));
procedure Swap with
Global => (In_Out => (X, Y));
-- Double level of pointers
type Int_Ptr_Ptr is access Int_Ptr;
procedure Bad_Swap2 (X, Y : Int_Ptr_Ptr);
procedure Swap2 (X, Y : Int_Ptr_Ptr);
XX, YY : Int_Ptr_Ptr;
procedure Bad_Swap2 with
Global => (Input => (XX, YY));
procedure Swap2 with
Global => (Input => (XX, YY));
-- Constant single level of pointers
type Int_Cst_Ptr is access constant Integer;
procedure Bad_Swap3 (X, Y : in out Int_Cst_Ptr);
procedure Swap3 (X, Y : in out Int_Cst_Ptr);
CX, CY : Int_Cst_Ptr;
procedure Bad_Swap3 with
Global => (In_Out => (CX, CY));
procedure Swap3 with
Global => (In_Out => (CX, CY));
-- Pointer to constant single level of pointers
type Int_Ptr_Cst_Ptr is access Int_Cst_Ptr;
procedure Bad_Swap4 (X, Y : Int_Ptr_Cst_Ptr);
procedure Swap4 (X, Y : Int_Ptr_Cst_Ptr);
CXX, CYY : Int_Ptr_Cst_Ptr;
procedure Bad_Swap4 with
Global => (Input => (CXX, CYY));
procedure Swap4 with
Global => (Input => (CXX, CYY));
-- Constant double level of pointers
type Int_Cst_Ptr_Ptr is access constant Int_Ptr;
procedure Bad_Swap5 (X, Y : Int_Cst_Ptr_Ptr);
procedure Swap5 (X, Y : Int_Cst_Ptr_Ptr);
CCXX, CCYY : Int_Cst_Ptr_Ptr;
procedure Bad_Swap5 with
Global => (Input => (CCXX, CCYY));
procedure Swap5 with
Global => (Input => (CCXX, CCYY));
end Pointers;
package body Pointers with
SPARK_Mode
is
-- Single level of pointers
procedure Bad_Swap (X, Y : in out Int_Ptr) is
begin
X := Y;
end Bad_Swap;
procedure Swap (X, Y : in out Int_Ptr) is
Tmp : Int_Ptr := X;
begin
X := Y;
Y := Tmp;
end Swap;
procedure Bad_Swap is
begin
X := Y;
end Bad_Swap;
procedure Swap is
Tmp : Int_Ptr := X;
begin
X := Y;
Y := Tmp;
end Swap;
-- Double level of pointers
procedure Bad_Swap2 (X, Y : Int_Ptr_Ptr) is
begin
X.all := Y.all;
end Bad_Swap2;
procedure Swap2 (X, Y : Int_Ptr_Ptr) is
Tmp : Int_Ptr := X.all;
begin
X.all := Y.all;
Y.all := Tmp;
end Swap2;
procedure Bad_Swap2 is
begin
XX.all := YY.all;
end Bad_Swap2;
procedure Swap2 is
Tmp : Int_Ptr := XX.all;
begin
XX.all := YY.all;
YY.all := Tmp;
end Swap2;
-- Constant single level of pointers
procedure Bad_Swap3 (X, Y : in out Int_Cst_Ptr) is
begin
X := Y;
end Bad_Swap3;
procedure Swap3 (X, Y : in out Int_Cst_Ptr) is
Tmp : Int_Cst_Ptr := X;
begin
X := Y;
Y := Tmp;
end Swap3;
procedure Bad_Swap3 is
begin
CX := CY;
end Bad_Swap3;
procedure Swap3 is
Tmp : Int_Cst_Ptr := CX;
begin
CX := CY;
CY := Tmp;
end Swap3;
-- Pointer to constant single level of pointers
procedure Bad_Swap4 (X, Y : Int_Ptr_Cst_Ptr) is
begin
X.all := Y.all;
end Bad_Swap4;
procedure Swap4 (X, Y : Int_Ptr_Cst_Ptr) is
Tmp : Int_Cst_Ptr := X.all;
begin
X.all := Y.all;
Y.all := Tmp;
end Swap4;
procedure Bad_Swap4 is
begin
CXX.all := CYY.all;
end Bad_Swap4;
procedure Swap4 is
Tmp : Int_Cst_Ptr := CXX.all;
begin
CXX.all := CYY.all;
CYY.all := Tmp;
end Swap4;
-- Constant double level of pointers
procedure Bad_Swap5 (X, Y : Int_Cst_Ptr_Ptr) is
begin
X.all.all := Y.all.all;
end Bad_Swap5;
procedure Swap5 (X, Y : Int_Cst_Ptr_Ptr) is
Tmp : Int_Ptr := X.all;
begin
X.all.all := Y.all.all;
Y.all.all := Tmp.all;
end Swap5;
procedure Bad_Swap5 is
begin
CCXX.all.all := CCYY.all.all;
end Bad_Swap5;
procedure Swap5 is
Tmp : Int_Ptr := CCXX.all;
begin
CCXX.all.all := CCYY.all.all;
CCYY.all.all := Tmp.all;
end Swap5;
end Pointers;