2010-03-11 78 views
4

我们希望对用户的C++代码进行一些相当简单的分析,然后使用该信息来测试代码(基本上用一些工具代码重新生成代码),以便用户可以运行动态分析他们的代码并获取某些数值类型值的范围等数据。使用clang分析C++代码

clang应该能够处理足够的C++来处理我们的用户会投掷的代码类型 - 而且由于clang的C++覆盖率在我们完成之后会不断提高,所以它会更好。

那么,人们如何使用这样的clang作为独立的解析器呢?我们认为我们可以生成一个AST,然后走它寻找我们感兴趣跟踪的类的对象。会有兴趣听到别人在没有使用LLVM的情况下使用clang。

回答

1

clang被设计为模块化。从它的页面引用:

的铛的主要设计理念是 其采用了基于库的 架构。在这种设计中,前端的各个部分可以干净地划分成单独的库,然后 然后可以混合用于不同的需求和使用。

看看铛图书馆像libast为您的需求。阅读更多here

1

你没有注明的是你想要做什么样的“分析”。大多数C++分析都要求你有准确的符号表数据,这样当你遇到符号foo时,你有一些想法是什么。 (你在技术上甚至不知道什么+没有这样的符号表!)你也需要泛型类型信息;如果你有一个表达式“a * b”,结果的类型是什么?拥有“名称和类型”信息几乎是任何你想做的分析的关键。

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

如果您需要需要名称和类型分辨率,那么另一种解决方案是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++以一种体系结构形式注入另一种体系结构中。

这可能很容易实现你的仪器。而且你不必等待它成熟。

+2

我倾向于认为clang必须提供名称和类型解析信息 - 他们还要如何编译到LLVM并提供有用的错误消息(在这一点上比gcc更有用)。 – aneccodeal 2010-03-11 05:51:29

+0

当然,clang-the-compiler有某种符号表。它是否可用AST以便利的形式?铿锵编译器甚至构建完整的AST?它是否可以同时用于多个编译单元?如果我正在设计这样一个工具(并且已经完成了DMS),我会怎么做,但这不同于他们实际做的。我只是不知道。 – 2014-07-07 20:07:02