关于类型严格匹配的问题

guyigong 2006-08-25 11:48:23
请问有没有能够检查代码中类型匹配问题的工具?

例:
void func1(long *l);
....
func2()
{
int i;
func2((long *)&i);
}

我想找一个工具,能够搜索到代码中有类型不匹配的地方,尤其是函数传参时有指针类型时更要严格匹配。我的硬件目标平台是arm, arm c编译器在为变量分配内存时并不是按照4byte对齐的,比如long型分配的是4byte,而int分配的是2byte不会占用4byte的空间,在上例中int型指针被强制转为long型指针后,该指针就会指向一个4byte的空间,这样就可能会造成内存覆盖,引起程序崩溃。而上述用法在以4byte对齐分配内存的系统上是可以的,即虽然你声明的是一个char型,但仍然要占用4byte空间。

其实这个问题改起来很简单,但查找很累人,代码量较大(大概10万行吧),所以我想找个工具,不知有没有,请大家帮助,谢谢!
...全文
240 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyigong 2006-08-27
感谢jet8和saoyu,我用pc-lint在家已测试成功,星期一准备到单位试一下
测试用例:
#include "stdafx.h"

void func(long *x);
void func1(int *x);

int main()
{
int y = 0;
char c = 0;

func((long *)&y); //line14

func((long *)&c); //line16

func1((int *)&c); //line 18

return 0;
}

void func(long *x)
{
*x = 1;
}

void func1(int *x)
{
*x = 1;
}

pc-lint给出的信息:
--- Module: .\test.cpp
{ // base class for generic allocators for const _Ty
D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xmemory(73): error 36: (Error -- redefining the storage class of symbol 'std::_Allocator_base<const <1>>' (class template vs. type), conflicts with location unknown)
func((long *)&y);
.\test.cpp(14): error 826: (Info -- Suspicious pointer-to-pointer conversion (area too small))
func((long *)&c);
.\test.cpp(16): error 826: (Info -- Suspicious pointer-to-pointer conversion (area too small))
func1((int *)&c);
.\test.cpp(18): error 826: (Info -- Suspicious pointer-to-pointer conversion (area too small))
}

.\test.cpp(31): error 783: (Info -- Line does not end with new-line)

--- Global Wrap-up

error 900: (Note -- Successful completion, 5 messages produced)


另外代码也不是我写的,干这行大家都知道给别人擦屁股是最痛苦的。

使用compiler出警告恐怕不行,哪位用上面的例子成功了,希望能pm我,多谢!
回复
jixingzhong 2006-08-27
习惯 ......

良好的编程习惯可以减少你犯这样的错误
回复
xaodoudou 2006-08-27
saoyu说的方法就很好, 但是如果在代码里写明强制转换的话, 就不能产生告警了,而我的工具是可以全部检查出来,一个也不漏
回复
xaodoudou 2006-08-27
回头我给你发个试用版 :)
回复
xaodoudou 2006-08-27
没有用过吧, 以后就可以让你们尝试一下 :)
见我发的帖子
http://community.csdn.net/Expert/topic/4945/4945741.xml?temp=.534939

你在什么公司? 请联系我 icehong at msn.com
回复
tailzhou 2006-08-26
lz用的强制转换,不会出来warning的哟.

用一个能用正则表达式查找的编辑器就可以了吧?

回复
du51 2006-08-26
saoyu说的方法就很好.
回复
Dong 2006-08-26
很多啊VC就是这样的一个工具啊,其他编译器都可以算是的。
回复
bohlee 2006-08-26
MARK
回复
大耳 2006-08-26
还没有用过不检查中类型匹配问题的编译器:)
回复
jet8 2006-08-26
试一试pc-lint:

http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=program&Number=464439&page=8&view=expanded&sb=6&o=all

http://www.yuanma.org/data/2006/0529/article_512.htm
回复
saoyu 2006-08-25
两种方法,第一种,把你compiler对应的warning打开。第二种,找个静态分析工具
回复
发动态
发帖子
C语言
创建于2007-09-28

6.2w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告