The following testing code does correctly in VS either with debug or release, and also in GCC. It also does correctly for ICC with debug, but not when optimization enabled (-O2
).
#include <cstdio>
class tClassA{
public:
int m_first, m_last;
tClassA() : m_first(0), m_last(0) {}
~tClassA() {}
bool isEmpty() const {return (m_first == m_last);}
void updateFirst() {m_first = m_first + 1;}
void updateLast() {m_last = m_last + 1;}
void doSomething() {printf("should not reach here\r\n");}
};
int main() {
tClassA q;
while(true) {
while(q.isEmpty()) ;
q.doSomething();
}
return 1;
}
It is supposed to stop at while(q.isEmpty())
. When -O2
enabled under ICC (release), however, it starts to "doSomething" infinitely.
Since this is single-threaded program and isEmpty()
should be evaluated as true
, I can find no reason the ICC should behave in this way? Do I miss anything?
while loop represents the infinite condition as we provide the '1' value inside the loop condition. As we already know that non-zero integer represents the true condition, so this loop will run infinite times. We can also use the goto statement to define the infinite loop.
Compiler: Jolt's compiler enables a developer or user to compile the source code of his or her application to obtain a binary executable that is amenable to infinite loop detection.
In computer programming, an infinite loop (or endless loop) is a sequence of instructions that, as written, will continue endlessly, unless an external intervention occurs ("pull the plug").
you can stop infinity loop in c if you use turbo c compiler so you can use “Ctrl” +”End”.
To avoid ending up in an infinite loop while using a for statement, ensure that the statements in the for() block never change the value of the loop counter variable. If they do, then your loop may either terminate prematurely or it may end up in an infinite loop.
An infinite loop will run forever, but the program can be terminated with the break keyword. In the below example, we will add an if statement to the while loop, and when that condition is met, we will terminate the loop with break .
Because the while (q.isEmpty()) ;
loop contains no statements that can ever cause an externally-visible side-effect, the entire loop is being optimised out of existence. It's the same reason that:
for (int i = 0; i < 10; i++)
;
could be optimised out of existence, as long as i
was not volatile
(stores to volatile
objects are part of the "externally visible" effects of a program).
In the C language, it is actually an outstanding bone of contention as to whether an infinite loop is allowed to be optimised away in this manner (I do not know what the situation is with C++). As far as I know, a consensus has never been reached on this issue - smart and knowledgeable people have taken both sides.
It sure sounds like a bug. Here's a (pretty wild) guess about what reasoning might have lead to it...
After inlining, it sees:
while (q.m_first == q.m_last) /* do nothing */ ;
do_something();
and any sequence of do nothing repeatedly ; do something
can be translated to simply "do something". This falls down if the repeated part is endless (as in this case). But perhaps they don't test their compiling on examples that intentionally have endless looping ;-).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With