C ++内省:枚举C ++代码库中的可用类和方法

时间:2011-10-31 00:50:37

标签: c++ static-analysis introspection

我正在为我的PHD论文进行一些自定义C ++静态代码分析。作为C ++类型系统扩展的一部分,我想要一个C ++代码库,并以最小的努力(它只是一个原型)枚举其可用的函数,方法和类,以及它们的类型签名。快速轻松地完成这样的事情的最佳方法是什么?我是否应该抨击Clang吐出我需要的信息?我应该看看像SWIG这样解析头文件吗?或者我可以做更容易的事情吗?

5 个答案:

答案 0 :(得分:5)

基于GCC的

GCCXML可能是门票。 据我了解,它收集并转储所有定义,但不收集函数/方法的内容。

其他人可能会提到CLANG,它肯定会解析代码并且必须能够访问编译单元中符号的定义。 (我这里没有经验)。

为了完整起见,您应该了解我们的DMS Software Reengineering Toolkit 及其C++ Front End。 (CLANG答案似乎说“走AST”)。 DMS解决方案提供包含所有类型信息的可枚举符号表。如果你愿意的话,你也可以走AST。

静态分析通常会导致诊断,并希望更改源代码。 DMS可以应用源到源program transformations来执行此类更改 通过分析。

答案 1 :(得分:1)

我衷心推荐使用LLVM进行统计分析(另见 Clang Static Analyzer

答案 2 :(得分:1)

我认为你最好的选择是攻击clang并获得AST。有一个很好的教程here。它很容易修改它的语法,它也有一个static analyzer

答案 3 :(得分:1)

在我的工作中,我使用scitools中名为“理解4 C ++”的软件包中的API。我用它来编写我所有的静态分析工具。我甚至编写了一个.NET API来包装他们的C API。我把它放在codeplex上。

完成后,转储所有类类型很容易:

ClassType[] allclasses = Database.GetAllClassTypes()
foreach (ClassType c in allclasses)
{
   Console.WriteLine("Class Name: {0}", c.NameLong);
}

现在有一个关于我的任务的一个小背景故事与你的相似。 在某些年份,我们必须使SDK二进制文件向前兼容前几年的SDK。在这种情况下,比较版本之间的SDK代码以检查潜在的重大更改是有用的。然而,使用像Beyond Compare或Araxis这样的文本差异工具,有几百个文件和成千上万条评论可能会让人头疼。所以我真正需要看的是实际的代码更改,而不是重新排序,不在文件中上下移动代码,不添加注释等...

所以,我编写了一个工具来转储所有代码。

在一个文本文件中,我转储了所有类。对于每个类,我打印其继承树,其成员功能虚拟和非虚拟。对于每个虚函数,我打印它覆盖的父类虚拟方法(如果有的话)。我也打印出它的成员变量。 结构也是如此。 在另一个文件中,我打印所有的宏。 在另一个文件中,我打印了所有的typedef。

然后使用这个我可以使用先前版本的文件来区分这些文件。然后,它立即变得明显从发布到发布的变化。例如,很容易看出函数参数从TCHAR *变为const TCHAR *的位置。

答案 4 :(得分:0)

您可以考虑为您的目的开发GCC Plugin

GCC MELT是一种高级域特定语言(我设计并实现了),可以轻松扩展GCC。

Peter {{{}}研讨会上GROW09研讨会上A Compile-Time Infrastructure for GCC Using Haskell的论文可能与您的工作有关。