C ++中调用图的简单工具

时间:2010-01-08 12:26:51

标签: c++ static-analysis

是否有简单的工具,可用于确定函数调用的位置,函数调用的其他函数......?

编辑:我正在使用Mac OS X(10.6)并且只想进行静态分析。

谢谢!

4 个答案:

答案 0 :(得分:7)

gtags是一个可用于标记的工具,但也适用于呼叫跟踪。

http://www.gnu.org/software/global/

这支持C,C ++,Yacc,Java和PHP4。 但它无法正确处理C ++模板或其他复杂的东西。

使用这个标记解析器,我制作了一个脚本来从中获取一个调用树 用户通过bash完成选择,如下所示,
这是在谷歌探查器代码中显示一个calltree:

% global-calltree -x prof_handler Add Evict ProfileData Stop DisableHandler RAW_CHECK WRITE_TO_STDERR
prof_handler:414 => Add:441               |profiler.cc                         |instance_.collector_.Add(depth, stack);
 Add:241 => Evict:290                      |profiledata.cc                      |Evict(*e);
  Evict:61 => ProfileData:75                |profiledata.cc                      |ProfileData::ProfileData()
   ProfileData:124 => Stop:125               |profiledata.cc                      |Stop();
    Stop:261 => DisableHandler:273            |profiler.cc                         |DisableHandler();
     DisableHandler:400 => RAW_CHECK:405       |profiler.cc                         |RAW_CHECK(sigaction(SIGPROF, &sa, NULL) == 0, "sigaction failed");
      RAW_CHECK:83 => WRITE_TO_STDERR:86        |base/logging.h                      |WRITE_TO_STDERR("Check failed: " #condition ": " message "\n",           \
       WRITE_TO_STDERR:59 => DECLARE_int32:65    |base/logging.h                      |DECLARE_int32(verbose);

答案 1 :(得分:4)

cscope怎么样?看看第3和第3页面上的第4个项目符号:

  • 函数调用的函数
  • 调用函数的函数

自从我在C ++上使用cscope以来已经有一段时间了,我似乎记得它在C代码上坚如磐石,但在C ++方面并不那么强大。

答案 2 :(得分:1)

不知道简单的工具,但是免费的是codeviz(你可以阅读原始转储而不是生成图表,如果你愿意的话)。警告:所有静态分析工具都存在虚拟调用的一些问题,甚至更糟糕的是模板。

答案 3 :(得分:0)

由于您使用mac os, clang 是一个具有静态分析功能的新编译器。

youtube上的一个示例: Finding bugs with clang