Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
frama-c
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
frama-c
Commits
5e419212
Commit
5e419212
authored
4 years ago
by
David Bühler
Committed by
Loïc Correnson
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
[libc] math.h: adds behaviors for NaN and infinite cases in pow specifications.
parent
44b8a552
No related branches found
No related tags found
No related merge requests found
Changes
2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
share/libc/math.h
+31
-15
31 additions, 15 deletions
share/libc/math.h
tests/float/oracle/math_builtins.res.oracle
+29
-199
29 additions, 199 deletions
tests/float/oracle/math_builtins.res.oracle
with
60 additions
and
214 deletions
share/libc/math.h
+
31
−
15
View file @
5e419212
...
@@ -637,7 +637,7 @@ extern long double ldexpl(long double x, int exp);
...
@@ -637,7 +637,7 @@ extern long double ldexpl(long double x, int exp);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VAL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -665,7 +665,7 @@ extern double log(double x);
...
@@ -665,7 +665,7 @@ extern double log(double x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALF
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -693,7 +693,7 @@ extern float logf(float x);
...
@@ -693,7 +693,7 @@ extern float logf(float x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -721,7 +721,7 @@ extern long double logl(long double x);
...
@@ -721,7 +721,7 @@ extern long double logl(long double x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VAL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -749,7 +749,7 @@ extern double log10(double x);
...
@@ -749,7 +749,7 @@ extern double log10(double x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALF
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -777,7 +777,7 @@ extern float log10f(float x);
...
@@ -777,7 +777,7 @@ extern float log10f(float x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -809,7 +809,7 @@ extern long double log1pl(long double x);
...
@@ -809,7 +809,7 @@ extern long double log1pl(long double x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VAL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -837,7 +837,7 @@ extern double log2(double x);
...
@@ -837,7 +837,7 @@ extern double log2(double x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALF
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -865,7 +865,7 @@ extern float log2f(float x);
...
@@ -865,7 +865,7 @@ extern float log2f(float x);
ensures infinite_result: \is_plus_infinity(\result);
ensures infinite_result: \is_plus_infinity(\result);
behavior zero:
behavior zero:
assumes zero_arg: \is_finite(x) && x == 0.;
assumes zero_arg: \is_finite(x) && x == 0.;
ensures infinite_result: \is_minus_infinity(\result);
ensures infinite_result: \is_minus_infinity(\result);
// -HUGE_VALL
ensures errno_set: errno == ERANGE;
ensures errno_set: errno == ERANGE;
behavior negative:
behavior negative:
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
assumes negative_arg: \is_minus_infinity(x) || (\is_finite(x) && x < -0.);
...
@@ -958,17 +958,33 @@ extern double hypot(double x, double y);
...
@@ -958,17 +958,33 @@ extern double hypot(double x, double y);
extern
float
hypotf
(
float
x
,
float
y
);
extern
float
hypotf
(
float
x
,
float
y
);
extern
long
double
hypotl
(
long
double
x
,
long
double
y
);
extern
long
double
hypotl
(
long
double
x
,
long
double
y
);
/*@ requires finite_args: \is_finite(x) && \is_finite(y);
/*@
requires finite_logic_res: \is_finite(pow(x, y));
assigns errno, \result \from x, y;
assigns \result \from x, y;
behavior normal:
assumes finite_logic_res: \is_finite(pow(x, y));
ensures finite_result: \is_finite(\result);
ensures finite_result: \is_finite(\result);
ensures errno: errno == ERANGE || errno == \old(errno);
behavior overflow:
assumes infinite_logic_res: !\is_finite(pow(x, y));
ensures infinite_result: !\is_finite(\result);
ensures errno: errno == ERANGE || errno == EDOM || errno == \old(errno);
complete behaviors;
disjoint behaviors;
*/
*/
extern
double
pow
(
double
x
,
double
y
);
extern
double
pow
(
double
x
,
double
y
);
/*@ requires finite_args: \is_finite(x) && \is_finite(y);
/*@
requires finite_logic_res: \is_finite(powf(x, y));
assigns errno, \result \from x, y;
assigns \result \from x, y;
behavior normal:
assumes finite_logic_res: \is_finite(pow(x, y));
ensures finite_result: \is_finite(\result);
ensures finite_result: \is_finite(\result);
ensures errno: errno == ERANGE || errno == \old(errno);
behavior overflow:
assumes infinite_logic_res: !\is_finite(pow(x, y));
ensures infinite_result: !\is_finite(\result);
ensures errno: errno == ERANGE || errno == EDOM || errno == \old(errno);
complete behaviors;
disjoint behaviors;
*/
*/
extern
float
powf
(
float
x
,
float
y
);
extern
float
powf
(
float
x
,
float
y
);
...
...
This diff is collapsed.
Click to expand it.
tests/float/oracle/math_builtins.res.oracle
+
29
−
199
View file @
5e419212
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment