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

标签 c call-graph

我发现了很多程序,例如 Doxygengprof,它们可以使用 graphviz 等外部可视化工具来完成这项工作。

不幸的是,这些程序需要大量的初始配置,而我只对使用 malloc 的函数的调用堆栈感兴趣。

项目很大,有数百个文件,某处有一个 main 函数。

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

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

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

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

最佳答案

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

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

另外,call stack仅在运行时已知,并且它是动态变化的。它在编译时没有意义。编译器只组织调用帧。

您需要一个在编译器内部工作的工具,在编译器的内部表示上,因此您需要一些更复杂的工具 static program analyzer ,即使那样也会给你近似的结果。

你可以使用 MELT (用于自定义 GCC 编译器的插件和领域特定语言,我正在将其开发为免费软件)因为它适用于 GCC 内部表示。 tutorial about using MELT 中的findgimple 模式示例非常接近您的问题,但您可以使用自己的 MELT 扩展自定义 GCC(或请别人这样做)。

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

关于c - C 程序中调用图生成的静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517458/

相关文章:

c - 实现 net-snmp 子代理 (linux/C)

c - 函数指针签名不匹配,执行程序时仍然没有遇到任何问题

c - fscanf 转结构体数组

c - 循环插入二叉树

c - C中的高效字符串连接

clang - 使用 clang 为文件创建调用图

fxcop - 静态调用图分析解决了哪些问题?

abap - 如何构建功能模块的调用图?

java - 如何为 java 项目生成调用图

c++ - 如何使用一些分析信息获取程序的调用图