Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.std.c > #1750

Re: null pointer constant, address constant

From James Kuyper <jameskuyper@verizon.net>
Newsgroups comp.std.c
Subject Re: null pointer constant, address constant
Date 2012-12-18 15:39 -0500
Organization A noiseless patient Spider
Message-ID <50D0D492.20007@verizon.net> (permalink)
References <kapqt2$es4$1@speranza.aioe.org> <kaq01g$6jp$1@dont-email.me> <kaqibr$gj3$1@speranza.aioe.org>

Show all headers | View raw


On 12/18/2012 03:06 PM, Szabolcs Nagy wrote:
> James Kuyper <jameskuyper@verizon.net> wrote:
>> On 12/18/2012 08:25 AM, Szabolcs Nagy wrote:
>>> it seems the definition of 'null pointer constant'
>>> relies on integer constant expressions (6.3.2.3p3)
>>> http://port70.net/~nsz/c/c11/n1570.html#6.3.2.3p3
>>>
>>> so eg.
>>>
>>>  (void*)((char*)1 - 1)
>>>
>>> is not a null pointer constant because pointer
>>> arithmetics cannot give an integer constant expression
>>>
>>> but at least this could be used in pointer initializers
>>> since address constants are allowed there (6.6p7)
>>
>> Two things to keep in mind:
>>
>> When converting an arbitrary integer to a pointer type "the result is
>> implementation-defined, might not be correctly aligned, might not point
>> to an entity of the referenced type, and might be a trap
>> representation." (6.3.2.3p1)
> 
> does not matter, your concerns only matter if the expression is
> evaluated, but it is not:
> 
>  sizeof( *(0?(double*)0:(void*)((char*)1 - 1)) )

You didn't mention that in your original message.

...
>> I may be missing something, but as far as I can tell, the rules given in
>> 6.5.15p6 give the same result whether the second or third operand is a
>> null pointer constant, or merely a constant expression with the type
>> void* and a null value. Could you provide a counter-example?
> 
> yes
> 
>  (0 ? (double*)0 : (void*)0)
> 
> has type double*, while
> 
>  (0 ? (double*)0 : (void*)1)
> 
> has type void*

You're right - I missed that.

...
>> This imposes a bit of a strain on the implementor, who would otherwise
>> be allowed to delay evaluation of such expressions until run-time. The
>> rules for integer constant expressions were intended to keep them
>> simple, to make them easy to identify and evaluate.
> 
> my problem is that they are not easy to identify
> 
>  !(int)1.0
>  (void*)(1-1)
> 
> are integer constant expressions and null pointer constants

(void*)(1-1) is not an integer constant expression, though it is a null
pointer constant.

>  (int)!1.0
>  (void*)(char*)0
>  (char*)(void*)0
>  (void*)(void*)0
>  (void*)((char*)0-(char*)0)
> 
> are neither

While the list of things prohibited in ICEs is long, that fact is
normally only of importance to compiler writers, who must write code
that reliably and accurately detects them in the source code.  The
contexts where ICEs are required (array dimensions, enumeration values,
and bit-field sizes) are not normally reasonable contexts for any
expressions that would push the limits on what is permitted.
Can you give an example where it was reasonable, in a context where an
ICE was required, to use an expression that pushed (or exceeded) the
limits on what is permitted for an ICE?

I can come up with only three different null pointer constant
expressions that most people would ever have any good reason to use in C:
0: for compatibility with C++
(void*)0: for better type-checking than you get with a plain 0
NULL: self-documenting, and a lot easier to search for than the other two.
Can you give any good reason for using any other null pointer constant
expressions? Can you claim that such situations are commonplace?

Back to comp.std.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 13:25 +0000
  Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 09:53 -0500
    Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 20:06 +0000
      Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 15:39 -0500
        Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-19 00:44 +0000
          Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 20:24 -0500
            Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-19 10:27 +0000
              Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-19 07:15 -0500
              Re: null pointer constant, address constant Phil Carmody <thefatphil_demunged@yahoo.co.uk> - 2012-12-21 03:03 +0200
                Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-21 12:13 -0500
                Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2013-01-09 00:44 +0000
                Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2013-01-08 20:21 -0500
                Re: null pointer constant, address constant Eric Sosman <esosman@comcast-dot-net.invalid> - 2013-01-08 20:46 -0500
          Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 20:37 -0500
      Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 16:15 -0500
        Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-18 15:52 -0800
          Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 19:12 -0500
            Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 19:51 -0500
          Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-18 17:02 -0800
          Re: null pointer constant, address constant "christian.bau" <christian.bau@cbau.wanadoo.co.uk> - 2012-12-20 05:34 -0800
            Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-20 10:33 -0500
              Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-20 12:28 -0500
                Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:13 -0800
              Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:05 -0800
            Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-20 12:17 -0500
            Re: null pointer constant, address constant Keith Thompson <kst-u@mib.org> - 2012-12-20 12:10 -0800
              Re: null pointer constant, address constant Tim Rentsch <txr@alumni.caltech.edu> - 2012-12-20 21:25 -0800
  Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 14:02 -0500
    Re: null pointer constant, address constant Szabolcs Nagy <nsz@port70.net> - 2012-12-18 20:09 +0000
      Re: null pointer constant, address constant James Kuyper <jameskuyper@verizon.net> - 2012-12-18 15:54 -0500
        Re: null pointer constant, address constant Shao Miller <sha0.miller@gmail.com> - 2012-12-18 16:18 -0500

csiph-web