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.

  george.

On Mar 5, 2012, at 13:40 , Larry Baker wrote:

> George,
> 
> I think Yuki's interpretation is correct.
> 
>>> The following is one of the suspicious parts.
>>> (Many similar code in ompi/coll/tuned/*.c)
>>> 
>>> --- in ompi/coll/tuned/coll_tuned_allgather.c (V1.4.X's trunk)---
>>> 398    tmprecv = (char*) rbuf + rank * rcount * rext;
>>> -----------------------------------------------------------------
>>> 
>>> if this condition is met, "rank * rcount" is overflowed.
>>> So, we fixed it tentatively like following:
>>> (cast int to size_t)
>>> --- in ompi/coll/tuned/coll_tuned_allgather.c --------------
>>> 398    tmprecv = (char*) rbuf + (size_t)rank * rcount * rext;
>>> ------------------------------------------------------------
>> 
>> Based on my understanding of the C standard this operation should be done on 
>> the most extended type, in this particular case the one of the rext 
>> (ptrdiff_t). Thus I would say the displacement should be correctly computed.
> 
> 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.
> 
> Larry Baker
> US Geological Survey
> 650-329-5608
> ba...@usgs.gov
> 

Reply via email to