2015-05-14 27 views
3

有兩個函數,最大值1()和最大值2():爲什麼在返回局部變量的地址時使用gcc時不能得到警告信息?

int* max1() 
{ 
    int a; 
    int b; 

    return &a; 
} 

int* max2() 
{ 
    int a; 
    int b; 

    return a > b ? &a : &b; 
} 

當編譯最大值1()使用gcc我們可以得到警告信息:

[email protected]:~/temp$ gcc test1.c 
test1.c: In function ‘int* max()’: 
test1.c:6:9: warning: address of local variable ‘a’ returned [-Wreturn-local-addr] 
int a; 
    ^

但是,我們可以得到什麼時,編譯MAX2 ()。

另外,我們可以通過鐺得到警告信息:

[email protected]:~/temp$ clang test1.c 
test1.c:9:21: warning: address of stack memory associated with local variable 'a' returned 
     [-Wreturn-stack-address] 
    return a > b ? &a : &b; 
       ^
1 warning generated. 

非常感謝,並原諒我的英語池。

+0

非常類似於[沒有編譯器警告,用於返回引用局部變量](http://stackoverflow.com/q/29872531/1708801) –

+0

我真的不知道爲什麼,兩者都返回一個局部變量地址。也許是一個錯誤?你使用的是哪個版本的gcc? – LPs

+0

這看起來像上面問題中提到的相同的錯誤,如果我們使用更新版本的[gcc與優化打開](http://coliru.stacked-crooked.com/a/6def165f938615b8)它拾起第二種情況。 –

回答

1

在我看來,有兩個部分組成這樣一個問題:

  • 是編譯器總是應該每次你做壞事時向您發出警告?

不是。把警告看作是一個很好的友好注意事項,也許你做了一件會讓你陷入困境的事情。但它不過是一個友好的筆記。標準中沒有任何內容表示當你試圖返回一個指向局部變量的指針時,編譯器應該警告你。大多數警告只是警告 - 但是(大多數)並不是嚴格要求的。在一天結束時,你的程序違反了規則,所以修理它是你的錯,也是你的工作。在很多情況下,編譯器必須提供錯誤,但是返回指向局部變量的指針並不是其中的一個。所以,首先得到這個警告是很幸運的。

  • gcc是否應該在兩個示例中警告您?這是一個錯誤?

爲了一致性,它應該。爲什麼不呢?如果它採用類似的代碼,則可能需要在第二個示例中發出警告。這可能是gcc開發人員解釋爲一個錯誤的原因(也就是說,無論調用哪個代碼來決定是否吐出該警告 - 但不是核心編譯器本身的錯誤)中的錯誤。然而,無論你說什麼或做什麼,你都無法依靠編譯器警告永遠在你身邊 - 他們只是那個喜歡在藍色月亮中伸出援助之手的好人。他並不總是在那裏!

注意:顯然,打開優化,海灣合作委員會通常更詳細的警告。嘗試通過優化進行編譯,看看會發生什麼。

+0

帶-O2的Gcc 5.1.0可以得到警告。但4.9.1一無所獲。 – nideyangzi1989

相關問題