C 程序中调用图生成的静态分析
Static analysis for call-graph generation in C programs
我发现了很多程序,例如 Doxygen
或 gprof
,它们可以使用 graphviz
等外部可视化工具来完成这项工作。
不幸的是,这些程序需要大量的初始配置,而我只对使用 malloc
的函数的调用堆栈感兴趣。
项目很大,有数百个文件,某处有一个 main
函数。
我目前的解决方案需要一些时间,是编写一个 Perl/Python 脚本:
- 搜索
malloc\s*(.*?)
个电话。
- 检索父函数的名称
- 搜索调用此父函数的位置
- 转到 2
这里有一些实用程序可以帮助我吗?
该项目在 Microsoft VisualStudio 2010 上,并为嵌入式设备生成 dll 作为 API。外部库的使用不是很大。我们使用通用库,例如 ftdi 或 wdapi910
对于malloc
相关的bug,valgrind工具非常有用(在运行时,测试时)。
您的任务无法通过纯文本检查源代码来满足(例如,因为 malloc
可能会从许多内联函数或宏中调用,并且因为它甚至可能是 #define
-d 到某些东西否则,或通过函数指针调用,或在外部库的函数中调用:甚至 fopen
或 fprintf
也可以调用 malloc
)。其实可以证明等价于halting problem.
此外,call stack 仅在运行时已知,并且它是动态变化的。它在编译时没有意义。编译器只组织调用帧。
您需要一个在编译器内部工作的工具,在编译器的内部表示上,因此您需要一些更复杂的工具 static program analyzer,即使这样也能给您近似的结果。
您可以使用 MELT (a plugin and domain specific language to customize the GCC compiler, that I am developing as free software) since it works on GCC internal representations. The example of findgimple
mode in the tutorial about using MELT 非常接近您的问题,但您可以使用自己的 MELT 扩展自定义 GCC(或请别人这样做)。
PS。 valgrind
和 MELT 主要在 Linux 和 POSIX 系统上可用。您可能会努力在 Microsoft 生态系统中找到昂贵的等价物。
我发现了很多程序,例如 Doxygen
或 gprof
,它们可以使用 graphviz
等外部可视化工具来完成这项工作。
不幸的是,这些程序需要大量的初始配置,而我只对使用 malloc
的函数的调用堆栈感兴趣。
项目很大,有数百个文件,某处有一个 main
函数。
我目前的解决方案需要一些时间,是编写一个 Perl/Python 脚本:
- 搜索
malloc\s*(.*?)
个电话。 - 检索父函数的名称
- 搜索调用此父函数的位置
- 转到 2
这里有一些实用程序可以帮助我吗?
该项目在 Microsoft VisualStudio 2010 上,并为嵌入式设备生成 dll 作为 API。外部库的使用不是很大。我们使用通用库,例如 ftdi 或 wdapi910
对于malloc
相关的bug,valgrind工具非常有用(在运行时,测试时)。
您的任务无法通过纯文本检查源代码来满足(例如,因为 malloc
可能会从许多内联函数或宏中调用,并且因为它甚至可能是 #define
-d 到某些东西否则,或通过函数指针调用,或在外部库的函数中调用:甚至 fopen
或 fprintf
也可以调用 malloc
)。其实可以证明等价于halting problem.
此外,call stack 仅在运行时已知,并且它是动态变化的。它在编译时没有意义。编译器只组织调用帧。
您需要一个在编译器内部工作的工具,在编译器的内部表示上,因此您需要一些更复杂的工具 static program analyzer,即使这样也能给您近似的结果。
您可以使用 MELT (a plugin and domain specific language to customize the GCC compiler, that I am developing as free software) since it works on GCC internal representations. The example of findgimple
mode in the tutorial about using MELT 非常接近您的问题,但您可以使用自己的 MELT 扩展自定义 GCC(或请别人这样做)。
PS。 valgrind
和 MELT 主要在 Linux 和 POSIX 系统上可用。您可能会努力在 Microsoft 生态系统中找到昂贵的等价物。