From: Andy Isaacson <adi@hexapodia.org>
To: Marc Singer <elf@buici.com>
Cc: Marcel Holtmann <marcel@holtmann.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] spi
Date: Tue, 9 Aug 2005 12:29:20 -0700 [thread overview]
Message-ID: <20050809192920.GC23389@hexapodia.org> (raw)
In-Reply-To: <20050809190500.GA6551@buici.com>
The code in question is
On Tue, Aug 09, 2005 at 12:05:00PM -0700, Marc Singer wrote:
> > > On Mon, Aug 08, 2005 at 07:35:36PM +0200, Marcel Holtmann wrote:
> > > > > > + if (NULL == dev || NULL == driver) {
> > > > if (!dev || !driver) {
> > >
You said:
> > > That's not a guaranteed equivalence in the C standard. Null pointers
> > > may not be zero. I don't think we have any targets that work this
> > > way, however there is nothing wrong with explicitly testing for NULL.
I quoted chapter and verse why that statement is not true:
> > [1] ISO/IEC 9899:1999 6.5.3.3 Unary arithmetic operators
> >
> > (5) The result of the logical negation operator ! is 0 if the value of
> > its operand compares unequal to 0, 1 if the value of its operand
> > compares equal to 0. The result has type int. The expression !E is
> > equivalent to (0==E).
> >
> > [2] ISO/IEC 9899:1999 7.17
> >
> > The following types and macros are defined in the standard header
> > <stddef.h>. ...
> > NULL
> > which expands to an implementation-defined null pointer constant...
> >
> > and 6.3.2.3 Pointers
> > (3) An integer constant expression with the value 0, or such an
> > expression cast to type void *, is called a null pointer constant.
>
> It was explained to me that the !pointer test wasn't guaranteed to be
> equivalent because of the way that the test is handled.
Whoever explained that to you was wrong. 6.5.3.3 is the final word on
how "!x" is interpreted, and it *says* in the *text* that
"!x" === "x!=0". I don't see how this could be any clearer.
> The spec fragments above don't address how the boolean test is
> coerced. Does it cast pointer to an integer and perform the test, or
> does it cast the 0 to a pointer and perform the test. The C++ spec I
> have is vague on this point. The only reference it makes to pointers
> is that the operand for ! may be a pointer.
Because of the equivalence *given in the text of 6.5.3.3* we can simply
follow the money. (I'm not concerned, here, about what ambiguities the
C++ folks may or may not have introduced into their monstrosity. The
Linux kernel is written in C, and the C standard is unambiguous on this
point. Though frankly I'd be suprised if C++ breaks something so
straightforward and useful.)
The section that defines != says
6.5.9 Equality operators
Syntax
(1) equality-expression:
relational-expression
equality-expression == relational-expression
equality-expression != relational-expression
Constraints
(2) One of the following shall hold:
...
-- one operand is a pointer and the other is a null pointer constant.
(5) ... If one operand is a pointer and the other is a null pointer
constant, the null pointer constant is converted to the type of the
pointer. ...
So:
1. !x is defined equivalent to x!=0.
2. 0 is a "null pointer constant".
3. (assuming x is a pointer) 0 will be promoted to pointer type in the
expression "x!=0".
With the facts taken care of, we can move on to
> No, I'm not confused about the representation of a NULL. Keep in mind
> that telling someone what they do or don't
> understand/believe/think/feel is the fast track to being flamed.
On Linux-kernel, being wrong is the fast track to being flamed. When
I'm wrong, I expect to be corrected. (Frankly, I'm wrong and *not*
corrected much more frequently than I find comfortable.) Adjust your
expectations accordingly and you may be more comfortable here.
Your original statement was wrong, so I corrected you (as much to keep
the disinformation level to a low roar, as anything). The code
transformation quoted at the top of this message is both
(1) well-defined by the C standard and (2) in keeping with kernel coding
standards.
HTH, HAND.
-andy
next prev parent reply other threads:[~2005-08-09 19:29 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-10 20:01 [PATCH 3/3] kconfig: linux.pot for all arch Egry Gábor
2005-08-08 9:12 ` [PATCH] spi dmitry pervushin
2005-08-08 10:41 ` Jiri Slaby
2005-08-08 13:16 ` Mark Underwood
2005-08-08 16:41 ` dmitry pervushin
2005-08-08 18:51 ` Mark Underwood
2005-08-08 14:55 ` Greg KH
2005-08-08 17:35 ` Marcel Holtmann
2005-08-08 17:47 ` Marc Singer
2005-08-09 17:54 ` Andy Isaacson
2005-08-09 19:05 ` Marc Singer
2005-08-09 19:29 ` Andy Isaacson [this message]
2005-08-15 7:51 ` Denis Vlasenko
2005-08-08 22:58 ` Andrew Morton
2005-08-10 13:10 ` Pavel Machek
2005-08-08 23:07 david-b
2005-08-09 9:38 ` Mark Underwood
2005-09-26 11:12 SPI dmitry pervushin
2005-09-27 12:43 ` SPI Greg KH
2005-09-27 14:27 ` [spi-devel-general] SPI dmitry pervushin
2005-09-27 14:35 ` Greg KH
2005-09-27 14:49 ` dmitry pervushin
2005-09-27 14:54 ` Greg KH
2005-09-28 13:14 ` [PATCH] SPI dmitry pervushin
2005-09-30 17:59 David Brownell
2005-09-30 18:30 ` Vitaly Wool
2005-09-30 19:20 ` dpervushin
2005-10-03 4:56 David Brownell
2005-10-03 5:01 David Brownell
2005-10-03 6:20 ` Vitaly Wool
2005-10-03 16:26 David Brownell
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=20050809192920.GC23389@hexapodia.org \
--to=adi@hexapodia.org \
--cc=elf@buici.com \
--cc=linux-kernel@vger.kernel.org \
--cc=marcel@holtmann.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).