为C ++代码生成调用图

我正在试图生成调用图,以找出所有可能的执行path正在打一个特定的function(所以我不必手动找出所有的path,因为有很多path导致这个function)。 例如:

path 1: A -> B -> C -> D path 2: A -> B -> X -> Y -> D path 3: A -> G -> M -> N -> O -> P -> S -> D ... path n: ... 

我已经尝试Codeviz和Doxygen,不知何故这两个结果都显示目标函数,D调用。在我的情况下,D是一个类的成员函数,其对象将被包装在一个智能指针。 客户将通过工厂总是获得智能指针对象,以调用D.

有谁知道如何做到这一点?

 static void D() { } static void Y() { D(); } static void X() { Y(); } static void C() { D(); X(); } static void B() { C(); } static void S() { D(); } static void P() { S(); } static void O() { P(); } static void N() { O(); } static void M() { N(); } static void G() { M(); } static void A() { B(); G(); } int main() { A(); } 

然后

 $ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph $ dot -Tpng -ocallgraph.png callgraph.dot 

产生一些shiny的图像(有一个“外部节点”,因为main有外部连接,也可以从外部调用该翻译单元):

调用图

你可能想用c++filt来后处理这个,这样你就可以得到所涉及的函数和类的unmangled名字。 如下所示

 #include <vector> struct A { A(int); void f(); // not defined, prevents inlining it! }; int main() { std::vector<A> v; v.push_back(42); v[0].f(); } $ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -std-link-opts -dot-callgraph $ cat callgraph.dot | c++filt | sed 's,>,\\>,g; s,-\\>,->,g; s,<,\\<,g' | gawk '/external node/{id=$1} $1 != id' | dot -Tpng -ocallgraph.png 

产生这种美(哦,我的大小没有优化打开太大了!)

美女

神秘的未命名函数Node0x884c4e0是一个占位符,被认为是由定义未知的任何函数调用的。

你可以通过使用doxygen来实现这个function(select使用dot来生成graphics)。

在这里输入图像描述

用Johannes Schaub – litb main.cpp,它生成这个:

在这里输入图像描述

doxygen / dot可能比clang / opt更容易安装和运行。 我没有设法自己安装它,这就是为什么我试图find一个替代解决scheme!

为了让clang++命令find像mpi.h这样的标准头文件,应该使用两个附加选项-### -fsyntax-only ,即完整的命令应该如下所示:

 clang++ -### -fsyntax-only -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph 

静态计算精确的C ++调用图很困难,因为您需要一个精确的语言分析器,正确的名称查找和一个很好的指向分析器来正确地expression语言语义。 Doxygen没有任何这些,我不知道为什么人们声称喜欢它的C ++; 很容易构build一个Doxygen错误分析的10行C ++示例)。

你可能会更好地运行一个定时分析器,它dynamic地收集一个调用图 (这是我们的描述),并简单地运行了很多情况。 这样的分析器将向您显示实际的调用图行使。

编辑:我突然想起了C ++的理解 ,它声称构造调用图。 我不知道他们用于parsing器,或者他们是否做了详细的分析。 我对他们的产品没有具体的经验。

Schaub的回答给我留下了深刻的印象: 我希望Clang拥有所有的元素。

“C ++ Bsc分析器”可以显示调用图 – 通过读取由bscmake实用程序生成的文件。