你没有指出的是你想做什么样的“分析”。大多数 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++ 以一种架构形式注入到另一种架构中。
实现您的仪器可能非常容易。而且您不必等待它成熟。