【问题标题】:Parsing Objective-C code for static analysis解析 Objective-C 代码以进行静态分析
【发布时间】:2011-10-11 01:06:33
【问题描述】:

我喜欢静态分析和编译时检查,几乎是个错误,但我日常工作的大部分时间都在 Objective-C 中。为了解决这种紧张关系,我希望能够编写自己的分析工具,可以在我的 Objective-C 项目中运行。

但是在 Internet 上进行谷歌搜索表明,人们很难整理出完整的 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,都是完美的),但在这一点上,我愿意调整为另一个解析器工具包设计的东西。

【问题讨论】:

  • gcc 可以编译 Objective-C 程序(假设您没有使用 Apple 的 API),所以 gcc 源代码中应该有语法,不是吗? -- 哦,我看到你的第一个链接谈到了这一点。

标签: objective-c parsing antlr static-analysis javacc


【解决方案1】:

正如其他人所提到的,Clang 将是正确的解决方案。您可以提供自己的 AST 使用者,即在遍历 AST 时将调用的类,让您不必担心解析或弄乱语法。

Clang 完全支持 Objective-C,并且静态分析器中已经有很多类,您可以在之后对自己的检查进行建模。 (在clang/lib/StaticAnalyzer/Checkers)。

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

【讨论】:

    【解决方案2】:

    Clang 是一个支持 Objective-C 的静态分析工具。过去我发现它非常有用。

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

    【讨论】:

    • 是的,我知道 clang。但我想要一些易于扩展的东西,它可以让我编写自己的程序来分析 AST。
    • @Bill:这是讽刺吗? clang 的major selling points 之一是其基于库的架构和易于扩展。
    • @Sedate:不,当然不是。我认为编译器编写者应该更容易扩展 clang - 我不知道您可以编写简单的驱动程序来遍历 AST。
    • @Bill:抱歉!对于 AST 消费者来说确实很容易,例如看到这个(有点过时)tutorial
    【解决方案3】:

    clang 是可扩展的;您可以扩展他们现有的静态分析或创建自己的。 llvm / clang 被构建为一系列可以链接(动态或静态)的库。一个很好的起点是 ARC(自动引用计数)迁移器library,它负责静态分析和重写objective-c 代码。

    arcmt-test 是一个使用 ARC 迁移器库的小示例程序。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多