[Mesa-dev] [PATCH v2] glsls: Modify exec_list to avoid strict-aliasing violations

Davin McCall davmac at davmac.org
Fri Jun 26 04:23:08 PDT 2015

On 26/06/15 12:03, Davin McCall wrote:
> ... The stored value of 'n' is not accessed by any other type than the 
> type of n itself. This value is then cast to a different pointer type. 
> You are mistaken if you think that the cast accesses the stored value 
> of n. The other "stored value" access that it occurs in that 
> expression is to the object pointed at by the result of the cast. [...]:

I'm sorry, I think that was phrased somewhat abrasively, which I did not 
intend. Let me try this part again. If we by break up the expression in 
order of evaluation:

    return ((const struct exec_node **)n)[0]

In order of evaluation:

- which accesses the stored value of n, i.e. a value of type 'struct 
exec node *', via n, which is obviously of that type.

(const struct exec_node **)n
  - which casts that value, after it has been retrieved, to another 
type. If this were an aliasing violation, then casting any pointer 
variable to another type would be an aliasing violation; this is clearly 
not the case.

((const struct exec_node **)n)[0]
- which de-references the result of the above cast, thereby accessing a 
stored value of type 'exec node *' using a glvalue of type 'exec node *'.

So, at no point is a stored value accessed by any type other than the 
type of the stored value.


More information about the mesa-dev mailing list