[cfe-dev] type-punning warnings for CXXTypeidExpr::child_begin()/child_end()

Ted Kremenek kremenek at apple.com
Wed Dec 3 14:49:27 PST 2008


On Dec 3, 2008, at 2:40 PM, Sebastian Redl wrote:

> Eli Friedman wrote:
>> On Wed, Dec 3, 2008 at 1:28 PM, Ted Kremenek <kremenek at apple.com>  
>> wrote:
>>
>>> In ExprCXX.cpp I see:
>>>
>>> Stmt::child_iterator CXXTypeidExpr::child_begin() {
>>>  return isTypeOperand() ? child_iterator() : (Stmt**)&Operand;
>>> }
>>>
>>> The expression '(Stmt**)&Operand' leads to type-punning warnings
>>> during a Release build.  This looks like a real issue to me.  Is  
>>> this
>>> safe, or do we need to fix it?  The same warning appears in  
>>> child_end().
>>>
>>
>> It looks like a real issue to me too.  I guess the simplest solution
>> is to change "void *Operand;" to "union {void* Operand; Stmt*
>> OperandExpr;};", and change child_begin to use OperandExpr.  It isn't
>> pretty, but I think it has the intended semantics.
>>
>> I guess it's worth noting that SizeOfAlignOfExpr has the same issue.
>>
> My code, both of it. I suppose I can go with the union.

I'm not certain that using a union will change anything.  I think  
there will still be a type-punning issue, even if we manage to make  
the warning go away.



More information about the cfe-dev mailing list