Date: Tue, 31 Aug 2010 22:11:15 +0200 From: Dimitry Andric <dim@FreeBSD.org> To: Kostik Belousov <kostikbel@gmail.com> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r212064 - head/sys/boot/pc98/boot2 Message-ID: <4C7D61E3.6020409@FreeBSD.org> In-Reply-To: <20100831195128.GC2396@deviant.kiev.zoral.com.ua> References: <201008311811.o7VIBoC5037894@svn.freebsd.org> <20100831195128.GC2396@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2010-08-31 21:51, Kostik Belousov wrote:
> What is the undefined behaviour you are claiming there ?
Arithmetic on a NULL pointer, which is undefined. The C standard says
in 6.5.6 (additive operators):
3. For subtraction, one of the following shall hold:
— both operands have arithmetic type;
— both operands are pointers to qualified or unqualified versions of
compatible object types; or
— the left operand is a pointer to an object type and the right
operand has integer type. (Decrementing is equivalent to
subtracting 1.)
But NULL does not point to any specific object. A few paragraphs down
it says:
9. When two pointers are subtracted, both shall point to elements of
the same array object, or one past the last element of the array
object; the result is the difference of the subscripts of the two
array elements.
NULL does not point to anything, so you cannot subtract NULL from a
pointer, nor subtract a pointer from NULL (as is done here).
Apparently gcc allows it, possibly as an extension? But clang does not,
and will generate a 'unreachable' instruction for this expression. (I
encountered this when I was trying to get boot2 compiled by clang small
enough to fit in 7168 bytes.)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C7D61E3.6020409>
