2014-11-05 90 views
4

我寫了一個已經正常工作的編譯器。它檢查所有非void方法是否至少有一個return語句,但它不檢查非void方法中的所有代碼路徑是否返回一個值。因此,舉例來說,如果我有以下代碼:如何檢查一個方法總是返回一個值

int function(bool a) 
{ 
    if(a){ 
     return 5; 
    } 
} 

這將彙編「精」,如果是假的,控制將脫落的功能和繼續執行無論是作用下定義。

是否有一些算法可用於執行此檢查,以便我始終知道某個方法是否始終返回值?或者我需要重新發明輪子?

+0

對於相當多的編譯器技巧,已經有可用的算法,包括推薦的內部表示法等。 http://en.wikipedia.org/wiki/Data-flow_analysis閱讀相同語言的現有編譯器的註釋源代碼(看起來像'C'在你的案例中,所以選擇一個http://stackoverflow.com/questions/ 584714/is-an-interpreter-for-c)可能是[自我回答](http://stackoverflow.com/help/self-answer)你不清楚和廣泛的問題的最佳方式 – xmojmr 2014-11-05 16:57:56

回答

1

無論函數是否返回值,函數都不能「落在最後」並開始執行代碼以外的代碼。對於不返回結果的函數(甚至對於返回結果的函數,某些不規範的語言)允許最後的return語句被省略是常見的,但是函數需要在所有情況下返回。

鑑於此,以產生錯誤消息落在端的非空穴功能的最簡單的方法是:

  • 解析器插入在函數體的端部的return語句。

  • 死代碼消除用於在不需要的情況下刪除插入的return語句。

  • Typechecking用於驗證所有return語句(包括插入的語句,如果它未被刪除)與函數的返回類型一致。 (也就是說,因爲產生的return語句沒有價值,這隻能是一個void功能是一致的。)

在這種情況下,你需要的類型檢查之前刪除不必要的return陳述,否則你會最終與很多不正確的錯誤消息。這需要一些控制流量分析。

如果工作量太大,可以在運行時通過在函數返回值的情況下將無值return語句編譯爲錯誤操作來發出錯誤消息。

+0

雖然這樣做確實解決了「倒閉」問題,我不認爲這是問題。據我瞭解,問題是如果不是所有的路徑都返回一個值,那麼如何產生編譯時錯誤。 – sepp2k 2014-11-05 16:25:31

+0

我按照你的建議對不返回值的函數進行操作。但對於那些做不了的事情,因爲我不能簡單地猜測返回值是什麼。明顯的功能應該不會發生。我問的是如何檢測這種情況,以便編譯器報告錯誤並暫停編譯。 – 2014-11-05 16:26:47

+0

@ sepp2k沒錯,那就是我的意思。 – 2014-11-05 16:27:12

相關問題