解析Objective-C代码以进行静态分析

19
我喜欢静态分析和编译时检查,甚至有点过于热衷。但我的工作大部分是使用Objective-C。为了解决这种紧张状态,我想编写自己的分析工具,以便在Objective-C项目上运行。

但在互联网上搜索发现,人们很难组合出完整的Objective-C语法。一个网站基本上建议放弃。

我在ANTLR网站上找到了一份语法,但当我启动它时,无法解析任何内容。例如,它对以下代码无响应:

void x();

使用src/main/resources/somecode.m第 1 行,第 0 个字符处出现了无法接受的输入 'void'。

:(

我仔细查看了语法并发现以下令人沮丧的免责声明:

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

但我需要一个可以解析接口和实现的东西。
是否有完整的Objective-C 2.0语法存在?我更喜欢能够与Scala一起使用的东西(因此任何Java兼容的东西,如ANTLR,都是完美的),但在这一点上,我愿意适应为另一个解析器工具包设计的东西。

gcc可以编译Objective-C程序(假设您没有使用苹果的API),因此在gcc源代码中应该有一个语法,不是吗?--哦,我看到你的第一个链接谈到了这个。 - JAB
4个回答

17

就像其他人所提到的,Clang会是正确的解决方案。你可以提供自己的AST(抽象语法树)消费者,也就是当遍历AST时将被调用的类,这样你就不必担心解析或操作语法。

Clang完全支持Objective-C,并且在静态分析器中已经有很多类可以用来模拟你自己的检查。(在clang/lib/StaticAnalyzer/Checkers中)。

该目录包含了许多静态分析器检查器,但你也可以创建一个普通的AST消费者。参考http://code.google.com/p/chromium/wiki/WritingClangPlugins获得更多信息。


6

是的,我知道clang。但我想要一些容易扩展的东西,并且能让我编写自己的程序来分析抽象语法树(AST)。 - Bill
2
@Bill:这是要讽刺吗?Clang的主要卖点之一是它基于库的架构和易于扩展性。 - Aidan Steele
@Sedate:不,当然不是。我以为clang应该更容易让编译器编写者扩展——我不知道你可以编写简单的驱动程序来遍历AST。 - Bill
@Bill:非常抱歉!对于 AST 消费者来说确实很容易,例如请看这个(有点过时的)教程 - Aidan Steele

4
clang是可扩展的,您可以扩展现有的静态分析功能或创建自己的功能。LLVM / clang被架构为一系列可链接的库(动态或静态)。一个很好的起点是ARC(自动引用计数)迁移,它负责静态分析并重写Objective-C代码。 arcmt-test是一个小的示例程序,使用了ARC迁移库。

1
你可以使用OCDepend,它是基于Clang的静态分析工具,可简化Objective-C代码质量管理,并提供高度灵活的代码查询框架。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接