2012-09-25 90 views
4

使用GCC 4.7:爲什麼這個代碼導致浮點異常 - SIGFPE

$ 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由第二個賦值(y = ...)引起。在彙編列表中,這條線上有一個分支?請注意,x =和y =之間的唯一區別是投射到(uintptr_t)。

+0

海灣合作委員會瀏覽器輸出:http://preview.tinyurl.com/8ah2fa7 – Wade

+3

'char start [0];''意味着你不在標準定義的範圍內。除此之外會發生什麼,它真的很有趣嗎? –

回答

8

忽視不確定的行爲因違反標準constarints的,這裏什麼GCC確實是計算char[0]兩個指針之間的區別 - &(((struct test*)0)->start)&(((struct test*)0)->end),並通過char[0]的大小,除以差這當然是0,所以你得到一個除法0.

+0

由於UNIX中的歷史原因,由'0'進行的整數除法產生浮點異常(SIGFPE信號) – ouah

+0

這是UNIX(和衍生物)專業嗎?我認爲這是一個x86的東西。 –

+0

好問題我知道這是在UNIX上的x86的情況,但我不確定是否適用於其他系統。 – ouah

相關問題