From fafd1065f4a1b9841603465b0510a72e5e5e7d5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Thu, 25 Mar 2021 14:19:49 +0100 Subject: [PATCH] [libc] missing specs for errno --- share/libc/math.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/share/libc/math.h b/share/libc/math.h index 2dbd5274d5b..6924d5cab89 100644 --- a/share/libc/math.h +++ b/share/libc/math.h @@ -134,6 +134,7 @@ int __fc_fpclassify(double x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -142,6 +143,7 @@ int __fc_fpclassify(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -153,6 +155,7 @@ extern double acos(double x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -161,6 +164,7 @@ extern double acos(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -172,6 +176,7 @@ extern float acosf(float x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -180,6 +185,7 @@ extern float acosf(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -191,6 +197,7 @@ extern long double acosl(long double x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -199,6 +206,7 @@ extern long double acosl(long double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -210,6 +218,7 @@ extern double asin(double x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -218,6 +227,7 @@ extern double asin(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -229,6 +239,7 @@ extern float asinf(float x); assumes in_domain: \is_finite(x) && \abs(x) <= 1; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || (\is_finite(x) && \abs(x) > 1); ensures nan_result: \is_NaN(\result); @@ -237,6 +248,7 @@ extern float asinf(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -330,6 +342,7 @@ extern long double atan2l(long double y, long double x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -338,6 +351,7 @@ extern long double atan2l(long double y, long double x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -350,6 +364,7 @@ extern double cos(double x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -358,6 +373,7 @@ extern double cos(double x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -370,6 +386,7 @@ extern float cosf(float x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -378,6 +395,7 @@ extern float cosf(float x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -390,6 +408,7 @@ extern long double cosl(long double x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -398,6 +417,7 @@ extern long double cosl(long double x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -410,6 +430,7 @@ extern double sin(double x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -418,6 +439,7 @@ extern double sin(double x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -430,6 +452,7 @@ extern float sinf(float x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures result_domain: -1. <= \result <= 1.; + ensures no_error: errno == \old(errno); behavior infinity: assumes infinite_arg: \is_infinite(x); ensures nan_result: \is_NaN(\result); @@ -438,6 +461,7 @@ extern float sinf(float x); assumes nan_arg: !\is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -453,10 +477,12 @@ extern long double tanl(long double x); assumes in_domain: \is_finite(x) && x >= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior infinite: assumes is_plus_infinity: \is_plus_infinity(x); assigns \result \from x; ensures result_plus_infinity: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_minus_infinity(x) || (\is_finite(x) && x < 1); ensures nan_result: \is_NaN(\result); @@ -465,6 +491,7 @@ extern long double tanl(long double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -476,10 +503,12 @@ extern double acosh(double x); assumes in_domain: \is_finite(x) && x >= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior infinite: assumes is_plus_infinity: \is_plus_infinity(x); assigns \result \from x; ensures result_plus_infinity: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_minus_infinity(x) || (\is_finite(x) && x < 1); ensures nan_result: \is_NaN(\result); @@ -488,6 +517,7 @@ extern double acosh(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -499,10 +529,12 @@ extern float acoshf(float x); assumes in_domain: \is_finite(x) && x >= 1; assigns \result \from x; ensures positive_result: \is_finite(\result) && \result >= 0; + ensures no_error: errno == \old(errno); behavior infinite: assumes is_plus_infinity: \is_plus_infinity(x); assigns \result \from x; ensures result_plus_infinity: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_minus_infinity(x) || (\is_finite(x) && x < 1); ensures nan_result: \is_NaN(\result); @@ -511,6 +543,7 @@ extern float acoshf(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -544,6 +577,7 @@ extern long double tanhl(long double x); assigns \result \from x; ensures res_finite: \is_finite(\result); ensures positive_result: \result > 0.; + ensures no_error: errno == \old(errno); behavior overflow: assumes overflow_arg: \is_finite(x) && x > 0x1.62e42fefa39efp+9; ensures infinite_res: \is_plus_infinity(\result); @@ -552,6 +586,7 @@ extern long double tanhl(long double x); assumes plus_infinity_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinity_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior underflow: assumes underflow_arg: \is_finite(x) && x < -0x1.74910d52d3051p9; ensures zero_res: \result == 0.; @@ -560,10 +595,12 @@ extern long double tanhl(long double x); assumes plus_infinity_arg: \is_minus_infinity(x); assigns \result \from x; ensures zero_result: \is_finite(\result) && \result == 0.; + ensures no_error: errno == \old(errno); behavior nan: assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -577,6 +614,7 @@ extern double exp(double x); assigns \result \from x; ensures res_finite: \is_finite(\result); ensures positive_result: \result > 0.; + ensures no_error: errno == \old(errno); behavior overflow: assumes overflow_arg: \is_finite(x) && x > 0x1.62e42ep+6; ensures infinite_res: \is_plus_infinity(\result); @@ -585,6 +623,7 @@ extern double exp(double x); assumes plus_infinity_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinity_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior underflow: assumes underflow_arg: \is_finite(x) && x < -0x1.9fe368p6; ensures zero_res: \result == 0.; @@ -593,10 +632,12 @@ extern double exp(double x); assumes plus_infinity_arg: \is_minus_infinity(x); assigns \result \from x; ensures zero_result: \is_finite(\result) && \result == 0.; + ensures no_error: errno == \old(errno); behavior nan: assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -631,10 +672,12 @@ extern long double ldexpl(long double x, int exp); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VAL @@ -647,6 +690,7 @@ extern long double ldexpl(long double x, int exp); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -659,10 +703,12 @@ extern double log(double x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALF @@ -675,6 +721,7 @@ extern double log(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -687,10 +734,12 @@ extern float logf(float x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALL @@ -703,6 +752,7 @@ extern float logf(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -715,10 +765,12 @@ extern long double logl(long double x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VAL @@ -731,6 +783,7 @@ extern long double logl(long double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -743,10 +796,12 @@ extern double log10(double x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALF @@ -759,6 +814,7 @@ extern double log10(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -771,10 +827,12 @@ extern float log10f(float x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALL @@ -787,6 +845,7 @@ extern float log10f(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -803,10 +862,12 @@ extern long double log1pl(long double x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VAL @@ -819,6 +880,7 @@ extern long double log1pl(long double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -831,10 +893,12 @@ extern double log2(double x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALF @@ -847,6 +911,7 @@ extern double log2(double x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -859,10 +924,12 @@ extern float log2f(float x); assumes arg_positive: x > 0; assigns \result \from x; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior infinite: assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior zero: assumes zero_arg: \is_finite(x) && x == 0.; ensures infinite_result: \is_minus_infinity(\result); // -HUGE_VALL @@ -875,6 +942,7 @@ extern float log2f(float x); assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -999,6 +1067,7 @@ extern long double powl(long double x, long double y); ensures finite_result: \is_finite(\result); ensures positive_result: \result >= -0.; ensures result_value: \result == sqrt(x); + ensures no_error: errno == \old(errno); behavior negative: assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.); ensures nan_result: \is_NaN(\result); @@ -1007,10 +1076,12 @@ extern long double powl(long double x, long double y); assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior nan: assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -1025,6 +1096,7 @@ extern double sqrt(double x); ensures finite_result: \is_finite(\result); ensures positive_result: \result >= -0.; ensures result_value: \result == sqrt(x); + ensures no_error: errno == \old(errno); behavior negative: assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.); ensures nan_result: \is_NaN(\result); @@ -1033,10 +1105,12 @@ extern double sqrt(double x); assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior nan: assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -1050,6 +1124,7 @@ extern float sqrtf(float x); assigns \result \from x; ensures finite_result: \is_finite(\result); ensures positive_result: \result >= -0.; + ensures no_error: errno == \old(errno); behavior negative: assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.); ensures nan_result: \is_NaN(\result); @@ -1058,10 +1133,12 @@ extern float sqrtf(float x); assumes infinite_arg: \is_plus_infinity(x); assigns \result \from x; ensures infinite_result: \is_plus_infinity(\result); + ensures no_error: errno == \old(errno); behavior nan: assumes nan_arg: \is_NaN(x); assigns \result \from x; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -1317,6 +1394,7 @@ extern long double truncl(long double x); assumes in_domain: !\is_NaN(x) && !\is_NaN(y) && y != 0.; assigns \result \from x, y; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || y == 0.; ensures nan_result: \is_NaN(\result); @@ -1325,6 +1403,7 @@ extern long double truncl(long double x); assumes nan_args: \is_NaN(x) || \is_NaN(y); assigns \result \from x, y; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ @@ -1336,6 +1415,7 @@ extern double fmod(double x, double y); assumes in_domain: !\is_NaN(x) && !\is_NaN(y) && y != 0.; assigns \result \from x, y; ensures finite_result: \is_finite(\result); + ensures no_error: errno == \old(errno); behavior domain_error: assumes out_of_domain: \is_infinite(x) || y == 0.; ensures nan_result: \is_NaN(\result); @@ -1344,6 +1424,7 @@ extern double fmod(double x, double y); assumes nan_args: \is_NaN(x) || \is_NaN(y); assigns \result \from x, y; ensures nan_result: \is_NaN(\result); + ensures no_error: errno == \old(errno); complete behaviors; disjoint behaviors; */ -- GitLab