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: 50+ 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: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 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 NNTP newsgroup(s).