任何涉及 C++ 精确分析的东西基本上都需要某个地方的整个 C++ 前端(否则你不会得到答案,或者它们会出错,并且当你有“大型”应用程序时效果很差)。这里没有很多实用的答案。
已经提到的是 GCCXML 是 GCC 派生的包,因此它具有必要的 C++ 前端。它产生 XML,因此它将产生大量输出,您必须读回这些输出以形成另一个答案中建议的“内存数据结构”。不幸的是,GCCXML 已经构建了该内存数据结构,然后将其导出为 XML,并迫使您再次构建它。当然,您可以只使用构建内存数据结构的 GCC,但是您必须将 GCC 破解为您想要的,它真的非常想成为一个编译器。这意味着您将面临一场斗争,以使其服从您的意愿(并解释为什么 GCCXML 存在:大多数人不希望这场斗争)。
没有提到的是 Edison Design Group C++ (EDG) 前端,它直接在内存数据结构中构建。它是前端;你必须自己做所有的分析工作,但你的任务可能很简单,所以这并不难。
我知道的最后一个解决方案是我的:C++ FrontEnd for DMS。DMS 是构建程序分析的基础,它的 C++ FrontEnd 是一个完整的 C++ 前端(例如,完成 GCC 和 Edison 前端所做的一切:解析、树构建、名称/类型解析)。并且您必须通过遍历 DMS 生成的“内存中”数据结构来对您的特殊分析进行编码,就像对 GCCXML 和 EDG 一样。
真正不同的是,DMS 可用于通过更新内存数据结构中的源代码来实际修改源代码,并从这些内存结构重新生成可编译代码,包括原始注释。