svn commit: r212064 - head/sys/boot/pc98/boot2
Dimitry Andric
dim at FreeBSD.org
Tue Aug 31 20:11:17 UTC 2010
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.)
More information about the svn-src-all
mailing list