#include <assert.h>
#include <math.h>
#define LARGE_EXP 710
enum operation {
ASIN,
ACOS,
TAN,
SQRT,
LOG,
EXP,
};
enum operation getOperation(void);
double getVal(void);
void main() {
enum operation myOperation = getOperation();
double myVal=getVal(), res;
switch(myOperation) {
case ASIN:
assert( myVal <- 1.0 || myVal > 1.0);
res = asin(myVal);
break;
case ACOS:
assert( myVal < -1.0 || myVal > 1.0);
res = acos(myVal);
break;
case SQRT:
assert( myVal < 0.0);
res = sqrt(myVal);
break;
case LOG:
assert(myVal <= 0.0);
res = log(myVal);
break;
case EXP:
assert(myVal > LARGE_EXP);
res = exp(myVal);
break;
}
}
В этом примере следуйте каждому assert
оператор, Polyspace® считает, что myVal
содержит только те значения, которые делают assert
условие true. Для примера выполните следующие assert(myVal < 1.0);
, Polyspace считает, что myVal
содержит значения менее 1,0.
Когда myVal
используется в качестве аргумента в стандартной функции библиотеки, ее значения недопустимы для функции. Поэтому проверка Invalid use of standard library routine приводит к красной ошибке.
Дополнительные сведения о спецификациях этой проверки для стандартных программ с плавающей точкой см. в разделе Недопустимое использование стандартных стандартных программ с плавающей точкой библиотеки.