4

我们希望对用户的 C++ 代码进行一些相当简单的分析,然后使用该信息来检测他们的代码(基本上是用一些检测代码重新生成他们的代码),以便用户可以对其代码进行动态分析并获取有关事物的统计信息像某些数字类型的值范围。

clang 现在应该能够处理足够多的 C++ 来处理我们的用户将向它抛出的那种代码 - 而且由于 clang 的 C++ 覆盖率在我们完成时会不断改进,它会更好。

那么如何使用像这样的 clang 作为一个独立的解析器呢?我们认为我们可以只生成一个 AST,然后遍历它寻找我们有兴趣跟踪的类的对象。有兴趣听取其他在没有 LLVM 的情况下使用 clang 的人的意见。

4

2 回答 2

1

clang被设计成模块化的。从其页面引用:

clang 的一个主要设计理念是使用基于库的架构。在这种设计中,前端的各个部分可以清晰地划分为单独的库,然后可以将它们混合起来以满足不同的需求和用途。

查看libast符合您需求的 clang 库。在这里阅读更多。

于 2010-03-11T04:59:32.653 回答
1

你没有指出的是你想做什么样的“分析”。大多数 C++ 分析都要求您拥有准确的符号表数据,以便在遇到符号foo时了解它是什么。(从技术上讲,如果没有这样的符号表,您甚至不知道+是什么!)您还需要泛型类型信息;如果你有一个表达式“a*b”,结果的类型是什么?拥有“名称和类型”信息是您想要进行分析的几乎任何事情的关键。

如果您坚持clang,那么这里还有其他答案。我不知道它提供了名称和类型解析。

如果您需要名称和类型解析,那么另一种解决方案是DMS Software Reengineering Toolkit。DMS 为解析、分析、转换和反解析(从编译器数据结构重新生成源代码)提供通用编译器之类的基础设施。DMS 的工业级 C++ 前端(它也有许多其他语言前端)根据 ANSI 标准以及 GCC 和 MS VC++ 方言提供全名和类型解析。

代码转换可以通过 DMS 提供的抽象语法树接口来实现,也可以通过以目标语言(在本例中为 C++)的表面语法编写的模式导向程序转换规则来实现。这是使用规则语言的简单转换:

    domain Cpp~GCC3;  -- says we want patterns for C++ in the GCC3 dialect

    rule optimize_to_increment(lhs:left_hand_side):expression -> expression
      " \lhs = \lhs + 1 " ->   " \lhs++"  if no_side_effects(lhs).

这隐含地对 DMS 构建的 AST 进行操作,以修改它们。条件允许您查询模式变量(在本例中为lhs)的任意属性,包括名称和类型约束(如果您愿意)。

DMS 已多次用于非常复杂的程序分析和 C++ 代码转换。我们通过使用 DMS 以一种相当明显的方式检测 C++ 代码来构建 C++ 测试覆盖工具。在该网站上,有一个参考书目,其中描述了如何使用 DMS 来重组军用飞机任务软件的大型产品线的架构。这种活动通过应用大量如上所述的模式定向转换,将 C++ 以一种架构形式注入到另一种架构中。

实现您的仪器可能非常容易。而且您不必等待它成熟。

于 2010-03-11T05:26:00.637 回答