代码之家  ›  专栏  ›  技术社区  ›  aneccodeal

用CLAN分析C++代码

  •  4
  • aneccodeal  · 技术社区  · 16 年前

    我们想对用户的C++代码做一些简单的分析,然后使用这些信息来对它们的代码进行编码(基本上用一点代码代码重新编码它们),这样用户就可以对它们的代码进行动态分析,并获得某些数值类型的值范围内的统计信息。

    CLAN应该能够处理足够的C++来处理我们的用户会扔给它的代码,因为CLAN的C++覆盖率在我们完成的时候不断地提高,它会更好。

    那么如何使用像这样的clang作为一个独立的解析器呢?我们认为我们可以生成一个AST,然后遍历它,寻找我们感兴趣的类的对象。有兴趣听取其他人谁是使用没有LLVM的叮当声。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Eli Bendersky    16 年前

    clang 设计为模块化。引用其页面:

    它的使用以图书馆为基础 建筑。在这个设计中,各种 前端部分可以清洁 分为不同的图书馆

    看看像这样的铿锵图书馆 libast 为了你的需要。阅读更多 here .

        2
  •  1
  •   Ira Baxter    16 年前

    你没有指出的是你想做什么样的“分析”。大多数C++分析要求您有精确的符号表数据,以便在遇到符号时使用 福 +

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

    如果你 需要 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,以修改它们。有条件的 ),包括名称和类型约束(如果需要)。

    DMS已经被许多次用于非常复杂的程序分析和C++代码的转换。我们通过使用DMS来以C++的方式使用C++代码来构建C++测试覆盖工具。在这个网站上,有一本关于DMS如何被用于重组军用飞机任务软件的大型产品线架构的文献。这种活动通过将大量的模式引导变换应用于上面,将一个建筑形状中的C++注入到另一个建筑形状中。