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: =97 both operands have arithmetic type; =97 both operands are pointers to qualified or unqualified versions of= compatible object types; or =97 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>