簡體   English   中英

為什么 GCC 不對無法訪問的代碼發出警告?

[英]Why does GCC not warn for unreachable code?

我想知道為什么gcc (4.6.3)在這個例子中沒有警告我無法訪問的代碼

#include <stdio.h>

int status(void)
{
    static int first_time = 1;

    if (first_time) {
        return 1;   
        first_time = 0; /* never reached */
    } else {
        return 0;   
    }     
}

int main(int argc, const char *argv[])
{
    printf("first call %d\n", status());
    printf("second call %d\n", status());
    return 0;
}

請注意,錯誤的status()函數的目的是保持狀態。 我原以為會收到警告-Wall 我也嘗試過-Wunreachable-code-Wextra-pedantic-ansi (正如這里討論的那樣)。 然而,這些都沒有給我警告。

看來 gcc 會默默地刪除靜態變量賦值。

在我看來,gcc options -Wall -Werror應該會引發錯誤。

gcc 4.4 會給你警告。 在 gcc 的更高版本中,此功能 ( -Wunreachable-code ) 已被刪除。

見這里: http : //gcc.gnu.org/ml/gcc-help/2011-05/msg00360.html

-Wunreachable-code已被刪除,因為它不穩定:它依賴於優化器,因此不同版本的 gcc 會警告不同的代碼。 編譯器仍然接受並忽略命令行選項,這樣現有的 Makefile 不會被破壞。 在未來的某個版本中,該選項將被完全刪除。

伊恩

gcc 有很多遍——看看它們嘗試用像這樣的開關編譯

-da -dAp -Wa,-a -fdump-ipa-all-all -fdump-tree-all-all -fdump-rtl-all-all

我的猜測是,在指定發出相關警告的通行證之前,某些通行證已經完成了死代碼消除。 這可以合理地被認為是一個錯誤,但 gcc 團隊可能更多地將警告視為一種方便而不是道德承諾,並且沒有動力做很多工作來使其精確和完整。 如果您想做出貢獻,您可以逐個禁用優化傳遞,直到找到阻止警告的優化傳遞,然后提交記錄問題的錯誤報告。 如果這不值得你花時間,也許修復它不值得他們花時間。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM