Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| 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> |
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
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