C 程序中调用图生成的静态分析

now*_*wox 1 c call-graph

我发现很多程序,例如Doxygengprof可以使用外部可视化工具(例如graphviz.

不幸的是,这些程序需要大量的初始配置,我只想知道使用malloc.

该项目很大,有数百个文件和某个main功能。

我目前需要一些时间的解决方案是编写一个 Perl/Python 脚本:

  1. 搜索malloc\s*(.*?)来电。
  2. 检索父函数的名称
  3. 搜索调用此父函数的位置
  4. 转到 2

这里有一些实用程序可以帮助我吗?

该项目在 Microsoft VisualStudio 2010 上,并生成 dll 作为嵌入式设备的 API。外部库的使用量不是很大。我们使用常用的库,例如 ftdi 或 wdapi910

Bas*_*tch 5

对于malloc相关的 bug,valgrind工具非常有用(在运行时,在测试时)。

您的要求不能通过对源代码的纯文本检查来满足(例如,因为malloc可能从许多内联函数或宏中调用,并且因为它甚至可以#define-d 到其他东西,或通过函数指针调用,或在来自外部库的函数中调用:甚至fopenfprintf可能调用malloc)。实际上可以证明它等价于停机问题

此外,调用堆栈仅在运行时才知道,并且它是动态变化的。它在编译时没有意义。编译器只组织调用帧。

你需要一个在编译器内部工作的工具,在编译器的内部表示上,所以你需要一些更复杂的静态程序分析器,甚至会给你近似的结果。

您可以使用MELT(一种插件和领域特定语言来自定义GCC编译器,我正在作为免费软件开发它),因为它适用于 GCC 内部表示。教程中关于使用 MELTfindgimple模式示例与您的问题非常接近,但您可以使用自己的 MELT 扩展自定义 GCC(或请某人这样做)。

附注。valgrind& MELT 主要在 Linux 和 POSIX 系统上可用。您可能会努力在 Microsoft 生态系统中寻找昂贵的等价物。