免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4339 | 回复: 14
打印 上一主题 下一主题

有没有一种工具可以分析某个源文件中包含文件及其关系? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-20 11:21 |只看该作者 |倒序浏览
从一个大的系统中移植某块出来时,它会依赖于一大堆头文件,不知道有没有现成的工具可以用来分析?昨天本来想写一个的,但开了一个头事情太多又扔下来了,先找找有没有现成的吧。

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

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

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

论坛徽章:
0
2 [报告]
发表于 2009-05-20 11:33 |只看该作者
cflow

论坛徽章:
0
3 [报告]
发表于 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版本。

论坛徽章:
0
4 [报告]
发表于 2009-05-20 21:32 |只看该作者

回复 #1 Cyberman.Wu 的帖子

gcc -M

论坛徽章:
0
5 [报告]
发表于 2009-05-21 09:27 |只看该作者

回复 #3 Cyberman.Wu 的帖子

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

论坛徽章:
0
6 [报告]
发表于 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的输出的;不过这个输出确实有一些有,它好像分析了引用哪些类型,有待再仔细测试一下。

论坛徽章:
0
7 [报告]
发表于 2009-06-02 09:55 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2009-06-03 14:19 |只看该作者

回复 #7 jqbsx 的帖子

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

论坛徽章:
0
9 [报告]
发表于 2009-06-03 15:39 |只看该作者
原帖由 Cyberman.Wu 于 2009-6-3 14:19 发表
不明白,做广告?这个只是在线在代码而已,和我的问题八杆子打不着,我只是想要一个自动化分析的工具。

呵呵,也算是。你仔细看了吗?

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

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

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

论坛徽章:
0
10 [报告]
发表于 2009-06-03 19:30 |只看该作者

回复 #9 jqbsx 的帖子

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

你的工具只支持在WEB服务器运行吗?另外所谓去掉预处理条件代码是要能配置一些宏值才能做吧,不能只简单从文件中反推有没有定义,因为现在许多工程都是通过编译器传宏定义值的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP