免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mingjwan
打印 上一主题 下一主题

程序中有这样的隐患,怎么查出来。 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2006-09-21 15:08 |只看该作者
原帖由 mingjwan 于 2006-9-19 20:09 发表
#include<stdio.h>
int main()
{
    unsigned char a;
    unsigned short b=500;
    for(a=0;a<b;a++)
        printf("hello\n");
}
显然这是一个死循环的编码,怎么让编译器或者 ...


设想一下编译器查出这样的问题要花多少代价?
即使有这样的编译器,其效率可想而知

论坛徽章:
0
42 [报告]
发表于 2006-09-21 16:48 |只看该作者
路过UP

论坛徽章:
0
43 [报告]
发表于 2006-09-21 18:08 |只看该作者
代码如下:
#include<stdio.h>
int main()
{
    unsigned char a;
    unsigned short b=500;
    for(a=0;a<b;a++)
        printf("%d hello\n",a);
}

部分结果如下:
253 hello
254 hello
255 hello
0 hello
1 hello
2 hello

论坛徽章:
0
44 [报告]
发表于 2006-09-21 18:43 |只看该作者
原帖由 sniper 于 2006-9-21 18:08 发表
代码如下:
#include<stdio.h>
int main()
{
    unsigned char a;
    unsigned short b=500;
    for(a=0;a<b;a++)
        printf("%d hello\n",a);
}

部分结果如下:
253 hello
254 hello
255 hello
0 hello
1 hello
2 hello


“部分结果”截取得妙。

论坛徽章:
0
45 [报告]
发表于 2006-09-21 18:56 |只看该作者

回复 43楼 sniper 的帖子

很明确的指出了问题。我也经常会犯这样的毛病。要是能有什么工具就好了

论坛徽章:
0
46 [报告]
发表于 2006-09-21 20:20 |只看该作者
编译器是不能发现逻辑错误的,只能靠编程的人的经验来发现。

论坛徽章:
0
47 [报告]
发表于 2006-09-21 21:12 |只看该作者
原帖由 xieShell 于 2006-9-21 20:20 发表
编译器是不能发现逻辑错误的,只能靠编程的人的经验来发现。


有时候编程经验也无能为力啊。
比如说一个系统中原来就有这样的代码,但是原来b的取值可能只有254或者更小,系统安全运行1,2年,但是由于需求增大,需要将某个配置的值放大,直接导致了程序中的b变大。请问,你该如何找出所有这样的代码。

论坛徽章:
0
48 [报告]
发表于 2006-09-21 22:36 |只看该作者
用gcc4编译会有警告!
除了瞪大眼睛找之外没有通用的方法。

论坛徽章:
0
49 [报告]
发表于 2006-09-21 22:57 |只看该作者
对,用PC-Lint之类的工具能检查很多潜在的隐患!我已受益良好!:)

论坛徽章:
0
50 [报告]
发表于 2006-09-21 23:41 |只看该作者

建议解决办法

新写代码时:  循环变量不要使用uc。 建议使用us或ul

老的代码:将编译器的告警开关调到最高,认真对待每一个告警。
这样存在的问题是:老的代码如果之前没有规范的做的话,可能存在成千上万的告警。

另外一个办法:将该问题作为项目的CheckList,3个到4个经验丰富的工程师对代码进行检视,可能能发现这类问题。

说句实在话,要求严格一点的软件公司都会使用一些工具,如:C/C++ 的PCLINT工具。
一般都是要求编译器最高级别告警0告警,PCLINT 0告警

大型软件,没有一些基本要求是不行的。

程序员的大脑不仅仅是用来关注这些基本语句的,应该是考虑程序结构的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP