免费注册 查看新帖 |

Chinaunix

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

我是这样保证代码质量的,欢迎大家交流一下经验 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-22 23:07 |只看该作者 |倒序浏览
C语言编程需要注意很多问题,内存泄露和文件描述字泄露等就是很多人头痛的问题;
今天说说一些自己在代码质量上的经验,希望对后来着有所帮助

1.对参数进行诊断

assert函数与其说是诊断函数不如说是诊断工具;
使用assert对参数进行诊断能让你发现一些很明显而被忽视的问题。
例如下面的字符串拷贝函数

int my_strcpy( char *dest, char *src )
{
   assert( dest != NULL && src != NULL );

   return strcpy(dest,src);
}
这个函数在使用的时候如果你不小心传入空指针,那么很快就会被自动发现

2.编译的时候显示所有的警告并消除所有警告

在GCC中是 -Wall -W选项打开所有的警告

3.使用gdb或者dbx来经常跟踪你的程序

“单元测试最好的办法就是逐行跟踪你的代码”
如果程序执行得和你想的不一样或者程序CORE出来了,那么快用GDB跟踪一下吧

我现在也养成了用GDB逐步跟踪代码的习惯,用这个方法作为单元测试方法,把
每个分支都走一遍。

3.使用purify检测内存泄露和文件描述字泄露

有些人可能认为purify不能检查到所有的泄露,因为如果有些代码没有执行到的话,那么
这个泄露可能就发现不了,例如
ret = 0;
if(ret)
malloc(20);
程序执行不到malloc所以可能发现不了。对于这个情况的好办法就是

gdb+purify

使用gdb把每个分支都走一遍,purify会自动把结果显示出来

4.使用check写测试案例。

5.代码写短一点,一般控制在一个屏幕之内

6.其他,需要大家补充

希望对新手有些帮助

论坛徽章:
0
2 [报告]
发表于 2006-07-22 23:21 |只看该作者
<<程序设计实践>>和K&R的圣经是这方面的经典~~

论坛徽章:
0
3 [报告]
发表于 2006-07-22 23:28 |只看该作者
我觉得这个跟计算机遍历一样, 太费时了, 不太可行.
像内存泄露和文件描述字泄露之类的, 如果写代码的人有个好习惯, 这种错误是不会出现的.
只是为了检查的话, 直接搜索所有的new 和malloc之类的, 然后一个个确定它是否有会被释放. 这样应该来得快一些.


我觉得高质量的代码最关键的应该是清晰的接口设计,这样就算有错误也容易查.

论坛徽章:
0
4 [报告]
发表于 2006-07-22 23:32 |只看该作者
谢谢啊 大家多多交流心得
另,我推荐大家把代码
if(aa()<0)
  do1();
else
  do2();
改成
ret = aa();
if( ret < 0 )
do1();
else
do2();
因为这样使用gdb调试的时候可以改变ret的值来控制程序走哪条分支

论坛徽章:
0
5 [报告]
发表于 2006-07-22 23:35 |只看该作者
原帖由 galaxywar 于 2006-7-22 23:28 发表
我觉得这个跟计算机遍历一样, 太费时了, 不太可行.
像内存泄露和文件描述字泄露之类的, 如果写代码的人有个好习惯, 这种错误是不会出现的.
只是为了检查的话, 直接搜索所有的new 和malloc之类的, 然后一个个确 ...


费时?其实还好拉
使用gdb执行下条语句只要执行next,以后只要按回车就好了
只要是每个分支都要走一遍

论坛徽章:
0
6 [报告]
发表于 2006-07-22 23:39 |只看该作者
原帖由 converse 于 2006-7-22 23:21 发表
<<程序设计实践>>和K&R的圣经是这方面的经典~~


k&r里面的太细节了,大侠讲讲你如何做的?
借鉴一下

论坛徽章:
0
7 [报告]
发表于 2006-07-22 23:50 |只看该作者
原帖由 ping17909 于 2006-7-22 23:35 发表


费时?其实还好拉
使用gdb执行下条语句只要执行next,以后只要按回车就好了
只要是每个分支都要走一遍

一步一步的执行还不费时? 还不如写好完备的case, 一个个跑, 最后再来个压力测试.

论坛徽章:
0
8 [报告]
发表于 2006-07-22 23:55 |只看该作者
什么公司,还有压力测试?
我公司,一人一个模块,也不用什么测试

论坛徽章:
0
9 [报告]
发表于 2006-07-22 23:56 |只看该作者
原帖由 galaxywar 于 2006-7-22 23:50 发表

一步一步的执行还不费时? 还不如写好完备的case, 一个个跑, 最后再来个压力测试.


你说的这种方法适合黑盒测试,
那白盒测试怎么做的呢?

写case的话一般是执行你的测试函数,而里面如果有很多分支的话
还要想把每个分支都走一遍,而有的时候某些分支是不容易执行到的

我测试的时候也用check写测试包,但是用来黑盒测试的

论坛徽章:
0
10 [报告]
发表于 2006-07-22 23:57 |只看该作者

回复 6楼 ping17909 的帖子

把那本书的问题和相应的代码都看看,我觉得写的很好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP