有什么工具可以找出c/c++源程序中没有使用的全局变量和子程序?

ckc 2009-03-04 10:45:21
最好是linux下的工具,我在linux下用gcc呢
...全文
453 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiffa 2009-03-06
  • 打赏
  • 举报
回复
就是重名处理比较麻烦。比如局部变量和全局变量同名,比如重载函数。如果能用编译器连接器的内部名称查找就好了。

kiffa 2009-03-06
  • 打赏
  • 举报
回复
自己写个简单的分析器,直接在预编译之后的(也就是头文件展开后的)源代码文件中查找所有的全局变量和函数的名字,如果在某个编译单元中没出现,或者只出现了一次,那么就可以说它在这个编译单元中没有使用过(因为使用前都要先声明,所以如果只出现一次,那么肯定只是声明),如果在所有的编译单元中都没有使用过,那么就是没有使用过的。

但是不能查处多次声明而不使用的情况,比如extern a; extern a; extern a; 连着声明3次,但最终不用,这种就查不出来。
yutaooo 2009-03-06
  • 打赏
  • 举报
回复

对每个 .o 文件,使用命令 readelf -s XXXX.o 产生符号表。

把所有符号表集中成一个。

再根据表项处理。应该可以做到的吧。

指针可能是个潜在的威胁。这个怎么处理。貌似很困难。

下面是用 readelf 产生的一个符号表:

$ readelf -s e2.o

Symbol table '.symtab' contains 16 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS e2.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 0 SECTION LOCAL DEFAULT 5
6: 00000000 0 SECTION LOCAL DEFAULT 6
7: 00000000 0 SECTION LOCAL DEFAULT 8
8: 00000000 0 SECTION LOCAL DEFAULT 10
9: 00000000 0 SECTION LOCAL DEFAULT 12
10: 00000000 0 SECTION LOCAL DEFAULT 13
11: 00000000 0 SECTION LOCAL DEFAULT 15
12: 00000000 0 SECTION LOCAL DEFAULT 18
13: 00000000 0 SECTION LOCAL DEFAULT 17
14: 00000000 80 FUNC GLOBAL DEFAULT 1 main
15: 00000000 0 NOTYPE GLOBAL DEFAULT UND malloc


注意最后行,第15行,malloc 是一个对外部的引用。

总的来说,我觉得能处理的。
yutaooo 2009-03-06
  • 打赏
  • 举报
回复

基本上就是要在 readelf, nm, strip 上下功夫。要么再讨论讨论?
bfhtian 2009-03-06
  • 打赏
  • 举报
回复
up
ckc 2009-03-06
  • 打赏
  • 举报
回复
唉,这么多年了,为什么我问的问题基本上都没有满意的回答呢
下周一结贴了,有新思路的速度指教下啊
xcopy 2009-03-06
  • 打赏
  • 举报
回复
编译器会警告的,看看你编译时的output就知道了。
xiaopoy 2009-03-06
  • 打赏
  • 举报
回复
连接器优化选项里面该有。
删除未使用的符号。
xtting_8984313 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]
这个没使用过链接器一般都会优化掉的
[/Quote]

强烈支持!
  • 打赏
  • 举报
回复
这个没使用过链接器一般都会优化掉的
Wolf0403 2009-03-04
  • 打赏
  • 举报
回复
如果你说子程序是说函数调用的话,gprof 可以在执行过程中计数每个函数被执行的次数等信息。
Wolf0403 2009-03-04
  • 打赏
  • 举报
回复
gcc 的 -Wall 可以警告没有使用的局部变量。。全局不清楚。
lin_style 2009-03-04
  • 打赏
  • 举报
回复
开-O3级别看看
xtting_8984313 2009-03-04
  • 打赏
  • 举报
回复
对于局部变量,vc警告就可以。

全局的和函数的话,我觉得编译工具应该不能胜任,他只负责函数变量导出了,不管你是否用了。或许某些建模软件可以。
lz自己perl写一个吧,应该也不难。
diannaomingong 2009-03-04
  • 打赏
  • 举报
回复
linux下不知道
用wxdevcpp的时候会警告没使用的变量
没使用的子程序不管
  • 打赏
  • 举报
回复
你有没有源码先?你有源码,但是要机器找出来哪里用了全局变量?
cnp11 2009-03-04
  • 打赏
  • 举报
回复
哈哈 在每个 函数里面加计数器把 运行一定时间后 打logo

不建议采用第三方软件
meteormeng 2009-03-04
  • 打赏
  • 举报
回复
ding....
ckc 2009-03-04
  • 打赏
  • 举报
回复
我有源代码。
不想在子程序中加计数器统计输出结果,这个方法不是很可靠,而且要运行了程序才有结果,有时候程序是不可以随便运行的。
同理,gprof这个当然也不可靠不好用。


链接器会优化掉
这个不知道有什么根据啊
我测试了一下,搞了一个没人调用的子程序
void nouse(void)
{
.....
}
编译后查看文件大小,当然是strip过了的
然后修改这个子程序,加了点东西进去
重新编译后查看文件大小,发现目标程序大了一点
所以我估计链接器没有优化掉。
再考虑这样的全局变量定义:
int a,b,c;
假设a和c我在后面用到了,但是b没有用
链接器可以正确优化掉b吗?
所以这个说法还有待证实。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧