2010-08-01 42 views
12

編譯器通常會提供一個switch to warn when code is unreachable。我也看到一些庫的宏,它們提供assertions for unreachable code如何向GCC提示一行應該無法訪問?

有沒有提示,比如通過一個編譯指示或內建函數,我可以傳遞給GCC(或者其他任何編譯器),如果確定預期的行將會在編譯期間發出警告或錯誤實際上無法達到?

下面是一個例子:

if (!conf->devpath) { 
     conf->devpath = arg; 
     return 0; 
    } // pass other opts into fuse 
    else { 
     return 1; 
    } 
    UNREACHABLE_LINE(); 

的這個值是在檢測,在預期可達線以上條件的變化後,該線實際上可到達的。

回答

14

GCC 4.5支持__builtin_unreachable()編譯器內聯,這與-Wunreachable-code結合可以做你想做的,但可能會導致虛假的警告

+2

我想要注意的是'-Wunreachable-code'選項在gcc的後續版本中被刪除(因爲在不同的優化選項下它是高度不可預測的) – Hasturkun 2015-07-26 08:13:17

2

如果你的編譯器沒有你需要的警告,它可以補充一個靜態分析器。我所談論的那種分析器會有它自己的註釋語言和/或識別C assert,並且用它們來提示在執行的特定點應該是真實的屬性。如果沒有針對無法訪問的語句的特定註釋,則可以使用assert (false);

我不是很熟悉它們,但Klokwork和CodeSonar是兩個着名的分析儀。 Goanna是第三位。

+2

用於允許評論老'lint'工具'/ * * NOTREACHED /',這表明代碼不應該到達...不知道是什麼工具的行爲是當它遇到了評論。 – 2010-08-01 11:38:14

1

用gcc 4.4.0的Windows交叉編譯器的PowerPC與-O2或-O3編制以下爲我工作:

#define unreachable asm("unreachable\n")

彙編失敗,未知的操作,如果編譯器不優化它了,因爲它的結論是,這是不可達。

是的,這是很可能是`下不同的優化選項高深莫測,並可能打破當我終於更新了編譯器,但是目前它更好然後什麼。

相關問題