C++;内省:枚举C+中可用的类和方法+;代码基 我正在为我的博士论文做一些C++静态代码分析。作为C++类型系统的扩展的一部分,我想采用C++代码库,并用最小的努力枚举其可用的函数、方法和类,以及它们的类型签名(它只是一个原型)。快速轻松地完成类似操作的最佳方法是什么?我是不是应该通过窃听Clang来吐出我需要的信息?我应该看看用SWIG之类的东西解析头文件吗?或者我可以做一件更简单的事情吗?

C++;内省:枚举C+中可用的类和方法+;代码基 我正在为我的博士论文做一些C++静态代码分析。作为C++类型系统的扩展的一部分,我想采用C++代码库,并用最小的努力枚举其可用的函数、方法和类,以及它们的类型签名(它只是一个原型)。快速轻松地完成类似操作的最佳方法是什么?我是不是应该通过窃听Clang来吐出我需要的信息?我应该看看用SWIG之类的东西解析头文件吗?或者我可以做一件更简单的事情吗?,c++,static-analysis,introspection,C++,Static Analysis,Introspection,我衷心推荐LLVM用于静态分析(另请参见)我认为你最好的选择是破解clang并获得AST。有一个很好的教程。修改其语法非常容易,而且它还有一个基于GCC的。,可能就是问题所在。 据我所知,它收集并转储所有定义,但不包括函数/方法的内容 其他人可能会提到CLANG,它当然会解析代码,并且必须能够访问编译单元中符号的定义。(我在这里没有经验) 为了完整起见,您应该了解我们的 用它的。(叮当作响的回答似乎在说“走AST”)。DMS解决方案提供了一个包含所有类型信息的可枚举符号表。如果你愿意的话,你也可

我衷心推荐LLVM用于静态分析(另请参见

我认为你最好的选择是破解clang并获得AST。有一个很好的教程。修改其语法非常容易,而且它还有一个基于GCC的。

,可能就是问题所在。 据我所知,它收集并转储所有定义,但不包括函数/方法的内容

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

为了完整起见,您应该了解我们的 用它的。(叮当作响的回答似乎在说“走AST”)。DMS解决方案提供了一个包含所有类型信息的可枚举符号表。如果你愿意的话,你也可以走AST

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

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

一旦具备了这些功能,就可以轻松地转储所有类类型:

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 *的位置。例如:

< P>您可以考虑开发A。 是一种高级领域特定语言(我设计并实现了),用于轻松扩展GCC


彼得·科林伯恩(Peter Collingbourne)和保罗·凯利(Paul Kelly)在研讨会上发表的关于a的论文可能与你的工作相关。

这个问题有点复杂,也很一般。您是否考虑过使用GCC之类的编译器?好的是,你已经做了很多工作,而且,当一个新版本出现时,你可以适应新版本。