码迷,mamicode.com
首页 > 编程语言 > 详细

编程精粹--编写高质量C语言代码(6):对程序进行逐条跟踪

时间:2014-08-29 21:25:44      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:c   编程风格   bug-free   

发现程序错误最好的方法就是执行程序。在程序执行过程中,我们利用我们的眼睛,或者通过我们编写的断言和子系统一致性检查等自动测试的工具来发现错误。虽然断言和子系统检查都很有用,但是如果程序员事先没有想到应该对某些问题进行检查,那么也就无法保证程序没有问题。

程序员可以在代码中设置断点,一步步跟踪代码的运行,观察输入变为输出的过程。程序员测试其程序最好的方法就是对程序进行逐条跟踪,对中间的结果进行认真的查看。对代码进行逐条跟踪是需要时间的,但它同编码比,只是一小部分。一旦逐条地跟踪代码成为习惯后,我们就会不加思索地设置断点并对整个过程进行跟踪。

          不要等到出了错误再对程序进行逐条的跟踪。

<<编程精粹--编写高质量C语言代码(4):为系统设防(一)>>中的结尾讲过:错误处理程序往往容易出错,正是因为它们很少被执行到。所以我们在对代码进行逐条跟踪时,可以对错误情况进行模拟,然后就可以观察错误处理代码的运行。除了对错误处理代码进行逐条跟踪,对程序中每条可能的路径都要进行逐条跟踪。例如有if和switch语句,有的则不是十分明显,例如:&&,||和?:运算符。

          对每一条代码路径进行逐条的跟踪。

对代码进行逐条跟踪的真正作用是它可以使我们观察到数据在函数中的流动。如果在代码进行逐条跟踪时密切地注视数据流,就会发现以下常见错误:上溢和下溢错误,数据转换错误,差一错误,NULL指针错误,使用垃圾信息填充内存单元错误,用=代替==的赋值错误等等。

          对代码进行逐条跟踪时,要密切注视数据流。

源级调试程序的一个问题是一个单步就越过了&&,||和?:的两条路径,这会带来一些问题。考虑以下情况:

if(psym!=NULL & psym->name!=NULL)
{
FreeMemory(psym->name);
psym->name=NULL;

应该看出,程序源代码的本意应该是使用逻辑与,而不是按位与操作符,所以即使表达式左边是FALSE的情况下,右边仍会运行(现在对NULL指针进行访问同样会出现错误提示的,但是作者书中讲当时的台式机系统不会出现错误)。对于这种问题有两种解决方法:第一种是当我们对程序进行逐条跟踪时,只要步进至&&和||等符合运算符时,使用调试程序命令显示条件中每个比较的结果。第二种方法是在汇编语言级步至复合条件语句和?:运算符内部。

          源级调试程序可能会隐瞒执行的细节,对关键部分代码要进行汇编指令级的逐条跟踪。


总结:

1,如果你想发现代码中的错误,没有哪个方法比在对代码进行编译时对其进行逐条跟踪更好。

2,一定要对每一条代码路径进行逐条跟踪。

3,在某些情况下也许需要在汇编语言级代码进行逐条的跟踪。

最后,用作者在本章中的一句话总结这篇文章:

          代码不会自己生出错误来,错误是程序员编写新代码或者修改现有代码的产物。



编程精粹--编写高质量C语言代码(6):对程序进行逐条跟踪

标签:c   编程风格   bug-free   

原文地址:http://blog.csdn.net/fuchencong/article/details/38930267

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!