【问题标题】:antlr generate ast for c and parse the astantlr 为 c 生成 ast 并解析 ast
【发布时间】:2011-11-09 06:05:24
【问题描述】:

我正在对c程序进行静态分析。我搜索了antlr网站,似乎没有合适的语法文件为c程序生成ast。是否意味着我必须从一开始就自己做。或者是有一个更快的方法。我还需要一个可以遍历解析器创建的 ast 的树解析器。

【问题讨论】:

  • 您希望静态分析仪检测什么样的条件?
  • @ira,常见的安全问题,比如缓冲区溢出。

标签: c antlr abstract-syntax-tree


【解决方案1】:

您表示要进行静态分析以检测缓冲区溢出。

首先,为 C 编写语法比看起来要难。标准中有所有这些东西,然后才是真正的编译器实际接受的东西。你必须决定如何处理预处理器(它因编译器而异!)。如果您没有完全正确地获得语法和预处理,您将无法解析真正的程序。 (如果你想做玩具语言,那很好,但你不需要 C 语法)。

要进行分析,您需要远比 AST 更多的机器。您将需要符号表、控制和数据流分析、可能的本地和全局指向分析、调用图提取以及某种类型的范围分析。

人们似乎不明白这一点。

** 获得一个解析器距离用真正的语言做任何有用的事情还有很长的路要走 **

我大喊大叫,因为我一遍又一遍地看到这一点。

如果您想继续执行特定的程序分析或转换任务,除非您想在开始任务之前因年老而死,否则您最好找到一个已经具备大部分您需要的基础。具有古怪语法的解析器生成器的基础不是基础。 (不要误会我的意思:ANTLR、YACC、JavaCC 都是很好的解析器生成器,它们非常适合为新语言构建解析器。当投资完成时,它们非常适合为真正的语言实现生产解析器。但是他们生产解析器,而且大多数人不做生产部分。而且他们也不提供额外的机器。)

我们的DMS Software Reengineering Toolkit 包含所有上述机制,因为几乎总是需要它,而且实施起来非常头疼。 (到目前为止,我的团队已经投入了 15 年。)

我们还用各种方言实例化了机械是特别适用于COBOL and Java, C, C++ 的形式(在某种程度上,这种语言真的很难),因此其他人不必重复这个漫长的过程。

GCC 和 Clang 作为 C 和 C++ 的替代品已经相当成熟。

【讨论】:

    【解决方案2】:

    最难的部分是写语法。混合重写规则以创建 AST 并不难,从发出 AST 的解析器语法创建树语法也不是那么困难(与编写解析器语法相比,即)。

    这是之前的问答,展示了如何创建正确的 AST:How to output the AST built using ANTLR?

    我找不到一个像样的 SO-Q&A 来解释如何创建树语法,所以这里有一个指向我的个人博客的链接来解释这一点:http://bkiers.blogspot.com/2011/03/6-creating-tree-grammar.html

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多