2014-12-05 431 views
1

我收到了我遇到過的最詭異的警告。我有在我做這樣的事情- 內聯函數中的warray-bounds僞造警告g ++ 4.9.2

inline int f(int n) 
{ 
    int myarray[maxn]; 
    myarray[n-1] = 1; 
} 

參數maxn是在頭文件作爲constexpr定義的內聯函數。傳遞給f的參數n在我的代碼中總是小於或等於maxn。然而,每當我編譯,我得到警告

warning: array subscript is above array bounds [-Warray-bounds] 

在行myarray[n-1] = 1

它只是碰巧使用g++4.9clang++不發出任何警告,以及以前的版本g++),只有當該功能被標記inline。如果我在函數中使用的測試條件如

if(n > maxn) cerr << "ERROR!"<< endl; 

或甚至簡單的顯示語句作爲

cout << n; 

警告消失(在if當然評價爲false的,所以沒有錯誤消息是顯示,因爲我絕對確信n <= maxn;)。

有誰知道這是否是g++問題?你之前遇到過嗎?

+0

好奇,你有沒有提交錯誤報告? – 2014-12-25 03:57:04

+0

@ShafikYaghmour將它儘量減少到最小的情況,我的代碼非常複雜(lambda通過引用一些參數捕獲,加上線程)。我從假期回來後,我希望能做到:) – vsoftco 2014-12-28 16:07:22

回答

2

它看起來像數組邊界檢查已被報道gcc幾次(herehere),例如這個錯誤報告 Picon [Bug c/59564] New: False positive array -Warray-bounds check with -O2說明此代碼的假陽性問題,使用-02gcc 4.8.2gcc 4.9.0時產生假陽性(see it live):

int arr[1]; 
int n = 0; 

int main() { 
    if (n <= 0) n = 0; 
    arr[n] = 0; 
    if (n <= 0) n = 0; 
    return 0; 
} 

所以這可能是一個迴歸或不同形式的bug,你應該提交bug report

+0

謝謝!我將首先嚐試將代碼放入最簡單的可編譯示例(現在這不是微不足道的:))但是一定會這樣做。現在我只是使用'#pragma GCC診斷忽略的「--Warray-bounds」'來隱藏警告。 – vsoftco 2014-12-05 02:42:37

+0

@vsoftco如果你可以用這個例子更新你的問題,並最終得到一個很棒的錯誤報告。我無法重現您的特定問題,但我認爲任何在線編譯器都沒有'gcc 4.9.2'。 – 2014-12-05 02:52:36

+0

@Shafik公平的說,這個問題沒有MCVE。所以我不驚訝你不能複製它。 – 2014-12-05 02:56:33