l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
April 21: Google Glass
Next Installfest:
TBD
Latest News:
Mar. 18: Google Glass at LUGOD's April meeting
Page last updated:
2010 Apr 21 13:05

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] loop never exits!
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] loop never exits!



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@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@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@lists.lugod.org
>> > http://lists.lugod.org/mailman/listinfo/vox-tech
>> >
>> _______________________________________________
>> vox-tech mailing list
>> vox-tech@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@lists.lugod.org
>http://lists.lugod.org/mailman/listinfo/vox-tech
_______________________________________________
vox-tech mailing list
vox-tech@lists.lugod.org
http://lists.lugod.org/mailman/listinfo/vox-tech


LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
Sunset Systems
Who graciously hosts our website & mailing lists!