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
|
/* run.config*
OPT: -eva @EVA_CONFIG@ -warn-special-float non-finite
OPT: -eva @EVA_CONFIG@ -warn-special-float nan
OPT: -eva @EVA_CONFIG@ -warn-special-float none
*/
/*@
assigns \result \from x;
behavior normal:
assumes domain_arg: \is_plus_infinity(x) || (\is_finite(x) && x >= 1.);
ensures finite_result: \is_finite(\result);
ensures positive_result: \result >= 0.;
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < 0.);
ensures nan_result: \is_NaN(\result);
behavior infinite:
assumes small_arg: \is_finite(x) && x >= 0. && x < 1.;
ensures infinite_result: \is_plus_infinity(\result);
behavior nan:
assumes nan_arg: \is_NaN(x);
ensures nan_result: \is_NaN(\result);
complete behaviors;
disjoint behaviors;
*/
extern double fun(double x);
/*@
behavior normal:
assumes domain_arg: \is_plus_infinity(x) || (\is_finite(x) && x >= 1.);
assigns \result \from x;
ensures finite_result: \is_finite(\result);
ensures positive_result: \result >= 0.;
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < 0.);
assigns \result \from x;
ensures nan_result: \is_NaN(\result);
behavior infinite:
assumes small_arg: \is_finite(x) && x >= 0. && x < 1.;
assigns \result \from x;
ensures infinite_result: \is_plus_infinity(\result);
behavior nan:
assumes nan_arg: \is_NaN(x);
assigns \result \from x;
ensures nan_result: \is_NaN(\result);
complete behaviors;
disjoint behaviors;
*/
extern double fun_no_default(double x);
/*@
assigns \result \from x;
behavior normal:
assumes domain_arg: \is_plus_infinity(x) || (\is_finite(x) && x >= 1.);
ensures finite_result: \is_finite(\result);
ensures positive_result: \result >= 0.;
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < 0.);
ensures nan_result: \is_NaN(\result);
behavior infinite:
assumes small_arg: \is_finite(x) && x >= 0. && x < 1.;
ensures infinite_result: \is_plus_infinity(\result);
behavior nan:
assumes nan_arg: \is_NaN(x);
ensures nan_result: \is_NaN(\result);
complete behaviors;
*/
extern double fun_no_disjoint(double x);
/*@
assigns \result \from x;
behavior normal:
assumes domain_arg: \is_plus_infinity(x) || (\is_finite(x) && x >= 1.);
ensures finite_result: \is_finite(\result);
ensures positive_result: \result >= 0.;
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < 0.);
ensures nan_result: \is_NaN(\result);
behavior infinite:
assumes small_arg: \is_finite(x) && x >= 0. && x < 1.;
ensures infinite_result: \is_plus_infinity(\result);
behavior nan:
assumes nan_arg: \is_NaN(x);
ensures nan_result: \is_NaN(\result);
disjoint behaviors;
*/
extern double fun_no_complete(double x);
volatile double v;
int main(){
double a = v;
double w = fun(a);
double b = v;
double x = fun_no_default(b); // no default behavior
double c = v;
double y = fun_no_disjoint(c); // no disjoint behaviors
double d = v;
double z = fun_no_complete(d); // no complete behaviors
}
|