[cfe-dev] core dump, how to best investigate

Chris Lattner clattner at apple.com
Tue Jul 24 09:20:58 PDT 2007


On Jul 24, 2007, at 6:40 AM, Jeroen Ruigrok van der Werven wrote:

> -On [20070724 14:04], Jeroen Ruigrok van der Werven (asmodai at in- 
> nomine.org) wrote:
>> #1  0x081d94d7 in clang::Sema::ParseUnaryOp (this=0x831b880, OpLoc=
>>      {ID = 2148130816}, Op=clang::tok::kw___extension__, input=0x0)
>>    at SemaExpr.cpp:1455
>> #2  0x081f7c40 in clang::Parser::ParseCastExpression (this=0x831b800,
>>    isUnaryExpression=false) at ParseExpr.cpp:546
>
> So ParseUnaryOp() has an input which is empty and as such resultType =
> Input->getType(); fails.

Yep, this is because the inner expression did not correctly return as  
AST node.

> ParseCastExpression() is executing:
> Res = Actions.ParseUnaryOp(SavedLoc, SavedKind, Res.Val);
>

> It seems to come from including unistd.h on FreeBSD, which includes
> sys/types.h, which includes machine/endian.h which results in:

Ah, it's bad this happens so frequently for you, ok.

> [15:37] [asmodai at nexus] (1125) {0} % clang /usr/include/machine/ 
> endian.h
> /usr/include/machine/endian.h:146:10: warning: expression result  
> unused
>         return (__byte_swap_int(_x));
>                 ^~~~~~~~~~~~~~~
> zsh: segmentation fault (core dumped)  clang /usr/include/machine/ 
> endian.h
>
> Relevant part of the source file:
>
> #define __byte_swap_int_var(x) \
> __extension__ ({ register __uint32_t __X = (x); \
>    __asm ("bswap %0" : "+r" (__X)); \
>    __X; })
>
> And looking at Parse/ParseExpr.cpp line 542 this seems expected:
>
> // FIXME: Extension not handled correctly here!

__extension__ is actually handled correctly enough for this code.   
The FIXME refers to the fact that __extension__ doesn't currently  
silence extension-related diagnostics in subexpressions.  For  
example, if you compile this:

typedef unsigned __uint32_t;

#define __byte_swap_int_var(x) \
__extension__ ({ register __uint32_t __X = (x); \
    __asm ("bswap %0" : "+r" (__X)); \
    __X; })

int test(int _x) {
    return (__byte_swap_int_var(_x));
}

with: clang ~/t.c -parse-ast-print -pedantic

You get:

/Users/sabre/t.c:5:4: warning: extension used
    __asm ("bswap %0" : "+r" (__X)); \
    ^
typedef unsigned int __uint32_t;
/Users/sabre/t.c:9:10: warning: use of GNU statement expression  
extension
return (__byte_swap_int_var(_x));
          ^
/Users/sabre/t.c:9:10: warning: extension used
return (__byte_swap_int_var(_x));
          ^
/Users/sabre/t.c:9:10: warning: expression result unused
return (__byte_swap_int_var(_x));
          ^~~~~~~~~~~~~~~~~~~
Bus error


Because those extension warnings are inside a __extension__ node,  
they should not be emitted.


The actual problem happening here is that we don't current build an  
AST node for the GNU statement expression extension.  This is the  
TODO on line 864 of ParseExpr.cpp.

In the future, if you run into a problem, please include a self- 
contained testcase, like the example I provide above.  This makes it  
much easier to understand what problem you're hitting.

In any case, I'll add the AST node and get the example working.  Thanks!

-Chris



More information about the cfe-dev mailing list