joey@reed.UUCP (Joe Pruett) (04/18/86)
We recently discovered an interesting gotcha in the Apollo
C compiler. We had code similar to this:
func(x)
int x;
{
int flag;
if (x < 0) {
printf("Bad news\n");
} else {
flag = 1;
}
do {
printf("Hello, world.\n");
} while (!flag);
}
Yes, there is an error in that flag may not get set before it
is used. I was horrified to find out that lint won't catch
this kind of an error. Anyway, the interesting part is that
the compiler determined that the expression !flag would always
be 0, and therefore optimized it away causing the do-while loop
to exit after one pass.
I contend that if the compiler could figure out that flag could
get set to 1, then it should also figure out that flag might not
bet set to anything, and at least issue a warning, but it should
not optimize the expression away.
Is this a bug, or a misfeature, or an inherent gotcha with fancy
optimization?
--
Joe Pruett
Test Systems Strategies, Inc.
...!tektronix!reed!tessi!joeygreg@utcsri.UUCP (Gregory Smith) (04/21/86)
In article <3109@reed.UUCP> joey@reed.UUCP (Joe Pruett) writes: >I contend that if the compiler could figure out that flag could >get set to 1, then it should also figure out that flag might not >bet set to anything, and at least issue a warning, but it should >not optimize the expression away. > >Is this a bug, or a misfeature, or an inherent gotcha with fancy >optimization? I would say that a run-time bug in your code has propogated its way into compile-time - an inherent gotcha. To determine in general that the flag may not be set is probably (?) similar to the halting problem - it can't be done (* In General *) so it will only be detected for simple cases. Lint apparently looks at the textual order of operations - the following draws a warning: int i,j; for(i=1;i<=2;++i){ if(i==2) printf("j = %d\n", j ); j = 123; } Lint will say that j is used before it is set. An example can be set up with goto's { goto b; a: use(j); return; b: j=0; goto a;}. In this case it is more obvious that the code is ok but Lint will still warn. -- "If you aren't making any mistakes, you aren't doing anything". ---------------------------------------------------------------------- Greg Smith University of Toronto UUCP: ..utzoo!utcsri!greg