From owner-svn-src-head@FreeBSD.ORG Tue Aug 31 20:11:16 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E539D1065673; Tue, 31 Aug 2010 20:11:16 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from tensor.andric.com (cl-327.ede-01.nl.sixxs.net [IPv6:2001:7b8:2ff:146::2]) by mx1.freebsd.org (Postfix) with ESMTP id A59BB8FC18; Tue, 31 Aug 2010 20:11:16 +0000 (UTC) Received: from [IPv6:2001:7b8:3a7:0:c4ac:5d43:43f8:c580] (unknown [IPv6:2001:7b8:3a7:0:c4ac:5d43:43f8:c580]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by tensor.andric.com (Postfix) with ESMTPSA id E84A55C59; Tue, 31 Aug 2010 22:11:15 +0200 (CEST) Message-ID: <4C7D61E3.6020409@FreeBSD.org> Date: Tue, 31 Aug 2010 22:11:15 +0200 From: Dimitry Andric Organization: The FreeBSD Project User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.10pre) Gecko/20100831 Lanikai/3.1.4pre MIME-Version: 1.0 To: Kostik Belousov References: <201008311811.o7VIBoC5037894@svn.freebsd.org> <20100831195128.GC2396@deviant.kiev.zoral.com.ua> In-Reply-To: <20100831195128.GC2396@deviant.kiev.zoral.com.ua> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable 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 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Aug 2010 20:11:17 -0000 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.)