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