gccのビルトイン関数には関数のリターンアドレスやフレームポインタなどを取得することができる関数がある。この関数を使用しsetjmp/longjmpの実装は以下の様になる。たぶんバグはないはず? jmp.c #include <stdio.h> #include <stdlib.h> #define JMP_BUFFSIZE 6 typedef struct { unsigned long __jmp_buf[JMP_BUFFSIZE]; } jmp_buf[1]; jmp_buf jmp_buffer; int setjmp(jmp_buf env) { void *return_addr = __builtin_return_address(0); asm volatile("movl %%edx, 0(%%ecx)\n\t" /* return address */ "movl %%