gcc 4.7の使用:
$ gcc --version
gcc (GCC) 4.7.0 20120505 (prerelease)
コードリスト(test.c):
#include <stdint.h>
struct test {
int before;
char start[0];
unsigned int v1;
unsigned int v2;
unsigned int v3;
char end[0];
int after;
};
int main(int argc, char **argv)
{
int x, y;
x = ((uintptr_t)(&((struct test*)0)->end)) - ((uintptr_t)(&((struct test*)0)->start));
y = ((&((struct test*)0)->end)) - ((&((struct test*)0)->start));
return x + y;
}
コンパイルして実行する
$ gcc -Wall -o test test.c && ./test
Floating point exception
SIGFPEは、2番目の割り当て(y = ...)によって発生します。アセンブリリストでは、この行に分割がありますか?x=とy=の唯一の違いは、(uintptr_t)へのキャストであることに注意してください。