From: Al Viro <viro@ftp.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, linux-sparse@vger.kernel.org
Subject: Re: [PATCH 16/16] fix handling of integer constant expressions
Date: Sun, 24 Jun 2007 19:35:47 +0100 [thread overview]
Message-ID: <20070624183547.GA21478@ftp.linux.org.uk> (raw)
In-Reply-To: <alpine.LFD.0.98.0706241102160.3593@woody.linux-foundation.org>
On Sun, Jun 24, 2007 at 11:04:57AM -0700, Linus Torvalds wrote:
>
>
> On Sun, 24 Jun 2007, Al Viro wrote:
> >
> > Heh... The first catches are lovely:
> > struct fxsrAlignAssert {
> > int _:!(offsetof(struct task_struct,
> > thread.i387.fxsave) & 15);
>
> Ok, that's a bit odd.
>
> > as an idiotic way to do BUILD_BUG() and
> > #define _IOC_TYPECHECK(t) \
> > ((sizeof(t) == sizeof(t[1]) && \
> > sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
> > sizeof(t) : __invalid_size_argument_for_IOC)
> > poisoning _IOW() et.al., so those who do something like
> >
> > static const char *v4l1_ioctls[] = {
> > [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
>
> On the other hand, this one really does seem to be "nice".
Why? I'd say it's not better than BUILD_BUG_ON_ZERO() use
instead of that ?:. This code would remain unchanged; the
entire reason why we run into problems is that a way to
force an error at build time had produced something that
was not a constant expression. It's not a matter of having
to change something in the users of that sucker (or _IOC_NR(), or
_IOR(), or _IO()). The code in question is there for one thing -
to give (constant) sizeof(t) or an error if t doesn't look good for
us. That's all. And we have a perfectly good way to do that...
> I don't think it's a misfeature to be able to do "obvious compile-time
> constant optimizations" on initializer indexes. The bitfield size thing in
> some ways does do the same thing - it's clearly _odd_, but if I had my
> choice, I'd prefer a language that allows it over one that doesn't.
Er... That's nice, assuming you don't suddenly run into "code with
convoluted bunch of macros breaks on a different version of compiler
and/or different CFLAGS".
IOW, having the optimizer strength define the boundary between the programs
that compile and ones that give an error is not a good idea, IMO.
Where do you place that boundary? Is 0 && n good? How about 0 & n?
Or 0 * n? Or n - n? Or (n+1)-(n+1) from macro expansion? Note that
gcc does _not_ take the last one as integer constant expression, but
happens to deal with the earlier ones. OTOH, it does deal with n * m - n * m.
And I would not bet a dime on gcc versions being consistent with each other
in that area.
Now, there is one possible answer that makes some sense - allow removal
of unevaluated parts in &&, || and ?:. I can do that, but I'm not
sure if it's actually worth doing. The only case in the kernel tree
become more readable with use of BUILD_BUG_ON_ZERO() anyway and I would
be very surprised to find any real code where something of that kind
would be a problem.
> > Objections? The only reason that doesn't break gcc to hell and back is
> > that gcc has unfixed bugs in that area. It certainly is not a valid C
> > or even a remotely sane one.
>
> I agree that it's obviously not "valid C", but I don't agree that it's not
> remotely sane. Why not allow that extension?
Because it's not well-defined and because having "let me check if this
version of compiler will eat that" as the only way to tell if construct
would be OK is not a good thing...
next prev parent reply other threads:[~2007-06-24 18:35 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-24 8:05 [PATCH 16/16] fix handling of integer constant expressions Al Viro
2007-06-24 17:47 ` Al Viro
2007-06-24 18:04 ` Linus Torvalds
2007-06-24 18:35 ` Al Viro [this message]
2007-06-24 19:04 ` Linus Torvalds
2007-06-24 19:40 ` Segher Boessenkool
2007-06-24 20:38 ` Al Viro
2007-06-24 21:42 ` Neil Booth
2007-06-24 23:07 ` Al Viro
2007-06-25 6:16 ` Segher Boessenkool
2007-06-25 5:31 ` Josh Triplett
2007-06-25 19:55 ` Al Viro
2007-06-26 3:12 ` Josh Triplett
2007-06-26 22:10 ` Al Viro
2007-06-26 22:10 ` Al Viro
2007-06-26 22:11 ` Al Viro
2007-06-26 22:11 ` Al Viro
2007-06-26 23:32 ` Neil Booth
2007-06-27 0:18 ` Al Viro
2007-06-27 0:25 ` Linus Torvalds
2007-06-27 0:37 ` Al Viro
2007-06-27 0:29 ` Derek M Jones
2007-06-27 0:41 ` Al Viro
2007-06-27 11:52 ` Neil Booth
2007-06-27 12:19 ` Al Viro
2007-06-27 12:26 ` Neil Booth
2007-06-27 12:37 ` Al Viro
2007-06-27 12:10 ` Neil Booth
2007-06-27 12:30 ` Al Viro
2007-06-27 12:59 ` Neil Booth
2007-06-27 13:18 ` Al Viro
2007-06-27 13:35 ` Neil Booth
2007-06-27 14:06 ` Al Viro
2007-06-27 15:54 ` Al Viro
2007-06-27 14:50 ` Josh Triplett
2007-06-27 14:59 ` Al Viro
2007-06-27 16:19 ` Linus Torvalds
2007-06-27 16:34 ` Josh Triplett
2007-06-27 17:25 ` Al Viro
2007-06-27 17:29 ` Al Viro
2007-06-27 17:45 ` Linus Torvalds
2007-06-27 18:04 ` Al Viro
2007-06-27 22:50 ` Neil Booth
2007-06-28 9:08 ` Segher Boessenkool
2007-06-26 22:49 ` Josh Triplett
2007-06-25 6:13 ` Segher Boessenkool
2007-06-24 19:59 ` Al Viro
2007-06-24 18:07 ` Arnd Bergmann
2007-06-24 19:10 ` Al Viro
2007-06-24 18:18 ` Segher Boessenkool
2007-06-24 18:44 ` Al Viro
2007-06-24 19:09 ` Segher Boessenkool
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070624183547.GA21478@ftp.linux.org.uk \
--to=viro@ftp.linux.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.