From: Josh Triplett <josht@linux.vnet.ibm.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Neil Booth <neil@daikokuya.co.uk>,
Al Viro <viro@ftp.linux.org.uk>,
Josh Triplett <josh@freedesktop.org>,
Segher Boessenkool <segher@kernel.crashing.org>,
linux-kernel@vger.kernel.org, linux-sparse@vger.kernel.org
Subject: Re: [PATCH 16/16] fix handling of integer constant expressions
Date: Wed, 27 Jun 2007 09:34:55 -0700 [thread overview]
Message-ID: <1182962095.8970.87.camel@josh-work.beaverton.ibm.com> (raw)
In-Reply-To: <alpine.LFD.0.98.0706270910000.8675@woody.linux-foundation.org>
On Wed, 2007-06-27 at 09:19 -0700, Linus Torvalds wrote:
>
> On Wed, 27 Jun 2007, Neil Booth wrote:
> >
> > Here are three independently invalid non-ICEs that sparse doesn't
> > diagnose.
> >
> > extern int f(void);
> > enum { cast_to_ptr = (int) (void *) 0 };
> > enum { cast_to_float = (int) (double) 1 };
>
> Those two *really* shouldn't fail. I don't care if the C standard says so,
> that is *fine*.
[...]
> And I think standards can go screw themselves, and you can make it an
> error with some "--standard-pedantic" switch or similar.
Agreed. Issuing a warning on these kinds of constructs does not seem
useful, but if people really want it, it should go in some warning
option that does not get turned on by default, and probably should not
get turned on by -Wall either.
> > enum { fncall = 0 ? f(): 3 };
>
> Again, I think that's a deficiency of a standard that tries to be
> acceptable to everybody rather than about a "really good language".
>
> So I personally think we should allow it too if at all possible, and
> again, use some "--standard-pedantic" to flag it as an error.
>
> Why? Because things like that may not look sensible when written out, but
> they are often _very_ sensible when they are the result of a macro that
> does some error checking or other thing.
>
> The classic example of this is "__builtin_constant_p()". It is a *great*
> way to make a macro that does different things depending on whether
> something is a compile-time constant or not, and no, it's not standard,
> but dang, it's so useful that a standard that doesn't allow sane use of it
> is basically bogus.
>
> So look at the "ntohl()" kind of thing, and realize that it's just "Good
> Practice(tm)" to be able to make a ntohl() macro that can be used for
> initializers, including very much enum initializers. Ie
>
> enum { defaultport = htons(9418) };
>
> is actually nice code for something like the kernel, but it turns out that
> in order to make this work, you have to do it as
>
> #define htons(x) (__builtin_constant_p(x) ? constant_htons(x) : __htons(x))
>
> and that in turn generates *exactly* the kind of thing you talk of above.
>
> And when you give _your_ example, it looks insane. When I give _my_
> example, it generates exactly the same thing, but suddenly it has a great
> reason for doing so, and it's no longer insane.
Also agreed. Same goes for other short-circuiting operations like &&,
||, and ?: without the center argument; if you can determine at
compilation time that it does not need to evaluate part of the
expression at all, go ahead and ignore that part of the expression even
if it does not constitute an integer constant expression. If you want
to optionally check for this case and issue a diagnostic, put it under
-Wstrict-constant-expressions or similar.
- Josh Triplett
next prev parent reply other threads:[~2007-06-27 16:34 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
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 [this message]
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=1182962095.8970.87.camel@josh-work.beaverton.ibm.com \
--to=josht@linux.vnet.ibm.com \
--cc=josh@freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=neil@daikokuya.co.uk \
--cc=segher@kernel.crashing.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@ftp.linux.org.uk \
/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).