4

我有一个非常大的 C++ 程序,其中某些低级函数只能从某些上下文或在采取特定预防措施时调用。我正在寻找一种工具来显示这些低级函数中的哪些被更高级别的函数调用。我希望它在带有一些下拉列表或标签的 IDE 中可见,可能在带注释的源输出中,但任何比手动搜索调用图更简单的方法都会有所帮助。

这是静态分析的问题,我没有得到分析器的帮助。

我主要在 mac 上工作,linux 还可以,如果某些东西只能在 windows 上使用,那么我可以忍受。

更新

仅仅拥有调用图并不能更快地回答这个问题,“foo() 是否可能导致对 x() y() 或 z() 的调用”。(或者我缺少关于调用图工具的一些东西,也许我需要编写一个遍历它的程序以获得解决方案?)

4

2 回答 2

1

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 是否对函数指针进行了分析。

于 2011-12-14T17:23:49.300 回答
1

存在使用 LLVM 的Clang 静态分析器,它也应该出现在 OS X 上。实际上我认为它已集成在 Xcode 中。无论如何,存在一个 GUI。

此外,还有几个 LLVM通道,您可以在其中生成调用图,但我不确定这是否是您想要的。

于 2011-12-14T16:34:41.620 回答