Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This noncompliant code example appears to iterate five times.

Code Block
bgColor#FFCCCC

for (i = 1; i != 10; i += 2) {
  // ...
}

However, the loop never terminates because the successive values of i are 1, 3, 5, 7, 9 and 11, allowing the comparison with 10 to be skipped. The value reaches the maximum representable positive number (Integer.MAX_VALUE) and on subsequent incrementing, wraps to the second lowest negative number (Integer.MIN_VALUE + 1). It then works its way up to -1, then 1, and proceeds as described earlier.

Noncompliant Code Example

This noncompliant code example terminates, but takes more iterations than expected.

Code Block
bgColor#FFCCCC
for (i = 1; i != 10; i += 25) {
  // ...
}

Noncompliant Code Example

This noncompliant code example terminates, but takes more iterations than expected. It increments i so that it is 1, 6 and 11, skipping past 10. The value of i then wraps from near the maximum positive value to near the lowest negative value and works its way up toward zero. It assumes 2, 7, and 12, skipping past 10 again. After the value wraps from the high positive to the low negative side three more times, it finally reaches 0, 5, and 10, terminating the loop.

Code Block
bgColor#FFCCCC

for (i = 1; i != 10; i += 5) {
  // ...
}

Compliant Solution

Using a numerical comparison operator guarantees proper loop termination.

...

Numerical comparison operators do not always ensure loop termination when comparing with Integer.MAX_VALUE or Integer.MIN_VALUE.

Code Block
bgColor#FFCCCC
for (i = 1; i <= Integer.MAX_VALUE; i += 2) {
  // ...
}

This usually happens when the step size is more than one.

Compliant Solution

It is insufficient to compare with Integer.MAX_VALUE - 1 when the loop counter is more than 1. To be compliant, ensure that the comparison is carried out with (Integer.MAX_VALUE - counter's value).

...