GCC extensions
gcc 拡張
id:namasute0 氏に gcc 拡張といえば?
と聞いたところ、({}) と nested functions だったので、それをちょっといじった。
#includeint (*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?
- O をつけてコンパイルすると segmentation fault。
$ 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)