...
NaN
values are particularly problematic because they are unordered. That is, the expression NaN == NaN
always returns false
. See (see rule NUM07-J. Do not attempt comparisons with NaN for more information).
Noncompliant Code Example
This noncompliant code example accepts user data without validating it.:
Code Block | ||
---|---|---|
| ||
double currentBalance; // User's cash balance void doDeposit(String userInput) { double val = 0; try { val = Double.valueOf(userInput); } catch (NumberFormatException e) { // Handle input format error } if (val >= Double.MAX_VALUE - currentBalance) { // Handle range error } currentBalance += val; } |
This code will produce produces unexpected results when an exceptional value is entered for val
and subsequently used in calculations or as control values. The user could, for example, input the strings infinity
or NaN
on the command line, which would be parsed by Double.valueOf(String s)
into the floating-point representations of either infinity
or NaN
. All subsequent calculations using these values would be invalid, possibly causing runtime exceptions or enabling denial-of-service (DoS) attacks.
In this noncompliant example, entering NaN
for val
would cause currentBalance
to be set to NaN
, corrupting its value. If this value were used in other expressions, every resulting value would also become NaN
, possibly corrupting important data.
...
Incorrect or missing validation of floating-point input can result in miscalculations and unexpected results, possibly leading to inconsistent program behavior and denial of service.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
NUM08-J | lowLow | probableProbable | mediumMedium | P4 | L3 |
Automated Detection
Automated detection is infeasible in the general case. It could be possible to develop a taint-like analysis that detects many interesting cases.
...
...