Open
Description
Affected rules
DIR-4-15
\
Description
The first implementation of the rule handles guards of the form isinf
, isnan
, isfinite
, iszero
, etc., however, it doesn't support guards relating to fpclassify()
.
Example
float may_be_inf() {
...
return 1.0/0.0;
}
void fpclassify_guard() {
float x = may_be_inf();
int y;
// error, casting possible infinity to int
y = x;
// example 1: easiest to support:
if (fpclassify(x) != FP_INFINITE) {
// or "fpclassify(x) == FP_NORMAL"
y = x;
}
// example 2: perhaps slightly harder to support, but guards library already has infra for this:
switch(x) {
case FP_NORMAL:
case FP_SUBNORMAL:
case FP_ZERO:
// or, "case FP_INFINITE: break; default:"
y = x;
}
// example 3: this is harder to support but a common pattern:
int cls = fpclassify(x);
if (cls != FP_INFINITE) {
// or "cls == FP_NORMAL || cls == FP_ZERO"
y = x;
}
}