程序里最阴湿肮脏的犄角旮旯

来源:互联网 发布:淘宝中老年休闲装 编辑:程序博客网 时间:2024/04/29 22:12

书接上回”短小精悍的bug可以撼程序强盛“。

人类居住的房间,有阳光明媚的厅堂,也有阴暗潮湿的犄角旮旯,而往往就是在那些阴暗潮湿的角落里,滋生了无数的灰尘、细菌以及随之而来的各种小虫虫,引起了各种各样莫名其妙的问题。从某种角度看,程序就像是一个房间,也有阴湿肮脏的角落,滋生和藏匿了无数大大小小的bug。

程序里的这些角落在哪里呢?多数都在那些常年见不到测试和review之光的代码片段里,姑且称之为边缘代码。数组的第一个元素和最后一个元素,字符串的最后一个字符,循环控制的第一次和最后一次,有效值域的最小值和最大值,凡此等等。总之,无论是时间层面还是空间层面,那些徘徊在代码边缘和程序员视野边缘的数据和控制逻辑,开发者在其上所倾注的精力和时间往往不足20%,但是他们滋生和养活了80%以上的bug们。

在上一篇博文中记载的双向循环链逐个节点删除的例子中,那段操作逻辑在链表的最后一个节点之前,一直可以很cool的work。但是,等到链表删除得就剩下最后一个元素时(链表初始长度>1),bug爆发了:为了释放链表的尾节点,代码居然引用了已经被free()函数释放了的链表首节点(变量node指向了已经被释放的head)。已经被释放了的内存数据是什么是未可知的,根据那里边的next指针一路走下去,可能循环就不会结束了,甚至有可能把别人的内存给偷偷释放掉了…。最可怕的是,这种bug爆发的时候可能一切都静悄悄的,程序员的眼睛根本什么都看不到,因为那是在内存里偷偷发生的。

在这个例子中,链表的最后一个节点就是空间上的边缘,最后一轮循环就是时间上的边缘。时空的边缘,就是代码虫虫的乐园!

醒醒吧,该起来打扫卫生了,不要让房间里的某些角落永远见不到阳光、永远阴湿肮脏。不要吝啬自己的时间,要付出足够的精力和行动去关注和处理阳光照不到的地方,动手把它清扫干净,这样一劳永逸。这些付出比以后生病了吃药打针要简单得多,轻松得多。