Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Added Martin's begin>end example

If a for or while or for statement uses a loop counter, and increments or decrements it by more than one, it should is safer to use an inequality operator to terminate the loop than using an equality operator.

Noncompliant Code Example

This noncompliant code example may appear to have 5 iterations, but in fact, the loop never terminates.

Code Block
bgColor#FFCCCC

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

Compliant Solution

An inequality comparison guarantees loop termination.

Code Block
bgColor#ccccff
int i;
for ( i = 1; i <= 10; i += 2 ) {
  /* ... */
}

Noncompliant Code Example

It is also important to ensure termination of loops where the start and end values are variables that might not be properly ordered. The following function assumes that begin < end; if this is not the case, the loop will never terminate.

Code Block
bgColor#ffcccc

void f(int begin, int end) {
  int i;
  for (i = begin; i != end; ++i) {
    /* ... */
  }
}

Compliant Solution

Again, an inequality comparison guarantees loop termination. If begin > end the loop never executes its body.

Code Block
bgColor#ccccff

void f(int begin, int end) {
  int i;
  for (i = begin; i &lt; end; ++i) {
    /* ... */
  }
}

Exceptions

MSC21:EX1: If the counter for a loop is 1, and it is known that the starting value of a loop is less than or equal to the ending value, then the equals operator may be used to terminate the loop. Likewise, if the loop counter is -1, and it is known that the starting value of the loop is greater than, or equal to the ending value, then the equals operator may be used to terminate the loop.

Code Block
bgColor#ccccff

int i;
for (i = 1; i == 5; i++) {
  /* ... */
}

Risk Assessment

Testing for exact values runs the risk of a loop terminating much longer than expected, or never terminating at all.

...