使用clang来分析C ++代码

时间:2010-03-11 04:54:51

标签: c++ clang

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

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

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

2 个答案:

答案 0 :(得分:1)

clang旨在实现模块化。从其页面引用:

  

clang的主要设计理念是   它使用基于库的   建筑。在这个设计中,各种各样   前端的部分可以干净利落   分为单独的库   然后可以混淆不同   需求和用途。

根据您的需要查看libast之类的clang库。阅读更多here

答案 1 :(得分: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 ++以一种建筑形状倾注到另一种建筑形状中。

实施仪器可能非常容易。而且你不必等待它成熟。

相关问题