public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* comparisons..
@ 2000-07-12 22:58 Andrew Morton
  2000-07-12 23:35 ` comparisons Michael Meissner
  2000-07-12 23:54 ` comparisons Martin v. Loewis
  0 siblings, 2 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-12 22:58 UTC (permalink / raw)
  To: gcc

unsigned long x;
 
int y()
{
        return (x < 0);
}

This is usually a bug.  Is there a way of getting gcc to warn about it?

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 22:58 comparisons Andrew Morton
@ 2000-07-12 23:35 ` Michael Meissner
  2000-07-12 23:48   ` comparisons Andrew Morton
  2000-07-12 23:54 ` comparisons Martin v. Loewis
  1 sibling, 1 reply; 35+ messages in thread
From: Michael Meissner @ 2000-07-12 23:35 UTC (permalink / raw)
  To: Andrew Morton; +Cc: gcc

On Thu, Jul 13, 2000 at 03:45:54AM +0000, Andrew Morton wrote:
> unsigned long x;
>  
> int y()
> {
>         return (x < 0);
> }
> 
> This is usually a bug.  Is there a way of getting gcc to warn about it?

The friendly manual says:

`-W'
     Print extra warning messages for these events:

        * A nonvolatile automatic variable might be changed by a call to
          `longjmp'.  These warnings as well are possible only in
          optimizing compilation.

          The compiler sees only the calls to `setjmp'.  It cannot know
          where `longjmp' will be called; in fact, a signal handler
          could call it at any point in the code.  As a result, you may
          get a warning even when there is in fact no problem because
          `longjmp' cannot in fact be called at the place which would
          cause a problem.

        * A function can return either with or without a value.
          (Falling off the end of the function body is considered
          returning without a value.)  For example, this function would
          evoke such a warning:

               foo (a)
               {
                 if (a > 0)
                   return a;
               }

        * An expression-statement or the left-hand side of a comma
          expression contains no side effects.  To suppress the
          warning, cast the unused expression to void.  For example, an
          expression such as `x[i,j]' will cause a warning, but
          `x[(void)i,j]' will not.

        * An unsigned value is compared against zero with `<' or `<='.

        * A comparison like `x<=y<=z' appears; this is equivalent to
          `(x<=y ? 1 : 0) <= z', which is a different interpretation
          from that of ordinary mathematical notation.

        * Storage-class specifiers like `static' are not the first
          things in a declaration.  According to the C Standard, this
          usage is obsolescent.

        * If `-Wall' or `-Wunused' is also specified, warn about unused
          arguments.

        * A comparison between signed and unsigned values could produce
          an incorrect result when the signed value is converted to
          unsigned.  (But don't warn if `-Wno-sign-compare' is also
          specified.)

        * An aggregate has a partly bracketed initializer.  For
          example, the following code would evoke such a warning,
          because braces are missing around the initializer for `x.h':

               struct s { int f, g; };
               struct t { struct s h; int i; };
               struct t x = { 1, 2, 3 };

        * An aggregate has an initializer which does not initialize all
          members.  For example, the following code would cause such a
          warning, because `x.h' would be implicitly initialized to
          zero:

               struct s { int f, g, h; };
               struct s x = { 3, 4 };

--> gcc -W -S foo.c
foo.c: In function `y':
foo.c:5: warning: comparison of unsigned expression < 0 is always false

-- 
Michael Meissner, Red Hat, Inc.
PMB 198, 174 Littleton Road #3, Westford, Massachusetts 01886, USA
Work:	  meissner@redhat.com		phone: +1 978-486-9304
Non-work: meissner@spectacle-pond.org	fax:   +1 978-692-4482

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 23:35 ` comparisons Michael Meissner
@ 2000-07-12 23:48   ` Andrew Morton
  2000-07-12 23:57     ` comparisons Michael Meissner
  2000-07-13  0:24     ` comparisons Martin v. Loewis
  0 siblings, 2 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-12 23:48 UTC (permalink / raw)
  To: Michael Meissner; +Cc: gcc

Michael Meissner wrote:
> 
> --> gcc -W -S foo.c
> foo.c: In function `y':
> foo.c:5: warning: comparison of unsigned expression < 0 is always false

Drat.  I've wasted your time.  Sorry.

pwold011:/home/morton> gcc -v
Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
gcc version 2.7.2.3

Any chance of a backport? :)

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 22:58 comparisons Andrew Morton
  2000-07-12 23:35 ` comparisons Michael Meissner
@ 2000-07-12 23:54 ` Martin v. Loewis
  1 sibling, 0 replies; 35+ messages in thread
From: Martin v. Loewis @ 2000-07-12 23:54 UTC (permalink / raw)
  To: andrewm; +Cc: gcc

> unsigned long x;
>  
> int y()
> {
>         return (x < 0);
> }
> 
> This is usually a bug.  Is there a way of getting gcc to warn about it?

GCC knows exactly that the expression is zero; with -O2
-fomit-frame-pointer, it generates

y:
	xorl %eax,%eax
	ret

However, what exactly is the "usual" bug here? That an expression can
be computed statically? 

Regards,
Martin

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 23:48   ` comparisons Andrew Morton
@ 2000-07-12 23:57     ` Michael Meissner
  2000-07-13  0:24       ` comparisons Andrew Morton
  2000-07-13  0:24     ` comparisons Martin v. Loewis
  1 sibling, 1 reply; 35+ messages in thread
From: Michael Meissner @ 2000-07-12 23:57 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Michael Meissner, gcc

On Thu, Jul 13, 2000 at 06:46:55AM +0000, Andrew Morton wrote:
> Michael Meissner wrote:
> > 
> > --> gcc -W -S foo.c
> > foo.c: In function `y':
> > foo.c:5: warning: comparison of unsigned expression < 0 is always false
> 
> Drat.  I've wasted your time.  Sorry.

I probably shoudn't have been as flip with the fine manual quote, but I assumed
you were using something recent and just didn't bother reading the
documentation...

> pwold011:/home/morton> gcc -v
> Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
> gcc version 2.7.2.3
> 
> Any chance of a backport? :)

Considering 2.7.2.3 was released something like 4-5 years ago, I seriously
doubt people would be interested in backporting it.

-- 
Michael Meissner, Red Hat, Inc.
PMB 198, 174 Littleton Road #3, Westford, Massachusetts 01886, USA
Work:	  meissner@redhat.com		phone: +1 978-486-9304
Non-work: meissner@spectacle-pond.org	fax:   +1 978-692-4482

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 23:48   ` comparisons Andrew Morton
  2000-07-12 23:57     ` comparisons Michael Meissner
@ 2000-07-13  0:24     ` Martin v. Loewis
  2000-07-13  1:09       ` comparisons Andrew Morton
  1 sibling, 1 reply; 35+ messages in thread
From: Martin v. Loewis @ 2000-07-13  0:24 UTC (permalink / raw)
  To: andrewm; +Cc: meissner, gcc

> Drat.  I've wasted your time.  Sorry.
> 
> pwold011:/home/morton> gcc -v
> Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
> gcc version 2.7.2.3
> 
> Any chance of a backport? :)

mira% kgcc -v             
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/specs
gcc version 2.7.2.3
mira% kgcc -S -W a.c
a.c: In function `y':
a.c:5: warning: unsigned value < 0 is always 0

What do you get?

Martin

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-12 23:57     ` comparisons Michael Meissner
@ 2000-07-13  0:24       ` Andrew Morton
  2000-07-13  1:05         ` comparisons Nick Burrett
  0 siblings, 1 reply; 35+ messages in thread
From: Andrew Morton @ 2000-07-13  0:24 UTC (permalink / raw)
  To: Michael Meissner; +Cc: gcc

Michael Meissner wrote:
> 
> I probably shoudn't have been as flip with the fine manual quote,
> but I assumed you were using something recent and just didn't
> bother reading the documentation...

Oh that's fine.  RTFM is usually the best response.

> > pwold011:/home/morton> gcc -v
> > Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
> > gcc version 2.7.2.3
> >
> > Any chance of a backport? :)
> 
> Considering 2.7.2.3 was released something like 4-5 years ago, I seriously
> doubt people would be interested in backporting it.

Well of course the culprit here is the Linux kernel.  I brought this
issue up earlier today and aviro suggested that it would take "at least
a year of beating" before 3.0 would be anointed as the
compiler-of-choice for the kernel.

This is somewhat at odds with my empirical observations: Linus put out a
kernel the other day which crashed immediately due to a 2.7.2.3 bug and
I think I was the only one who even noticed!

This is an unhappy situation because there is now a very wide spread of
compiler versions being used on the kernel and, to a small extent, it is
costing development/debugging time.

If it were mine I'd say "dammit, we'll use the latest" as this is the
fastest way to get gcc and the kernel up to speed and cooperating.  It's
not a good time in the kernel's life to do this though.

It looks like 2.7.2.3 usage is fading out by default, but in favour of
what, I'm unsure.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  0:24       ` comparisons Andrew Morton
@ 2000-07-13  1:05         ` Nick Burrett
  2000-07-13  1:47           ` comparisons Andrew Morton
  0 siblings, 1 reply; 35+ messages in thread
From: Nick Burrett @ 2000-07-13  1:05 UTC (permalink / raw)
  To: Andrew Morton; +Cc: gcc

Andrew Morton <andrewm@uow.edu.au> writes:

> Michael Meissner wrote:
> > 
> > Considering 2.7.2.3 was released something like 4-5 years ago, I seriously
> > doubt people would be interested in backporting it.
> 
> Well of course the culprit here is the Linux kernel.  I brought this
> issue up earlier today and aviro suggested that it would take "at least
> a year of beating" before 3.0 would be anointed as the
> compiler-of-choice for the kernel.
> 
> This is somewhat at odds with my empirical observations: Linus put out a
> kernel the other day which crashed immediately due to a 2.7.2.3 bug and
> I think I was the only one who even noticed!

I don't think anybody compiles with 2.7.2.3 any longer.

> It looks like 2.7.2.3 usage is fading out by default, but in favour of
> what, I'm unsure.

egcs-2.91.66 (egcs-1.1.2 release) is now the compiler of choice for
building linux kernels.

gcc-2.95.2 generally works on the later 2.2.x series and on the later 2.3.x
and 2.4.0-test kernels, but there's no guarantee. YMMV


Regards,

Nick.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  0:24     ` comparisons Martin v. Loewis
@ 2000-07-13  1:09       ` Andrew Morton
  2000-07-13  1:36         ` comparisons Nick Burrett
                           ` (2 more replies)
  0 siblings, 3 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-13  1:09 UTC (permalink / raw)
  To: Martin v. Loewis; +Cc: meissner, gcc

"Martin v. Loewis" wrote:
> 
> > Drat.  I've wasted your time.  Sorry.
> >
> > pwold011:/home/morton> gcc -v
> > Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
> > gcc version 2.7.2.3
> >
> > Any chance of a backport? :)
> 
> mira% kgcc -v
> Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/specs
> gcc version 2.7.2.3
> mira% kgcc -S -W a.c
> a.c: In function `y':
> a.c:5: warning: unsigned value < 0 is always 0
> 
> What do you get?

Enlightenment :)

The kernel uses -Wall, and this particular warning is not enabled with
-Wall.

Unfortunately using `-W' in the kernel makefiles generates a truckload
of warnings.  Is there a way of unbundling the `if (unsigned < 0)'
warning with a standalone flag?  Like -Wnegative-unsigned?   It appears
not.

The whole reason I brought this up is that someone found an `if
(unsigned < 0)' bug today.  Made my ears prick up.

A useful exercise would be to compile the kernel with `-W' and filter
out all the noise.   I'll do that tonight.

Thanks again.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:09       ` comparisons Andrew Morton
@ 2000-07-13  1:36         ` Nick Burrett
  2000-07-13  1:47           ` comparisons Andrew Morton
  2000-07-13  6:39         ` comparisons Andrew Morton
  2000-07-13  9:44         ` comparisons Gerald Pfeifer
  2 siblings, 1 reply; 35+ messages in thread
From: Nick Burrett @ 2000-07-13  1:36 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Martin v. Loewis, meissner, gcc

Andrew Morton <andrewm@uow.edu.au> writes:

> "Martin v. Loewis" wrote:
> > 
> > > Drat.  I've wasted your time.  Sorry.
> > >
> > > pwold011:/home/morton> gcc -v
> > > Reading specs from /usr/lib/gcc-lib/i686-unknown-linux/2.7.2.3/specs
> > > gcc version 2.7.2.3
> > >
> > > Any chance of a backport? :)
> > 
> > mira% kgcc -v
> > Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3/specs
> > gcc version 2.7.2.3
> > mira% kgcc -S -W a.c
> > a.c: In function `y':
> > a.c:5: warning: unsigned value < 0 is always 0
> > 
> > What do you get?
> 
> Enlightenment :)
> 
> The kernel uses -Wall, and this particular warning is not enabled with
> -Wall.
> 
> Unfortunately using `-W' in the kernel makefiles generates a truckload
> of warnings.  Is there a way of unbundling the `if (unsigned < 0)'
> warning with a standalone flag?  Like -Wnegative-unsigned?   It appears
> not.
> 
> The whole reason I brought this up is that someone found an `if
> (unsigned < 0)' bug today.  Made my ears prick up.

RTFM applies here. You'll find a big section on the additional -W options
that'll do what you need.

Will -Wsign-compare or -Wno-sign-compare do the trick ?
 

Nick.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:05         ` comparisons Nick Burrett
@ 2000-07-13  1:47           ` Andrew Morton
  2000-07-13  9:12             ` comparisons Joe Buck
  0 siblings, 1 reply; 35+ messages in thread
From: Andrew Morton @ 2000-07-13  1:47 UTC (permalink / raw)
  To: Nick Burrett; +Cc: gcc

Nick Burrett wrote:
> 
> I don't think anybody compiles with 2.7.2.3 any longer.

Looks like you're right, Nick.  I do _like_ 2.7.2.3.  It's fast and it's
well understood.  Plus later compilers make bigger object files (whether
this is due to more aggressive alignment I do not know).  I promised
this list two months ago that I'd characterise this difference fully and
have not yet done so.  Sorry.



Just to show I do read TFM occasionally:


From Documentation/Changes:


You will need at least gcc 2.7.2 to compile the kernel.  You currently
have several options for gcc-derived compilers:  gcc 2.7.2.3, various
versions of egcs, the new gcc 2.95 and upcoming gcc 3.0, and
experimental
compilers like pgcc.  For absolute stability, it is still recommended
that gcc 2.7.2.3 be used to compile your kernel.  egcs 1.12 should also
work.  gcc 2.95 is known to have problems, and using pgcc for your
kernel
is just asking for trouble.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:36         ` comparisons Nick Burrett
@ 2000-07-13  1:47           ` Andrew Morton
  0 siblings, 0 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-13  1:47 UTC (permalink / raw)
  To: Nick Burrett; +Cc: Martin v. Loewis, meissner, gcc

Nick Burrett wrote:
> 
> RTFM applies here. You'll find a big section on the additional -W options
> that'll do what you need.
> 
> Will -Wsign-compare or -Wno-sign-compare do the trick ?

Not with 2.7.2.3, at least.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:09       ` comparisons Andrew Morton
  2000-07-13  1:36         ` comparisons Nick Burrett
@ 2000-07-13  6:39         ` Andrew Morton
  2000-07-13  9:11           ` comparisons Joe Buck
  2000-07-28  5:48           ` comparisons Nix
  2000-07-13  9:44         ` comparisons Gerald Pfeifer
  2 siblings, 2 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-13  6:39 UTC (permalink / raw)
  To: Martin v. Loewis, meissner, gcc

Andrew Morton wrote:
> 
> A useful exercise would be to compile the kernel with `-W' and filter
> out all the noise.   I'll do that tonight.

It was hilarious.  Nailed about sixty kernel bugs, some of them
drop-dead box killers.

Please, give us more granular control over the -W warnings!!

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  6:39         ` comparisons Andrew Morton
@ 2000-07-13  9:11           ` Joe Buck
  2000-07-13  9:45             ` comparisons Bruce Korb
  2000-07-13 15:14             ` comparisons Russ Allbery
  2000-07-28  5:48           ` comparisons Nix
  1 sibling, 2 replies; 35+ messages in thread
From: Joe Buck @ 2000-07-13  9:11 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Martin v. Loewis, meissner, gcc

Andrew Morton wrote:

> A useful exercise would be to compile the kernel with `-W' and filter
> out all the noise.   I'll do that tonight.
...
> It was hilarious.  Nailed about sixty kernel bugs, some of them
> drop-dead box killers.
> 
> Please, give us more granular control over the -W warnings!!

Could you be more specific?  Which warnings do you want to enable and
suppress?  There's already a large set of -Wxxx and -Wno-xxx flags.
What's missing?



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:47           ` comparisons Andrew Morton
@ 2000-07-13  9:12             ` Joe Buck
  2000-07-13 14:48               ` comparisons Andi Kleen
  2000-07-13 21:46               ` comparisons Andrew Morton
  0 siblings, 2 replies; 35+ messages in thread
From: Joe Buck @ 2000-07-13  9:12 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Nick Burrett, gcc

> >From Documentation/Changes:
> 
> You will need at least gcc 2.7.2 to compile the kernel.  You currently
> have several options for gcc-derived compilers:  gcc 2.7.2.3, various
> versions of egcs, the new gcc 2.95 and upcoming gcc 3.0, and
> experimental
> compilers like pgcc.  For absolute stability, it is still recommended
> that gcc 2.7.2.3 be used to compile your kernel.  egcs 1.12 should also
> work.  gcc 2.95 is known to have problems, and using pgcc for your
> kernel
> is just asking for trouble.

But the current gcc is not 2.95, it is 2.95.2.  Are there remaining
problems in 2.95.2 that cause difficulties for the Linux kernel?


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  1:09       ` comparisons Andrew Morton
  2000-07-13  1:36         ` comparisons Nick Burrett
  2000-07-13  6:39         ` comparisons Andrew Morton
@ 2000-07-13  9:44         ` Gerald Pfeifer
  2000-07-13 17:12           ` comparisons Andrew Morton
  2 siblings, 1 reply; 35+ messages in thread
From: Gerald Pfeifer @ 2000-07-13  9:44 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Martin v. Loewis, meissner, gcc

On Thu, 13 Jul 2000, Andrew Morton wrote:
> Unfortunately using `-W' in the kernel makefiles generates a truckload
> of warnings.  Is there a way of unbundling the `if (unsigned < 0)'
> warning with a standalone flag?

The questions is: Are the other warnings warranted or not? :-)

You already found several bugs in the kernel, perhaps there are further
ones still in there? And, of course, if you receive warnings you consider
inappropriate (bugs in the compiler?), please let us know!

Gerald
-- 
Gerald "Jerry" pfeifer@dbai.tuwien.ac.at http://www.dbai.tuwien.ac.at/~pfeifer/
Have a look at http://petition.eurolinux.org -- it's not about Linux, btw!

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:11           ` comparisons Joe Buck
@ 2000-07-13  9:45             ` Bruce Korb
  2000-07-13 10:32               ` comparisons Joe Buck
  2000-07-13 15:14             ` comparisons Russ Allbery
  1 sibling, 1 reply; 35+ messages in thread
From: Bruce Korb @ 2000-07-13  9:45 UTC (permalink / raw)
  To: Joe Buck; +Cc: Andrew Morton, Martin v. Loewis, meissner, gcc

Joe Buck wrote:
> > Please, give us more granular control over the -W warnings!!
> 
> Could you be more specific?  Which warnings do you want to enable and
> suppress?  There's already a large set of -Wxxx and -Wno-xxx flags.
> What's missing?

How hard would it be (wondering aloud and not having done 
any research at all)....

to set up an rc-type file at either gcc build time or
gcc run time (or both?) that contained a list of "my" warnings
and allowed someone to merely specify -Wmine on the command
line.  Just wondering....*not* volunteering :-)

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:45             ` comparisons Bruce Korb
@ 2000-07-13 10:32               ` Joe Buck
  0 siblings, 0 replies; 35+ messages in thread
From: Joe Buck @ 2000-07-13 10:32 UTC (permalink / raw)
  To: Bruce Korb; +Cc: Andrew Morton, Martin v. Loewis, meissner, gcc

> How hard would it be (wondering aloud and not having done 
> any research at all)....
> 
> to set up an rc-type file at either gcc build time or
> gcc run time (or both?) that contained a list of "my" warnings
> and allowed someone to merely specify -Wmine on the command
> line.  Just wondering....*not* volunteering :-)

It's not needed; you already have make.  Just put

CFLAGS=-Wthis -Wno-that -Wthis-one-too -Wno-stupid-warning ...

Folks working together on a free software project can standardize
on a set of warnings they think important and set up their makefiles
accordingly.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:12             ` comparisons Joe Buck
@ 2000-07-13 14:48               ` Andi Kleen
  2000-07-13 21:46               ` comparisons Andrew Morton
  1 sibling, 0 replies; 35+ messages in thread
From: Andi Kleen @ 2000-07-13 14:48 UTC (permalink / raw)
  To: Joe Buck; +Cc: gcc

Joe Buck <jbuck@racerx.synopsys.com> writes:

> > >From Documentation/Changes:
> > 
> > You will need at least gcc 2.7.2 to compile the kernel.  You currently
> > have several options for gcc-derived compilers:  gcc 2.7.2.3, various
> > versions of egcs, the new gcc 2.95 and upcoming gcc 3.0, and
> > experimental
> > compilers like pgcc.  For absolute stability, it is still recommended
> > that gcc 2.7.2.3 be used to compile your kernel.  egcs 1.12 should also
> > work.  gcc 2.95 is known to have problems, and using pgcc for your
> > kernel
> > is just asking for trouble.
> 
> But the current gcc is not 2.95, it is 2.95.2.  Are there remaining
> problems in 2.95.2 that cause difficulties for the Linux kernel?

Yes. One function in the Linux/XFS pagebuf code that does a lot of 
long long arithmetic is miscompiled by 2.95.2. It works correctly
with egcs 1.1

-Andi 

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:11           ` comparisons Joe Buck
  2000-07-13  9:45             ` comparisons Bruce Korb
@ 2000-07-13 15:14             ` Russ Allbery
  2000-07-13 17:11               ` comparisons Philipp Thomas
  1 sibling, 1 reply; 35+ messages in thread
From: Russ Allbery @ 2000-07-13 15:14 UTC (permalink / raw)
  To: gcc

Joe Buck <jbuck@racerx.synopsys.com> writes:
> Andrew Morton wrote:

>> Please, give us more granular control over the -W warnings!!

> Could you be more specific?  Which warnings do you want to enable and
> suppress?  There's already a large set of -Wxxx and -Wno-xxx flags.
> What's missing?

The one that I've specifically noticed is the following:  I want most of
the -W warnings and I want all of the -Wall warnings, but I specifically
don't want warnings about unused function parameters for some code
(particularly code that uses a large table of functions to handle
commands, some of which don't care about their arguments) since it's often
too much bother to tag all the unused parameters with gcc-specific
attributes.  I *do* want warnings about unused variables.

-Wall -W gives warnings about both unused variables and unused function
parameters.  -Wall -W -Wno-unused suppresses both.  I can't find a more
finely grained knob to turn.

(Apologies if this is already fixed in the mainline.)

-- 
Russ Allbery (rra@stanford.edu)             < http://www.eyrie.org/~eagle/ >

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13 15:14             ` comparisons Russ Allbery
@ 2000-07-13 17:11               ` Philipp Thomas
  0 siblings, 0 replies; 35+ messages in thread
From: Philipp Thomas @ 2000-07-13 17:11 UTC (permalink / raw)
  To: Russ Allbery; +Cc: gcc

* Russ Allbery (rra@stanford.edu) [20000714 00:15]:

> -Wall -W gives warnings about both unused variables and unused function
> parameters.  -Wall -W -Wno-unused suppresses both.  I can't find a more
> finely grained knob to turn.

There presently isn't one. There was a patch posted on gcc-patches that
would make it possible to turn them on/off seperately but AFAIK, that patch
hasn't been reviewed yet for inclusion.

Philipp

-- 
Philipp Thomas <pthomas@suse.de>
Development, SuSE GmbH, Schanzaecker Str. 10, D-90443 Nuremberg, Germany

#define NINODE  50              /* number of in core inodes */
#define NPROC   30              /* max number of processes */
 	-- Version 7 UNIX for PDP 11, /usr/include/sys/param.h

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:44         ` comparisons Gerald Pfeifer
@ 2000-07-13 17:12           ` Andrew Morton
  2000-07-13 17:30             ` comparisons Russ Allbery
  2000-07-14  4:22             ` comparisons Toon Moene
  0 siblings, 2 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-13 17:12 UTC (permalink / raw)
  To: Gerald Pfeifer; +Cc: Martin v. Loewis, meissner, gcc

Gerald Pfeifer wrote:
> 
> On Thu, 13 Jul 2000, Andrew Morton wrote:
> > Unfortunately using `-W' in the kernel makefiles generates a truckload
> > of warnings.  Is there a way of unbundling the `if (unsigned < 0)'
> > warning with a standalone flag?
> 
> The questions is: Are the other warnings warranted or not? :-)

It generated nine megs of warnings total!

Yes, a lot were warranted, but not really practical.

The most useful ones were:

comparison of unsigned with zero:
	(unsigned < 0)
	(unsigned >= 0)

The empty `if' check found several of these:
	if (some_condition);
		statement;

comparisons like X<=Y<=Z do not have their mathematical meaning
	This happened rarely and was 100% correlated with wrong code.


> You already found several bugs in the kernel, perhaps there are further
> ones still in there? And, of course, if you receive warnings you consider
> inappropriate (bugs in the compiler?), please let us know!

There are probably some bugs hiding behind "comparison between signed
and unsigned", but I didn't check these - there were many hundreds.

  I'm told that the compiler will warn for this code:

	unsigned int i;
        if (i > 5)      /* 'i' is unsigned, '5' is signed, so warn */

  which makes this warning hard to use more than occasionally.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13 17:12           ` comparisons Andrew Morton
@ 2000-07-13 17:30             ` Russ Allbery
  2000-07-13 17:48               ` comparisons Michael Meissner
  2000-07-14  4:22             ` comparisons Toon Moene
  1 sibling, 1 reply; 35+ messages in thread
From: Russ Allbery @ 2000-07-13 17:30 UTC (permalink / raw)
  To: gcc

Andrew Morton <andrewm@uow.edu.au> writes:

> There are probably some bugs hiding behind "comparison between signed
> and unsigned", but I didn't check these - there were many hundreds.

This is a rather interesting warning.  I've recently gone through the
exercise of making some code free of this warning, and I'm convinced that
it results in higher code quality, but it does require some work.  Most
code that I see plays fairly rough and loose with whether things are
signed or unsigned and gets away with it because the values that it deals
with are never high enough to cause a problem.  To be really correct, code
should care and deal with those boundary cases correctly.

Unfortunately, fixing these warnings often requires a good bit of fiddling
and can have some propagation effects similar to trying to const-ify old
code that makes fixing them all sometimes impractical for old code bases.

I don't think a lot of C programmers pay enough attention to signed vs.
unsigned issues, including a lot of interface designers.  Note, for
example, the interface to write:

  ssize_t write(int fildes, const void *buf, size_t nbyte);

What *do* you return if you can successfully write out as one block more
data than will fit in the range of ssize_t, but that will fit into size_t
(which is normally twice as large on the positive end)?  :)

-- 
Russ Allbery (rra@stanford.edu)             < http://www.eyrie.org/~eagle/ >

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13 17:30             ` comparisons Russ Allbery
@ 2000-07-13 17:48               ` Michael Meissner
  0 siblings, 0 replies; 35+ messages in thread
From: Michael Meissner @ 2000-07-13 17:48 UTC (permalink / raw)
  To: Russ Allbery; +Cc: gcc

On Thu, Jul 13, 2000 at 05:30:30PM -0700, Russ Allbery wrote:
> I don't think a lot of C programmers pay enough attention to signed vs.
> unsigned issues, including a lot of interface designers.  Note, for
> example, the interface to write:
> 
>   ssize_t write(int fildes, const void *buf, size_t nbyte);
> 
> What *do* you return if you can successfully write out as one block more
> data than will fit in the range of ssize_t, but that will fit into size_t
> (which is normally twice as large on the positive end)?  :)

-1 with errno set to EINVAL (and do no writing).

In this one small case, I think Microsoft actually got the interface right,
since they separate # of bytes written from the error value, so for example,
you can say that you wrote 2 megabytes of data before the error occurred.

-- 
Michael Meissner, Red Hat, Inc.
PMB 198, 174 Littleton Road #3, Westford, Massachusetts 01886, USA
Work:	  meissner@redhat.com		phone: +1 978-486-9304
Non-work: meissner@spectacle-pond.org	fax:   +1 978-692-4482

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  9:12             ` comparisons Joe Buck
  2000-07-13 14:48               ` comparisons Andi Kleen
@ 2000-07-13 21:46               ` Andrew Morton
  1 sibling, 0 replies; 35+ messages in thread
From: Andrew Morton @ 2000-07-13 21:46 UTC (permalink / raw)
  To: Joe Buck; +Cc: gcc

Joe Buck wrote:
> 
> 
> But the current gcc is not 2.95, it is 2.95.2.  Are there remaining
> problems in 2.95.2 that cause difficulties for the Linux kernel?

I don't know, Joe.

Cruising recent postings doesn't give anything very substantive:



From:  Artur Skawina

gcc2.96 miscompiles eg sys_fork(), one workaround is:

  # turn off broken sibling call optimizations
  CFLAGS += $(shell if $(CC) -fno-optimize-sibling-calls -S -o /dev/null
-xc /dev/null >/dev/null 2>&1; then
echo "-fno-optimize-sibling-calls"; fi)

From: Alan Cox

2.96 still fails to get you working x86 kernels although how
much of that is gcc and how much kernel stuff is unknown



I'm not aware of any issues with 2.95.2 though.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13 17:12           ` comparisons Andrew Morton
  2000-07-13 17:30             ` comparisons Russ Allbery
@ 2000-07-14  4:22             ` Toon Moene
  2000-07-14 10:57               ` comparisons Richard Henderson
                                 ` (2 more replies)
  1 sibling, 3 replies; 35+ messages in thread
From: Toon Moene @ 2000-07-14  4:22 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Gerald Pfeifer, Martin v. Loewis, meissner, gcc

Andrew Morton wrote:

[ ... This looks a lot like what happened when we first turned on 
      warnings while building gcc ... ]

>   I'm told that the compiler will warn for this code:
> 
>         unsigned int i;
>         if (i > 5)      /* 'i' is unsigned, '5' is signed, so warn */
> 
>   which makes this warning hard to use more than occasionally.

I always wondered whether it would be possible to drop the warning in
case the signed constant has the same value when interpreted as an
unsigned value.  Obviously, it is useful to compare an unsigned variable
against a _positive_ constant, even if it - strictly according to the
rules - should be interpreted as a signed quantity.  Or is this a
promotion-hair issue ?

[ Take this for what it's worth - Fortran doesn't know of unsigned
  quantities, and we're all the happier because of it ;-) ]

-- 
Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html
GNU Fortran 95: http://g95.sourceforge.net/ (under construction)

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14  4:22             ` comparisons Toon Moene
@ 2000-07-14 10:57               ` Richard Henderson
  2000-07-14 12:43                 ` comparisons Toon Moene
  2000-07-14 14:00               ` comparisons Martin v. Loewis
  2000-07-15 17:35               ` comparisons Joe Buck
  2 siblings, 1 reply; 35+ messages in thread
From: Richard Henderson @ 2000-07-14 10:57 UTC (permalink / raw)
  To: Toon Moene; +Cc: Andrew Morton, Gerald Pfeifer, Martin v. Loewis, meissner, gcc

On Fri, Jul 14, 2000 at 01:14:59PM +0200, Toon Moene wrote:
> I always wondered whether it would be possible to drop the warning in
> case the signed constant has the same value when interpreted as an
> unsigned value.

We do do this.


r~

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14 10:57               ` comparisons Richard Henderson
@ 2000-07-14 12:43                 ` Toon Moene
  2000-07-14 12:52                   ` comparisons Richard Henderson
  0 siblings, 1 reply; 35+ messages in thread
From: Toon Moene @ 2000-07-14 12:43 UTC (permalink / raw)
  To: Richard Henderson; +Cc: gcc

Richard Henderson wrote:

> On Fri, Jul 14, 2000 at 01:14:59PM +0200, Toon Moene wrote:
> > I always wondered whether it would be possible to drop the warning in
> > case the signed constant has the same value when interpreted as an
> > unsigned value.

> We do do this.

Well, the simple example works, but then why does gcc warn on
loop.c:9839:

             && VARRAY_INT (n_times_set, REGNO (SET_DEST (set))) == 1

?

-- 
Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html
GNU Fortran 95: http://g95.sourceforge.net/ (under construction)

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14 12:43                 ` comparisons Toon Moene
@ 2000-07-14 12:52                   ` Richard Henderson
  2000-07-14 13:53                     ` comparisons Toon Moene
  0 siblings, 1 reply; 35+ messages in thread
From: Richard Henderson @ 2000-07-14 12:52 UTC (permalink / raw)
  To: Toon Moene; +Cc: gcc

On Fri, Jul 14, 2000 at 09:01:34PM +0200, Toon Moene wrote:
> Well, the simple example works, but then why does gcc warn on
> 
>              && VARRAY_INT (n_times_set, REGNO (SET_DEST (set))) == 1

Something inside the VARRAY_INT?  Something inside REGNO or SET_DEST,
if you have rtl checking on.


r~

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14 12:52                   ` comparisons Richard Henderson
@ 2000-07-14 13:53                     ` Toon Moene
  0 siblings, 0 replies; 35+ messages in thread
From: Toon Moene @ 2000-07-14 13:53 UTC (permalink / raw)
  To: Richard Henderson; +Cc: gcc

Richard Henderson wrote:

> On Fri, Jul 14, 2000 at 09:01:34PM +0200, Toon Moene wrote:

> > Well, the simple example works, but then why does gcc warn on
> >
> >              && VARRAY_INT (n_times_set, REGNO (SET_DEST (set))) == 1

> Something inside the VARRAY_INT?  Something inside REGNO or SET_DEST,
> if you have rtl checking on.

Oops - I forgot to say:  This is with --disable-checking (both on
i686-pc-linux-gnu and alphaev6-unknown-linux-gnu).

Without checking, there's not much "inside" VARRAY_INT (it's a simple
"accessor macro") ...

-- 
Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html
GNU Fortran 95: http://g95.sourceforge.net/ (under construction)

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14  4:22             ` comparisons Toon Moene
  2000-07-14 10:57               ` comparisons Richard Henderson
@ 2000-07-14 14:00               ` Martin v. Loewis
  2000-07-15 17:35               ` comparisons Joe Buck
  2 siblings, 0 replies; 35+ messages in thread
From: Martin v. Loewis @ 2000-07-14 14:00 UTC (permalink / raw)
  To: toon; +Cc: andrewm, pfeifer, meissner, gcc

> I always wondered whether it would be possible to drop the warning in
> case the signed constant has the same value when interpreted as an
> unsigned value.  Obviously, it is useful to compare an unsigned variable
> against a _positive_ constant, even if it - strictly according to the
> rules - should be interpreted as a signed quantity.  Or is this a
> promotion-hair issue ?

The warning is not justified in this case. The integer constant is
converted into an unsigned integer, and standard C guarantees that
there will be no change in value due to this conversion. So writing

  x > 5

is guaranteed to be the same thing as

  x > 5U

Regards,
Martin

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-14  4:22             ` comparisons Toon Moene
  2000-07-14 10:57               ` comparisons Richard Henderson
  2000-07-14 14:00               ` comparisons Martin v. Loewis
@ 2000-07-15 17:35               ` Joe Buck
  2 siblings, 0 replies; 35+ messages in thread
From: Joe Buck @ 2000-07-15 17:35 UTC (permalink / raw)
  To: Toon Moene; +Cc: Andrew Morton, pfeifer

Andrew Morton wrote:
> >   I'm told that the compiler will warn for this code:
> > 
> >         unsigned int i;
> >         if (i > 5)      /* 'i' is unsigned, '5' is signed, so warn */
> > 
> >   which makes this warning hard to use more than occasionally.

You were told incorrectly.  Try it.  You will not get a warning.
Perhaps you were thinking of the inverse case:

        int i;
	if (i > 5U) ...

Here you WILL get a warning.  The reason for the warning is that
converting a negative int to unsigned produces a large positive value:

	int i = -1;
	if (i > 5U)
		SURPRISE;

is, indeed, surprising.

There are cases where gcc is too stupid to know that a signed-unsigned
comparison is safe.  A typical example is

int bar (int i, unsigned u)
{
    if (i >= 0 && i > u)
	return 3;
    else
	return 2;
}

we get "warning: comparison between signed and unsigned".  This
comparison is safe because we've already assured that i is non-negative
before comparing to u, but for gcc to know that it would need to implement
some kind of range propagation.  To silence the warning you have to write

    if (i >= 0 && (unsigned)i > u)

Toon writes:
> I always wondered whether it would be possible to drop the warning in
> case the signed constant has the same value when interpreted as an
> unsigned value.

Not only is it possible, but this is how gcc has worked for years.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13  6:39         ` comparisons Andrew Morton
  2000-07-13  9:11           ` comparisons Joe Buck
@ 2000-07-28  5:48           ` Nix
  1 sibling, 0 replies; 35+ messages in thread
From: Nix @ 2000-07-28  5:48 UTC (permalink / raw)
  To: gcc

Andrew Morton <andrewm@uow.edu.au> writes:

> Please, give us more granular control over the -W warnings!!

I have patches for 2.95.2 that do most of that. I'll finish them off and
port them forward to the mainline this weekend.


btw, I have at last succeeded in extracting a disclaimer from my
employers (it took two months) after they abruptly changed my terms and
conditions on me to include a truly penal IP clause; essentially
`everything you do is ours'. Accordingly I can get back to doing GCC
stuff without feeling guilty, and I can send in the assignment (and
disclaimer) at last.

-- 
`I can guarantee it's no problem in my network, and if I don't get some
 sleep soon, I'll guarantee it will become a problem in your network.'
     --- Chris `Saundo' Saunderson deals with a late-night phone call

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
  2000-07-13 10:09 comparisons Phil Edwards
@ 2000-07-13 11:18 ` Michael Meissner
  0 siblings, 0 replies; 35+ messages in thread
From: Michael Meissner @ 2000-07-13 11:18 UTC (permalink / raw)
  To: Phil Edwards; +Cc: bkorb, gcc

On Thu, Jul 13, 2000 at 01:10:13PM -0400, Phil Edwards wrote:
> 
> Bruce Korb <bkorb@sco.COM>:
> > How hard would it be (wondering aloud and not having done 
> > any research at all)....
> >
> > to set up an rc-type file at either gcc build time or
> > gcc run time (or both?) that contained a list of "my" warnings
> > and allowed someone to merely specify -Wmine on the command
> > line.  Just wondering....*not* volunteering :-)
> 
> I and some of my coworkers have occasionally created ancilliary 4- and
> 5-line specs files, and use those to augment the defaults.  Usually we
> use them to turn on /boatloads/ of extra warnings, but occasionally we
> need some weird -f/-m flags turned on (and we can't modify the makefiles
> for other reasons).
> 
> Then it's just "gcc -specs=.../philspecs" or "gcc -specs=.../bobspecs"
> or, etc.

Or the simple shell script "gcc" that adds the appropriate switches, and then
execs the real gcc, and put that in your path before the real gcc.

-- 
Michael Meissner, Red Hat, Inc.
PMB 198, 174 Littleton Road #3, Westford, Massachusetts 01886, USA
Work:	  meissner@redhat.com		phone: +1 978-486-9304
Non-work: meissner@spectacle-pond.org	fax:   +1 978-692-4482

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: comparisons..
@ 2000-07-13 10:09 Phil Edwards
  2000-07-13 11:18 ` comparisons Michael Meissner
  0 siblings, 1 reply; 35+ messages in thread
From: Phil Edwards @ 2000-07-13 10:09 UTC (permalink / raw)
  To: bkorb; +Cc: gcc

Bruce Korb <bkorb@sco.COM>:
> How hard would it be (wondering aloud and not having done 
> any research at all)....
>
> to set up an rc-type file at either gcc build time or
> gcc run time (or both?) that contained a list of "my" warnings
> and allowed someone to merely specify -Wmine on the command
> line.  Just wondering....*not* volunteering :-)

I and some of my coworkers have occasionally created ancilliary 4- and
5-line specs files, and use those to augment the defaults.  Usually we
use them to turn on /boatloads/ of extra warnings, but occasionally we
need some weird -f/-m flags turned on (and we can't modify the makefiles
for other reasons).

Then it's just "gcc -specs=.../philspecs" or "gcc -specs=.../bobspecs"
or, etc.


Phil

^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2000-07-28  5:48 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-07-12 22:58 comparisons Andrew Morton
2000-07-12 23:35 ` comparisons Michael Meissner
2000-07-12 23:48   ` comparisons Andrew Morton
2000-07-12 23:57     ` comparisons Michael Meissner
2000-07-13  0:24       ` comparisons Andrew Morton
2000-07-13  1:05         ` comparisons Nick Burrett
2000-07-13  1:47           ` comparisons Andrew Morton
2000-07-13  9:12             ` comparisons Joe Buck
2000-07-13 14:48               ` comparisons Andi Kleen
2000-07-13 21:46               ` comparisons Andrew Morton
2000-07-13  0:24     ` comparisons Martin v. Loewis
2000-07-13  1:09       ` comparisons Andrew Morton
2000-07-13  1:36         ` comparisons Nick Burrett
2000-07-13  1:47           ` comparisons Andrew Morton
2000-07-13  6:39         ` comparisons Andrew Morton
2000-07-13  9:11           ` comparisons Joe Buck
2000-07-13  9:45             ` comparisons Bruce Korb
2000-07-13 10:32               ` comparisons Joe Buck
2000-07-13 15:14             ` comparisons Russ Allbery
2000-07-13 17:11               ` comparisons Philipp Thomas
2000-07-28  5:48           ` comparisons Nix
2000-07-13  9:44         ` comparisons Gerald Pfeifer
2000-07-13 17:12           ` comparisons Andrew Morton
2000-07-13 17:30             ` comparisons Russ Allbery
2000-07-13 17:48               ` comparisons Michael Meissner
2000-07-14  4:22             ` comparisons Toon Moene
2000-07-14 10:57               ` comparisons Richard Henderson
2000-07-14 12:43                 ` comparisons Toon Moene
2000-07-14 12:52                   ` comparisons Richard Henderson
2000-07-14 13:53                     ` comparisons Toon Moene
2000-07-14 14:00               ` comparisons Martin v. Loewis
2000-07-15 17:35               ` comparisons Joe Buck
2000-07-12 23:54 ` comparisons Martin v. Loewis
2000-07-13 10:09 comparisons Phil Edwards
2000-07-13 11:18 ` comparisons Michael Meissner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).