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
-- strict thread matches above, loose matches on Subject: below --
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 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.