[vox-tech] loop never exits!
Jeff Newmiler
jdnewmil at dcn.davis.ca.us
Wed Apr 21 12:20:14 PDT 2010
This desire for compiler warnings that DWIM rather than DWIS have been around for a long time, and the usual reply from the compiler coders has been along the lines of "go run lint if you need help interpreting your legal code".
Given your use of unsigned variables, replacing "i >=0" with "1" is exactly what optimizers are supposed to do., because writing code more verbosely than necessary is a documentation decision that only the programmer can make.
Brian Lavender <brian at brie.com> wrote:
>I told the compiler to go through a loop while a certain expression
>evaluates to true. When the expression evalates to false, the loop
>should terminate. If I had provided no expression, or I had provided
>true, or some value that would always evaluate to true, then I would
>expect the compiler to do as I tell it.
>
>I have provided an expression for the loop to terminate that could
>evaluate to false, yet will never evaluate to false.
>
>This determination can be done through static analysis. Hence,
>I am still convinced that the compiler should issue a warning. Yet,
>I am still looking for a contradiction to my theory.
>
>
>
>
>On Tue, Apr 20, 2010 at 08:30:42PM -0700, Matthew Holland wrote:
>> It's not the compiler's job to tell you what you want, it's your job
>> to tell it! The -Wall flag doesn't mean, "warn me about every
>> possible stupid construct I can come up with."
>>
>> In all seriousness, if you don't get over using a "greater than or
>> equal" construct for loop termination, you're going to be in a world
>> of hurt if STL containers ever cross your transom. Just don't do
>> that, and everything will be fine.
>>
>> Matt
>>
>> On Tue, Apr 20, 2010 at 7:44 PM, Brian Lavender <brian at brie.com> wrote:
>> > On Tue, Apr 20, 2010 at 06:54:33PM -0700, Bill Broadley wrote:
>> >> On 04/20/2010 06:37 PM, Brian Lavender wrote:
>> >> > Our new guy (forget his name, doh!) and I figured out the problem with
>> >> > my loop that would count down, but not terminate. Turns out I was using
>> >> > an unsigned integer for my counter in my for loop and it is always
>> >> > greater than zero (Example 1).
>> >>
>> >> No, it's not always greater than zero. Your test says i>=0 so if it's
>> >> greater than or equal to zero it continues. Seems like you want i>0.
>> >
>> > Sorry, I meant to say it's always greater than or equal than zero. zero
>> > minus 1 is 4294967295 (0xffffffff) on a 32 bit machine. It can never go
>> > negative because it is unsigned and the loop will never terminate. Thus,
>> > I am thinking that the compiler could catch this due to the fact that i
>> > is unsigned. I wanted to print out the reverse of an array.
>> >
>> > If you run the following, the loop will never terminate.
>> >
>> > #include <stdio.h>
>> >
>> > int main() {
>> > int a[] = {5,6,8,3,4};
>> > unsigned int i;
>> >
>> >
>> > for (i= (sizeof(a) -1)/sizeof(int) ; i >= 0; i--) {
>> > printf("%d\n",a[i]);
>> > }
>> >
>> > return 0;
>> > }
>> >
>> >>
>> >> > Funny thing is that -Wall didn't catch this. Seems that -Wall could
>> >> > catch this assuming that we want to loop to terminate. Any thoughts?
>> >>
>> >> Seems strange, but legal to do what you wanted.
>> >>
>> >> > Say the compiler gave a warning, would that mess up the "for (;;)"
>> >> > construct shown in Example 2?
>> >> >
>> >> > brian
>> >> >
>> >> > // Example 1
>> >> > // Loop never terminates
>> >> > #include<stdio.h>
>> >> >
>> >> > int main() {
>> >> > unsigned int i, num=50;
>> >> >
>> >> >
>> >> > for (i= num ; i>= 0; i--) {
>> >> > printf("%u\n",i);
>> >> > }
>> >> >
>> >> > return 0;
>> >> > }
>> >> >
>> >> > // Example 2
>> >> > // Purposely never terminates
>> >> > #include<stdio.h>
>> >> >
>> >> > int main() {
>> >> > for (;;) {
>> >> > printf("Hello forever\n");
>> >> > }
>> >> > return 0;
>> >> > }
>> >
>> >
>> >
>> > --
>> > Brian Lavender
>> > http://www.brie.com/brian/
>> >
>> > "For every complex problem there is an answer that is clear, simple, and wrong."
>> > - H. L. Mencken
>> > _______________________________________________
>> > vox-tech mailing list
>> > vox-tech at lists.lugod.org
>> > http://lists.lugod.org/mailman/listinfo/vox-tech
>> >
>> _______________________________________________
>> vox-tech mailing list
>> vox-tech at lists.lugod.org
>> http://lists.lugod.org/mailman/listinfo/vox-tech
>
>--
>Brian Lavender
>http://www.brie.com/brian/
>
>"For every complex problem there is an answer that is clear, simple, and wrong."
>- H. L. Mencken
>_______________________________________________
>vox-tech mailing list
>vox-tech at lists.lugod.org
>http://lists.lugod.org/mailman/listinfo/vox-tech
More information about the vox-tech
mailing list