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

发布于 2022-09-18 17:45:17 字数 386 浏览 15 评论 0

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

故事未完 2022-09-25 17:45:17

cflow

纵性 2022-09-25 17:45:17

一个不错的工具,不过不是我所想要的,我想要分析预处理相关的东西,看头文件间的包含关系,以及一些宏。当然更进一步能分析数据类型的引用更好。用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"

烟─花易冷 2022-09-25 17:45:17

gcc -M

花期渐远 2022-09-25 17:45:17

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

不顾 2022-09-25 17:45:17

这几天太忙了没空儿看。今天大概看了一下,感觉-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

灵芸 2022-09-25 17:45:17

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

我乃一代侩神 2022-09-25 17:45:17

原帖由 Cyberman.Wu 于 2009-6-3 14:19 发表
不明白,做广告?这个只是在线在代码而已,和我的问题八杆子打不着,我只是想要一个自动化分析的工具。

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

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

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

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

止于盛夏 2022-09-25 17:45:17

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文