auto-increment bug in Ultrix(4.1) C (DS3100)

Norman Diamond diamond at jit345.swstokyo.dec.com
Tue Apr 16 18:55:45 AEST 1991


In article <1991Apr15.161123.16353 at watcgl.waterloo.edu> idallen at watcgl.waterloo.edu (Ian! D. Allen [CGL]) writes:
>In article <1991Mar31.214127.5224 at pslu1.psl.wisc.edu>, khan at pslu1.psl.wisc.edu (Mumit Khan) writes:
>> Note the output from the following program in various cases. MIPS C is 
>> the only one causing the problem (of not incrementing the global shared
>> variable "pc" in the call (*(*pc++))().
[...]
>> typedef int (*Inst)();
>> static Inst *pc = NULL;
>> 	(*(*pc++)) ();		/* BUG BUG BUG BUG BUG BUG BUG */

>This is not a bug.

Well, Mumit Khan is using a compiler that does not claim ANSI conformance,
and complaining that the result is not ANSI conformant.  This makes the
complaint partly meaningless.

(However, quality of implementation might possibly be a consideration even
for non-conformant compilers.  Disclaimer:  Although I do not know if this
is possible or not, my employer is not the one suggesting it.)

For an ANSI-conformant compiler, it would indeed be a bug.

>The C Language does not require the increment to happen until the end of
>the expression, that is, until *after* the function call.
>I quote from someone who read the ANSI book:
>From: giguere at csg.uwaterloo.ca (Eric Giguere)
>	Section 3.3.2.4:
>        The side effect of updating the stored value of the operand
>        shall occur between the previous and the next sequence point.
>	Section 2.1.2.3:
>        At certain specified points in the execution sequence called
>        sequence points, all side effects of previous evaluations shall
>        be complete and no side effects of subsequent evaluations shall
>        have taken place.
>    Section 3.6:
>        The end of a full expression is a sequence point.
>    Section 3.3:
>        Between the previous and next sequence point an object shall
>        have its stored value modified at most once by the evaluation
>        of an expression.
>So what can we conclude?  Only that the increment has to have taken effect
>by the end of the expression.
>Congratulations, Ian!, you can pick up your prize at....

Messrs. !Allen and Giguere win booby prizes on this one.
There are also sequence points at some other places, too.  For example:
     Section 3.3.2.2, page 42, line 21:
         ... but there is a sequence point before the actual call.

If the compiler in this case had claimed ANSI conformance, then its
implementors would also deserve booby prizes.  (Disclaimer:  this is 
not my employer's opinion.)
--
Norman Diamond       diamond at tkov50.enet.dec.com
If this were the company's opinion, I wouldn't be allowed to post it.



More information about the Comp.unix.ultrix mailing list