GCC extensions

gcc 拡張
id:namasute0 氏に gcc 拡張といえば?
と聞いたところ、({}) と nested functions だったので、それをちょっといじった。

#include 
int (*k(int x)) (int)
{
  return ({int f(int y){return x;}f;});
}

int main()
{
  int (*f)(int) = k(5);
  int (*g)(int) = k(7);
  printf("%x,%x,%d\n",f,g,f(3));
  return 0;
}

$ gcc -Wall gccext.c
$ ./a.out
bfedf620,bfedf620,3

なんで 3?

$ gcc -s gccext.c
で確認

        .type   f.0, @function
f.0:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $4, %esp
        movl    %ecx, -4(%ebp)
        movl    -4(%ebp), %ecx
        movl    -4(%ecx), %eax
        movl    (%eax), %eax
        leave
        ret
        .size   f.0, .-f.0
.globl k
        .type   k, @function
k:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        leal    8(%ebp), %eax
        movl    %eax, -12(%ebp)
        leal    -24(%ebp), %eax
        addl    $0, %eax
        andl    $-1, %eax
        movl    $f.0, %ecx
        leal    10(%eax), %edx
        subl    %edx, %ecx
        movl    %ecx, %edx
        movb    $-71, (%eax)
        leal    -8(%ebp), %ecx
        movl    %ecx, 1(%eax)
        movb    $-23, 5(%eax)
        movl    %edx, 6(%eax)
        leal    -24(%ebp), %eax
        addl    $0, %eax
        andl    $-1, %eax
        leave
        ret
        .size   k, .-k

なるほど、スタックのあらぬところを指してしまうらしい。
環境は gcc version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)