I gave it a try (r26103). It was messy, and I hope I got it right. Let's soak 
it for few days with our nightly testing to see how it behave.

  george.

On Mar 5, 2012, at 16:37 , N.M. Maclaren wrote:

> On Mar 5 2012, George Bosilca wrote:
>> 
>> I was afraid about all those little intermediary steps. I asked a compiler 
>> guy and apparently reversing the order (aka starting with the ptrdiff_t 
>> variable) will not solve anything. The only portable way to solve this is to 
>> cast every single member, to prevent __any__ compiler from hurting us.
> 
> That is true, but even that may not help, given that each version of
> the C standard has been incompatible with its predecessors.  And see
> below.
> 
>>> In my copy of C99, section 6.5 Expressions says " the order of evaluation 
>>> of subexpressions and the order in which side effects take place are both 
>>> unspecified. There is a footnote 71 that "specifies the precedence of 
>>> operators in the evaluation of an expressions, which is the same as the 
>>> order of the major subclauses of this subclause, highest precedence first." 
>>> It is the footnote that implies multiplication (6.5.5 Multiplicative 
>>> operators) has higher precedence than addition (6.5.6 Additive operators) 
>>> in the expression "(char*) rbuf + rank * rcount * rext". But, the main text 
>>> states that there is no ordering of the subexpression "rank * rcount * 
>>> rext". When the compiler chooses to evaluate "rank * rcount" first, the 
>>> overflow described by Yuki can result. I think you are correct that the 
>>> subexpression will get promoted to (ptrdiff_t), but that is not quite the 
>>> same thing.
> 
> No, it's not as simple as that :-(
> 
> That was the intent during the standardisation of C90, but those of
> us who tried failed to get any explicit statement into it, and the
> situation during C99 was that "but everybody knows that" the syntax
> rules also define the evaluation order.  We failed to get that stated
> then, either :-(  That interpretation was apparently also the one
> assumed by C++03, too, and now is explicitly (if informally) stated in
> C++11.  So you theoretically can just cast the first operand to the
> maximum precision and it will all work.
> 
> What it means by the "order of evaluation of subexpressions" is that
> the assignments in '(a = b) + (c = d) + (e = f)' can take place in
> any order, which is a different issue. 
> HOWEVER, about half of the C communities have given C99 the thumbs
> down, I doubt that C11 will be taken much notice of, gcc is the
> de facto standard definer, and most compilers have optimisation
> options that say "ignore the standard when it helps to go faster".
> So the only feasible rule is to do your damnedest to defend yourself
> against the aberrations, ambiguities and inconsistencies of C, and
> hope for the best.  I.e. what George recommends.
> 
> But will even that work reliably in the medium term?  I wouldn't
> bet on it :-(
> 
> 
> Regards,
> Nick Maclaren.
> 
> 
> _______________________________________________
> devel mailing list
> de...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/devel


Reply via email to