Cyberman.Wu 发表于 2009-05-20 11:21

有没有一种工具可以分析某个源文件中包含文件及其关系?

从一个大的系统中移植某块出来时,它会依赖于一大堆头文件,不知道有没有现成的工具可以用来分析?昨天本来想写一个的,但开了一个头事情太多又扔下来了,先找找有没有现成的吧。

我的大概思路是:
1. 解析.c文件,找到其中的#include,然后每一个递归处理。
2. 给定一个包含路径的列表,对于<...>按这个顺序搜索,找到之后记录其路径,找不到的路径为空,我们就知道文件不存在了。
3. 对于"..."要做当前路径处理。

实际上就是一个链表中再挂链表吧,不过真正写起来也挺烦的。

如果要支持到宏一级,处理更复杂一些。
如果要支持分析哪些数据结构在要移出来的部分中使用了,在哪个文件中并给出来,可能就需要语法分析了吧。

prolj 发表于 2009-05-20 11:33

cflow

Cyberman.Wu 发表于 2009-05-20 17:21

回复 #2 prolj 的帖子

一个不错的工具,不过不是我所想要的,我想要分析预处理相关的东西,看头文件间的包含关系,以及一些宏。当然更进一步能分析数据类型的引用更好。用gcc -E的输出有可能简化一些分析,或至少我能写个简单程序把需要的头文件挑出来:# 1 "../sys/_pthreadtypes.h" 1
# 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"

你知道前后的那些数字是干啥的吗?

cflow比较奇怪的是我在GNU的网站上只看到1.2版本,而Linux中没有安装,FreeBSD的Ports中倒有个2.0版本。

jzhang918 发表于 2009-05-20 21:32

回复 #1 Cyberman.Wu 的帖子

gcc -M

prolj 发表于 2009-05-21 09:27

回复 #3 Cyberman.Wu 的帖子

不知道,你弄明白了告诉我吧:mrgreen:
楼上说的 gcc -M 是自动解决头文件依赖,你觉得对你有用么?这个参数很神奇:mrgreen:

Cyberman.Wu 发表于 2009-05-24 14:55

回复 #5 prolj 的帖子

这几天太忙了没空儿看。今天大概看了一下,感觉-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”是用来退到上一层结束的。

没仔细看,可能不一定完全正确,但大概就是这样的吧:# 1 "/usr/include/stdio.h" 1 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


gcc的-M(以及-M...)确实是挺神奇的参数,我原来用的不对是因为有不存在的文件报错直接退出了,加上一个-MG就OK了。用它的输出再加上一些简单的处理基本上能达到我想要的效果。我原来是打算用gcc -E的输出的;不过这个输出确实有一些有,它好像分析了引用哪些类型,有待再仔细测试一下。

jqbsx 发表于 2009-06-02 09:55

http://linux.chinaunix.net/bbs/thread-1114771-1-2.html
看看你应该明白

Cyberman.Wu 发表于 2009-06-03 14:19

回复 #7 jqbsx 的帖子

不明白,做广告?这个只是在线在代码而已,和我的问题八杆子打不着,我只是想要一个自动化分析的工具。

jqbsx 发表于 2009-06-03 15:39

原帖由 Cyberman.Wu 于 2009-6-3 14:19 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
不明白,做广告?这个只是在线在代码而已,和我的问题八杆子打不着,我只是想要一个自动化分析的工具。
呵呵,也算是。你仔细看了吗?

这可不仅仅是在线在代码,对于 c 的源程序,做了最详尽精确的cross reference。

1 去除C源代码中未使用的条件编译分枝
2 include 文件链接
3 可以知道变量,在什么地方定义的,在什么地方用过
4 宏在什么地方定义的,包含了哪些宏,被哪些宏包括

你的要求我是肯定可以做到的(90%),而且肯定不是用手工。呵呵

Cyberman.Wu 发表于 2009-06-03 19:30

回复 #9 jqbsx 的帖子

是一个挺好的工具,但的确不是我所想要的。我所想要的是分析头文件的包含关系,以及头文件所在的位置,反正你的工具用了一下我没找到这一功能;另外我想做的是自动化地把文件挑出来,而不是用来看的。

你的工具只支持在WEB服务器运行吗?另外所谓去掉预处理条件代码是要能配置一些宏值才能做吧,不能只简单从文件中反推有没有定义,因为现在许多工程都是通过编译器传宏定义值的。
页: [1] 2
查看完整版本: 有没有一种工具可以分析某个源文件中包含文件及其关系?