Skip to content

Commit 03c3040

Browse files
author
Lefan Zhang
authored
Merge pull request diffblue#22 from lefanz-amazon/lefan-abstraction
aws-array-eq: finish the proof!
2 parents 178e0dd + 5127b7b commit 03c3040

File tree

3 files changed

+97
-19
lines changed

3 files changed

+97
-19
lines changed

regression/abstraction/abst-funcs.c

Lines changed: 86 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ size_t add_abs_to_conc_2(size_t abs_ind, size_t num, size_t a1, size_t a2){
231231
// int conc = concretize_2(abs_ind, a1, a2);
232232
// return(two_abs(conc+num, a1, a2));
233233
// }
234-
int conc = concretize_2(abs_ind, a1, a2);
234+
size_t conc = concretize_2(abs_ind, a1, a2);
235235
return two_abs(conc+num, a1, a2);
236236

237237
}
@@ -256,21 +256,96 @@ size_t sub_conc_from_abs_2(size_t abs_ind, size_t num, size_t a1, size_t a2){
256256
// int conc = concretize_2(abs_ind, a1, a2);
257257
// return(two_abs(conc-num, a1, a2));
258258
// }
259-
int conc = concretize_2(abs_ind, a1, a2);
259+
size_t conc = concretize_2(abs_ind, a1, a2);
260260
assert(conc >= num);
261261
return two_abs(conc-num, a1, a2);
262262
}
263263

264-
// Three indices: *c*c*c. Not used currently.
265-
int three_abs(int index, int a1, int a2, int a3) {
264+
// helper function
265+
// translate an index from *c*c*c* to the real one depending on value of a1, a2, a3
266+
// e.g. when a1=0, a1+1==a2, *c*c*c* becomes cc*c*
267+
// index 4 in *c*c*c* will be translated into 2 by this function
268+
size_t raw_to_real_3(size_t raw_index, size_t a1, size_t a2, size_t a3)
269+
{
270+
return raw_index - (raw_index >= 1 && a1 == 0) -
271+
(raw_index >= 3 && a1 + 1 == a2) - (raw_index >= 5 && a2 + 1 == a3);
272+
}
273+
274+
// helper function, the reversed version of raw_to_real
275+
// *c*c*c*
276+
// c1: 1-(a1==0)
277+
// c2: 3-(a1==0)-(a1+1==a2)
278+
// c3: 5-(a1==0)-(a1+1==a2)-(a2+1==a3)
279+
size_t real_to_raw_3(size_t real_index, size_t a1, size_t a2, size_t a3)
280+
{
281+
if (real_index < 1-(a1==0))
282+
return 0;
283+
else if (real_index == 1-(a1==0))
284+
return 1;
285+
else if (real_index < 3-(a1==0)-(a1+1==a2))
286+
return 2;
287+
else if (real_index == 3-(a1==0)-(a1+1==a2))
288+
return 3;
289+
else if (real_index < 5-(a1==0)-(a1+1==a2)-(a2+1==a3))
290+
return 4;
291+
else if (real_index == 5-(a1==0)-(a1+1==a2)-(a2+1==a3))
292+
return 5;
293+
else
294+
return 6;
295+
}
296+
297+
// Three indices: *c*c*c*
298+
// *1: exist if a1>0
299+
// *2: exist if a1+1!=a2
300+
// *3: exist if a2+1!=a3
301+
size_t three_abs(size_t index, size_t a1, size_t a2, size_t a3) {
302+
size_t raw_index = 0;
303+
if (index < a1) raw_index = 0;
304+
else if (index == a1) raw_index = 1;
305+
else if (index > a1 && index < a2) raw_index = 2;
306+
else if (index == a2) raw_index = 3;
307+
else if (index > a2 && index < a3) raw_index = 4;
308+
else if (index == a3) raw_index = 5;
309+
else raw_index = 6;
310+
return raw_to_real_3(raw_index, a1, a2, a3);
311+
}
312+
313+
// Three indices: *c*c*c*
314+
// Return the concrete index corresponding to abs_ind
315+
size_t concretize_3(size_t abs_ind, size_t a1, size_t a2, size_t a3)
316+
{
317+
size_t raw_index = real_to_raw_3(abs_ind, a1, a2, a3);
318+
if (raw_index == 0)
319+
return nndt_under(a1);
320+
else if (raw_index == 1)
321+
return a1;
322+
else if (raw_index == 2)
323+
return nndt_between(a1, a2);
324+
else if (raw_index == 3)
325+
return a2;
326+
else if (raw_index == 4)
327+
return nndt_between(a2, a3);
328+
else if (raw_index == 5)
329+
return a3;
330+
else
331+
return nndt_above(a3);
332+
}
266333

267-
if (index < a1) return 0;
268-
else if (index == a1) return 1;
269-
else if (index > a1 && index < a2) return 2;
270-
else if (index == a2) return 3;
271-
else if (index > a2 && index < a3) return 4;
272-
else if (index == a3) return 5;
273-
else return 6;
334+
int is_precise_3(size_t abs_ind, size_t a1, size_t a2, size_t a3){
335+
size_t raw_ind = real_to_raw_3(abs_ind, a1, a2, a3);
336+
return (raw_ind == 1) || (raw_ind == 3) || (raw_ind == 5);
337+
}
338+
339+
// Add a number to an abs_ind
340+
size_t add_abs_to_conc_3(size_t abs_ind, size_t num, size_t a1, size_t a2, size_t a3){
341+
size_t conc = concretize_3(abs_ind, a1, a2, a3);
342+
return three_abs(conc+num, a1, a2, a3);
343+
}
344+
345+
size_t sub_conc_from_abs_3(size_t abs_ind, size_t num, size_t a1, size_t a2, size_t a3){
346+
size_t conc = concretize_3(abs_ind, a1, a2, a3);
347+
assert(conc >= num);
348+
return three_abs(conc-num, a1, a2, a3);
274349
}
275350

276351
//Get the abstraction of an index for shape *cc*cc*.

regression/abstraction/specs/aws_array_eq.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
"function": "aws_array_eq_harness",
66
"name": "aws_array_eq_harness::1::rhs",
77
"shape": {
8-
"indices": ["cncrt", "length"],
8+
"indices": ["cncrt0", "cncrt", "length"],
99
"assumptions": [
10+
"cncrt0==0",
11+
"cncrt0<cncrt",
1012
"cncrt<length"
1113
],
12-
"shape-type": "*c*l"
14+
"shape-type": "c*c*l"
1315
},
1416
"abst-function-file": "../abst-funcs.c",
1517
"abst-functions":{
16-
"add-abs-conc": "add_abs_to_conc_2",
17-
"sub-abs-conc": "sub_conc_from_abs_2",
18-
"precise-check": "is_precise_2",
19-
"abstract-index": "two_abs",
20-
"concretize-index": "concretize",
18+
"add-abs-conc": "add_abs_to_conc_3",
19+
"sub-abs-conc": "sub_conc_from_abs_3",
20+
"precise-check": "is_precise_3",
21+
"abstract-index": "three_abs",
22+
"concretize-index": "concretize_3",
2123
"multiply-indices": null,
2224
"mod-indices": null
2325
},

src/goto-instrument/abstraction_spect.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ class abstraction_spect
172172
compare_indices_func(_spec.compare_indices_func),
173173
addition_func(_spec.addition_func),
174174
minus_func(_spec.minus_func),
175-
abstract_func(_spec.abstract_func)
175+
abstract_func(_spec.abstract_func),
176+
spect_index(_spec.spect_index)
176177
{
177178
}
178179

0 commit comments

Comments
 (0)