Skip to content

Commit 586e3a8

Browse files
committed
Add timeouts from cerberus issues #856 and #844
1 parent 0ef9738 commit 586e3a8

File tree

4 files changed

+172
-0
lines changed

4 files changed

+172
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Filed by @lwli11, see https://github.com/rems-project/cerberus/issues/856
2+
3+
#include <limits.h>
4+
5+
int case_timeout(int a, int b){
6+
if (a==0 || b==0){
7+
return 0;
8+
}
9+
else if (a > 0 && b>0 && INT_MAX / b > a){
10+
return a*b;
11+
}
12+
else if (a>0 && b <0 && b > INT_MIN/a){
13+
return a*b;
14+
}
15+
else if (a<0 && b>0 && a > INT_MIN / b){
16+
return a*b;
17+
}
18+
else if (a<0 && b<0 && b > INT_MAX / a){
19+
return a*b;
20+
}
21+
return 0;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Filed by @lwli11, see https://github.com/rems-project/cerberus/issues/856
2+
3+
#include <limits.h>
4+
5+
int mult_timeout(int a, int b){
6+
if (a > 0 && b>0 && INT_MAX / b > a){
7+
return a*b;
8+
}
9+
return 0;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Filed by @lwli11, see https://github.com/rems-project/cerberus/issues/844
2+
3+
#include <stdint.h>
4+
5+
extern int pow(int a, int b);
6+
/*@
7+
spec pow(i32 a, i32 b);
8+
requires true;
9+
ensures true;
10+
@*/
11+
12+
typedef struct {
13+
uint16_t x;
14+
uint16_t y;
15+
uint16_t z;
16+
uint16_t a;
17+
uint16_t b;
18+
} example_t;
19+
int overflow_timeout_3var(example_t* p1,example_t* p2)
20+
/*@
21+
requires take x = Owned<example_t>(p1);
22+
take y = Owned<example_t>(p2);
23+
ensures take x2 = Owned<example_t>(p1);
24+
take y2 = Owned<example_t>(p2);
25+
@*/
26+
{
27+
int distance = 0;
28+
29+
if (!((int)p2->x > 0 && (int)p1->x< INT_MIN + (int)p2->x) && !((int)p2->x <0 && (int)p1->x > INT_MAX + (int)p2->x)){
30+
distance += pow((int)p1->x - (int)p2->x, 2);
31+
}
32+
33+
if (!((int)p2->y > 0 && (int)p1->y < INT_MIN + (int)p2->y) && !((int)p2->y <0 && (int)p1->y > INT_MAX + (int)p2->y)){
34+
35+
int tmp = pow((int)p1->y - (int)p2->y, 2);
36+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
37+
distance +=tmp;
38+
}
39+
}
40+
41+
if (!((int)p2->z > 0 && (int)p1->z < INT_MIN + (int)p2->z) && !((int)p2->z <0 && (int)p1->z > INT_MAX + (int)p2->z)){
42+
int tmp = pow((int)p1->z - (int)p2->z, 2);
43+
44+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
45+
distance +=tmp;
46+
}
47+
48+
}
49+
/* // 4var version - takes longer
50+
if (!((int)p2->a > 0 && (int)p1->a < INT_MIN + (int)p2->a) && !((int)p2->a <0 && (int)p1->a > INT_MAX + (int)p2->a)){
51+
int tmp = pow((int)p1->a - (int)p2->a, 2);
52+
53+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
54+
distance +=tmp;
55+
}
56+
}
57+
// 5var version - doesn't terminate
58+
if (!((int)p2->b > 0 && (int)p1->b < INT_MIN + (int)p2->b) && !((int)p2->b <0 && (int)p1->b > INT_MAX + (int)p2->b)){
59+
int tmp = pow((int)p1->b - (int)p2->b, 2);
60+
61+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
62+
distance +=tmp;
63+
}
64+
}
65+
66+
*/
67+
return distance;
68+
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Filed by @lwli11, see https://github.com/rems-project/cerberus/issues/844
2+
3+
#include <stdint.h>
4+
5+
extern int pow(int a, int b);
6+
/*@
7+
spec pow(i32 a, i32 b);
8+
requires true;
9+
ensures true;
10+
@*/
11+
12+
typedef struct {
13+
uint16_t x;
14+
uint16_t y;
15+
uint16_t z;
16+
uint16_t a;
17+
uint16_t b;
18+
} example_t;
19+
int overflow_timeout_4var(example_t* p1,example_t* p2)
20+
/*@
21+
requires take x = Owned<example_t>(p1);
22+
take y = Owned<example_t>(p2);
23+
ensures take x2 = Owned<example_t>(p1);
24+
take y2 = Owned<example_t>(p2);
25+
@*/
26+
{
27+
int distance = 0;
28+
29+
if (!((int)p2->x > 0 && (int)p1->x< INT_MIN + (int)p2->x) && !((int)p2->x <0 && (int)p1->x > INT_MAX + (int)p2->x)){
30+
distance += pow((int)p1->x - (int)p2->x, 2);
31+
}
32+
33+
if (!((int)p2->y > 0 && (int)p1->y < INT_MIN + (int)p2->y) && !((int)p2->y <0 && (int)p1->y > INT_MAX + (int)p2->y)){
34+
35+
int tmp = pow((int)p1->y - (int)p2->y, 2);
36+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
37+
distance +=tmp;
38+
}
39+
}
40+
41+
if (!((int)p2->z > 0 && (int)p1->z < INT_MIN + (int)p2->z) && !((int)p2->z <0 && (int)p1->z > INT_MAX + (int)p2->z)){
42+
int tmp = pow((int)p1->z - (int)p2->z, 2);
43+
44+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
45+
distance +=tmp;
46+
}
47+
48+
}
49+
50+
// 4var version - takes longer
51+
if (!((int)p2->a > 0 && (int)p1->a < INT_MIN + (int)p2->a) && !((int)p2->a <0 && (int)p1->a > INT_MAX + (int)p2->a)){
52+
int tmp = pow((int)p1->a - (int)p2->a, 2);
53+
54+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
55+
distance +=tmp;
56+
}
57+
}
58+
59+
/* // 5var version - doesn't terminate
60+
if (!((int)p2->b > 0 && (int)p1->b < INT_MIN + (int)p2->b) && !((int)p2->b <0 && (int)p1->b > INT_MAX + (int)p2->b)){
61+
int tmp = pow((int)p1->b - (int)p2->b, 2);
62+
63+
if (!(tmp > 0 && (distance > (INT_MAX - tmp) )) && !(tmp < 0 && (distance < (INT_MIN - tmp) ) )) {
64+
distance +=tmp;
65+
}
66+
}
67+
68+
*/
69+
return distance;
70+
71+
}

0 commit comments

Comments
 (0)