2011-07-22 78 views
19

我喜歡靜態分析和編譯時檢查,這幾乎是錯誤,但我大部分時間都在Objective-C中工作。爲了解決這個問題,我希望能夠編寫我自己的分析工具,以便在Objective-C項目上運行。解析用於靜態分析的Objective-C代碼

但是在互聯網上搜索表明,人們很難整合一個完整的Objective-C語法。 One site基本上建議放棄。

我確實找到了一個語法on the ANTLR website,但是當我解僱它時,我根本無法解析任何東西。例如,它迴應了行:

void x(); 

src/main/resources/somecode.m line 1:0 no viable alternative at input 'void'

:(

我把在語法仔細一看,發現以下令人沮喪免責聲明:

it's a work in progress, most of the .h file can be parsed 

但是我需要能夠解析接口和實現的東西。

在那裏有一個完整的Objective-C 2.0語法嗎?我更喜歡可以與Scala一起工作的東西(所以任何與Java兼容的東西,比如ANTLR,都是完美的),但是現在我願意爲其他解析器工具包設計一些東西。

+0

gcc可以編譯Objective-C程序(假設你沒有使用Apple的API),所以在gcc源代碼中應該有一個語法,如果沒有? - 哦,我看到你的第一個鏈接就這個問題進行了討論。 – JAB

回答

16

正如其他人所說,Clang會是正確的解決方案。您可以提供您自己的AST使用者,即在翻閱AST時將被調用的類,而不必擔心語法分析或混亂。

Clang全面支持Objective-C,並且靜態分析器中已經有很多類,您可以對自己的檢查進行建模。 (在clang/lib/StaticAnalyzer/Checkers)。

該目錄包含很多靜態分析器檢查器,但您也可以創建一個正常的AST使用者。有關更多信息,請參閱http://code.google.com/p/chromium/wiki/WritingClangPlugins

6

Clang是一個支持Objective-C的靜態分析工具。我發現它在過去非常有用。

http://clang-analyzer.llvm.org/

+0

是的,我知道關於clang。但是我想要一些易於擴展的東西,並且可以讓我編寫自己的程序來分析AST。 – Bill

+2

@ Bill:這是否意味着諷刺? clang的[主要賣點]之一(http://clang.llvm.org/features.html#libraryarch)是其基於庫的架構和易擴展性。 –

+0

@Sedate:不,當然不是。我認爲clang本應該讓編譯器編寫者更容易擴展 - 我不知道你可以編寫簡單的驅動程序來執行AST。 – Bill

4

鐺是可擴展的;您可以擴展現有的靜態分析或創建自己的靜態分析。 llvm/clang被設計爲一系列可鏈接到的庫(動態或靜態)。一個很好的起點是ARC(自動引用計數)遷移器library,它負責靜態分析和重寫目標-c代碼。

arcmt-test是一個使用ARC遷移程序庫的小示例程序。

1

您可以使用OCDepend,它是基於Clang的靜態分析工具,可簡化Objective-C代碼質量管理並提供高度靈活的代碼查詢框架。