juniorrantila wrote:
I did some more digging and can't find the exact PDF I was looking for, but in
MISRA 1998, rule 40 states:
Floating-point variables shall not be tested for exact equality or
inequality.
**How the rule is checked**
The compiler will generate an error, indicating a violation of this rule,
if == or != is
applied to a floating-point value. If a comparison is explicitly against
the floating-point
constant 0.0, no error message is given.
In MISRA 2004 (Rule 13.3), they removed the comparison to zero exemption.
However, in MISRA 2012 and onward they removed the floating point comparison
rule altogether, no longer explicitly disallowing floating point equality
comparison,
instead it is indirectly disallowed by other rules. [MISRA C:2012 Rule
10.1](https://la.mathworks.com/help/bugfinder/ref/misrac2012rule10.1.html)
allows comparisons to `0`, `INFINITY` and `-INFINITY`. They clarify this in
(https://misra.org.uk/app/uploads/2022/12/MISRA-C-2012-AMD3.pdf)[MISRA C:2012
Amendment 3] (2.3.7 Amend Rule 10.1), they allow this because there is code
that needs to guard against those specific values, for instance to catch
division by zero.
Static analysis tools seem to commonly allow comparisons to `0` and `INFINITY`
and comparisons where it can prove that the value does not drift, for instance:
```c
for (float v = 0.0f; v != 100.0f, v += 1.0f)
;
```
would be allowed on the grounds that the initializer and the value we increment
by are both integer values, so the float will not drift. See
[Polyspace](https://www.mathworks.com/help/bugfinder/ref/floatingpointcomparisonwithequalityoperators.html).
In my opinion, `0` and `INFINITY` should be allowed by default with this
`-Wfloat-equal`, since you commonly want to guard against those values.
Additionally, we could have a flag that restricts the use of `0`. As for other
float values (other than `0` and `INFINITY`), maybe we should not allow them by
default and provide a flag to allow exact float values, this way, people who
intend to compare to the same bit pattern can still do so.
https://github.com/llvm/llvm-project/pull/207288
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits