Re: [PATCH] C undefined behavior fix

Fergus Henderson (fjh@cs.mu.OZ.AU)
Thu, 10 Jan 2002 12:47:02 +1100


On 09-Jan-2002, Peter Barada <pbarada@mail.wm.sps.mot.com> wrote:
>
> If the code is:
>
> int b;
> void stuff()
> {
> volatile const a=5;
>
> b = a - a;
> }
>
> Then the code can be optimized to 'b = 0;'

No, you're wrong here. That would violate the following provisions of
the C99 standard, because the two accesses to `a' would not have occurred.
(It would also violate similar provisions of the C89 and C++ standards.)
The "as if" rule -- which is stated in 5.1.2.3 [#3] in C99 -- is explicitly
defined to NOT allow optimizing away accesses to volatile objects.

| 5.1.2.3 Program execution
...
| [#2] Accessing a volatile object, modifying an object,
| modifying a file, or calling a function that does any of
| those operations are all side effects
...
| [#3] In the abstract machine, all expressions are evaluated
| as specified by the semantics. An actual implementation
| need not evaluate part of an expression if it can deduce
| that its value is not used and that no needed side effects
| are produced (including any caused by calling a function or
| accessing a volatile object).
...
| [#5] The least requirements on a conforming implementation
| are:
|
| -- At sequence points, volatile objects are stable in the
| sense that previous accesses are complete and
| subsequent accesses have not yet occurred.

-- 
Fergus Henderson <fjh@cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/