我有一个非常大的C ++程序,其中某些低级函数只能从某些上下文中调用或在采取特定预防措施时调用。我正在寻找一个工具,向我展示哪些低级函数被更高级别的函数调用。我希望在IDE中可以看到这个有一些下拉或标记,可能在带注释的源输出中,但是比手动搜索调用图更简单的方法会有所帮助。
这是静态分析的问题,我没有得到分析器的帮助。
我主要在mac上工作,linux也没关系,如果只在Windows上提供某些内容,那么我就可以使用它了。
更新
仅仅使用调用图并不能更快地回答问题,“foo()是否可能导致调用x()y()或z()”。 (或者我错过了一些关于调用图工具的东西,也许我需要编写一个遍历它的程序来获得解决方案?)
答案 0 :(得分:1)
存在使用LLVM的Clang Static Analyzer,它也应该存在于OS X上。实际上我认为这是集成在Xcode中的。无论如何,存在一个GUI。
此外,还有几个LLVM passes,您可以在其中生成调用图,但我不确定这是否是您想要的。
答案 1 :(得分:1)
工具Scientific Toolworks "Understand"工具应该能够为C和C ++生成调用图。
Doxygen也可以产生调用图。
我对这两种方面都没有任何经验,但有些苛刻的意见。你需要记住,我是另一种工具的供应商,所以请大家斟酌这个意见。
我有经验为大型C系统(2500万行)构建reasonably accurate call graphs,具有250,000个功能。
我在构建实际调用图时遇到的一个问题是间接函数调用,对于C ++,重载方法函数调用。在大型系统中,有很多这两种系统。要确定在调用FOO时调用的内容,您的工具必须深入理解编译器/语言如何解决重载调用,并且对于间接函数调用,可以合理精确地确定函数指针实际指向的内容。在一个大系统中。如果你没有得到合理的正确答案,那么你的通话图将包含许多误报(例如,A呼叫B的虚假声称),并且在规模上误报是一种灾难。
对于C ++,您必须拥有相当于完整编译器前端的内容。理解或Doxygen都没有这个,所以我看不出他们如何真正理解C ++的重载/ Koenig查找规则。理解或Doxygen都没有做出我所知道的关于间接函数调用的任何尝试。
我们的DMS Software Reengineering Toolkit使用C-language precise front end确实很好地构建了C的调用图,即使使用间接函数指针也是如此。
我们有C++ language precise front end,它正确地执行了重载决策(在C ++委员会同意的范围内,我们理解他们说了什么,以及个别编译器做了什么[他们并不总是同意] ),我们有像Doxygen这样的东西来显示这些信息。我们目前没有C ++的函数指针分析,但我们正在研究它(我们在方法中有完整的控制流图,这是一个很大的进步)。
我理解CLANG有一些计算调用图的选项,并且我希望在过载时准确,因为Clang本质上是一个用大量组件实现的C ++编译器。我不知道,如果有任何Clang分析函数指针的话。