Scientific Toolworks“理解”工具应该能够为 C 和 C++ 生成调用图。
Doxygen还可以生成调用图。
我对这些都没有任何经验,但有一些苛刻的意见。你需要记住,我是另一种工具的供应商,所以对这个观点持保留态度。
我有为具有 250,000 个函数的大型 C 系统(2500 万行)构建相当准确的调用图的经验。
我在构建实际调用图时遇到的一个问题是间接函数调用,对于 C++,重载方法函数调用。在大型系统中,这两种情况都有很多。要确定调用 FOO 时调用的内容,您的工具必须深入了解编译器/语言如何解析重载调用,并且对于间接函数调用,必须合理精确地确定函数指针可能实际指向的内容在一个大系统中。如果你没有合理地理解这些,你的调用图将包含很多误报(例如,A 调用 B 的虚假声明),并且在规模上误报是一场灾难。
对于 C++,您必须拥有完整的编译器前端。理解或 Doxygen 都没有这个,所以我看不出他们如何真正理解 C++ 的重载/Koenig 查找规则。了解或 Doxygen 都没有尝试我所知道的间接函数调用的推理。
我们的DMS Software Reengineering Toolkit使用C 语言精确的前端为 C 构建了调用图,即使使用间接函数指针也是如此。
我们有C++ 语言精确的前端,它正确地进行了重载解析(在 C++ 委员会同意的范围内,我们理解他们所说的,以及各个编译器做了什么[他们并不总是同意]),并且我们有类似 Doxygen 的东西来显示这些信息。我们目前没有针对 C++ 的函数指针分析,但我们正在研究它(我们在方法中拥有完整的控制流图,这是一大步)。
我知道CLANG有一些计算调用图的选项,我希望这在重载时是准确的,因为 Clang 本质上是一个用一堆组件实现的 C++ 编译器。我不知道 Clang 是否对函数指针进行了分析。