有没有一种工具可以分析某个源文件中包含文件及其关系?
从一个大的系统中移植某块出来时,它会依赖于一大堆头文件,不知道有没有现成的工具可以用来分析?昨天本来想写一个的,但开了一个头事情太多又扔下来了,先找找有没有现成的吧。
我的大概思路是:
1. 解析.c文件,找到其中的#include,然后每一个递归处理。
2. 给定一个包含路径的列表,对于<...>按这个顺序搜索,找到之后记录其路径,找不到的路径为空,我们就知道文件不存在了。
3. 对于"..."要做当前路径处理。
实际上就是一个链表中再挂链表吧,不过真正写起来也挺烦的。
如果要支持到宏一级,处理更复杂一些。
如果要支持分析哪些数据结构在要移出来的部分中使用了,在哪个文件中并给出来,可能就需要语法分析了吧。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
cflow
一个不错的工具,不过不是我所想要的,我想要分析预处理相关的东西,看头文件间的包含关系,以及一些宏。当然更进一步能分析数据类型的引用更好。用gcc -E的输出有可能简化一些分析,或至少我能写个简单程序把需要的头文件挑出来:
# 44 "../sys/_pthreadtypes.h"
# 64 "../sys/_pthreadtypes.h"
# 48 "../sys/types.h" 2
# 335 "../sys/types.h"
# 1 "../sys/select.h" 1
# 38 "../sys/select.h"
# 1 "../sys/_sigset.h" 1
# 51 "../sys/_sigset.h"
# 39 "../sys/select.h" 2
# 1 "../sys/_timeval.h" 1
# 47 "../sys/_timeval.h"
gcc -M
不知道,你弄明白了告诉我吧
楼上说的 gcc -M 是自动解决头文件依赖,你觉得对你有用么?这个参数很神奇
这几天太忙了没空儿看。今天大概看了一下,感觉-E参数输出的数字是把头文件之间的包含关系串起来的。
如文件名为test.c,则里面的#1 test.c好像表示了包含的开始,#n test.c 2表示在这个C文件中表示一个包含文件结束,重新加到了C文件中#include这一行,n是行号。
包含文件中#1 xxx.h 1 3 4表示xxx.h被包含,#n xxx.h 3 4中n是这个文件中的某一行,后面“3 4”不知道用来干啥的,一过“1 3 4”表示一个文件开始被包含,“3 4”表示这个文件中某行开始,而"2 3 4”是用来退到上一层结束的。
没仔细看,可能不一定完全正确,但大概就是这样的吧:
# 29 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/_ansi.h" 1 3 4
# 15 "/usr/include/_ansi.h" 3 4
# 1 "/usr/include/newlib.h" 1 3 4
# 16 "/usr/include/_ansi.h" 2 3 4
# 1 "/usr/include/sys/config.h" 1 3 4
# 1 "/usr/include/machine/ieeefp.h" 1 3 4
# 5 "/usr/include/sys/config.h" 2 3 4
# 167 "/usr/include/sys/config.h" 3 4
# 1 "/usr/include/cygwin/config.h" 1 3 4
# 168 "/usr/include/sys/config.h" 2 3 4
# 17 "/usr/include/_ansi.h" 2 3 4
# 30 "/usr/include/stdio.h" 2 3 4
http://linux.chinaunix.net/bbs/thread-1114771-1-2.html
看看你应该明白
不明白,做广告?这个只是在线在代码而已,和我的问题八杆子打不着,我只是想要一个自动化分析的工具。
呵呵,也算是。你仔细看了吗?
这可不仅仅是在线在代码,对于 c 的源程序,做了最详尽精确的cross reference。
1 去除C源代码中未使用的条件编译分枝
2 include 文件链接
3 可以知道变量,在什么地方定义的,在什么地方用过
4 宏在什么地方定义的,包含了哪些宏,被哪些宏包括
你的要求我是肯定可以做到的(90%),而且肯定不是用手工。呵呵
是一个挺好的工具,但的确不是我所想要的。我所想要的是分析头文件的包含关系,以及头文件所在的位置,反正你的工具用了一下我没找到这一功能;另外我想做的是自动化地把文件挑出来,而不是用来看的。
你的工具只支持在WEB服务器运行吗?另外所谓去掉预处理条件代码是要能配置一些宏值才能做吧,不能只简单从文件中反推有没有定义,因为现在许多工程都是通过编译器传宏定义值的。