One common cause, for example, is that the programmer intends to iterate over a collection of items such as a linked list, executing the loop code once for each item, but improperly formed links which create a reference loop in the list, causing the code to continue forever.
Unexpected behavior of a terminating condition can also cause this problem. Here's an example (in C):
float x = 0.1; while (x != 1.1) { x = x + 0.1; printf("x = %f\n", x); }
On some systems, this loop will run ten times as expected; but on some systems it will never terminate. The problem is that the loop terminating condition ("x != 1.1") tests for exact equality of two floating point values, and the way floating point values are represented in many comptures will make this test fail, because "1.1" cannot be represented exactly. Changing the test to something like "while (x < 1.10001)" will fix the problem (as will not using floating point values for loop indexes).
A similar problem occurs frequently in numerical analysis: in order to compute a certain result, an iteration is intended to be carried out until the error is smaller than a chosen tolerance. However, because of rounding errors during the iteration, the tolerance can never be reached, resulting in an infinite loop.
While most infinite loops can be found by close inspection of the code, there is no general method to determine whether a given program will ever halt or will run forever; this is the undecidability of the Halting problem.
Search Encyclopedia
|
Featured Article
|