短小精悍的Bug可以撼程序强盛

编码有点疲惫,暂时休息一下大脑,写个bug report。

话说,那些短小精悍的bug,都是极其精巧别致的,是可遇而不可求的。它们往往用不了几行代码,却可以轻轻松松地穿过编译器、连接器、debugger的层层围捕,甚至是经验老到的程序员的第一遍review,最终撼动程序的质量。

从前,有一个双向(相邻节点互相指向)循环(首尾节点互相指向)链表(只有一个节点时前后指针都指向自己)。一位程序员同学要写一段逐个删除链表节点并释放节点内存的函数。这其实一点都不新鲜,江湖上最流行的套路就是整两个指针,一个指向当前节点,另一个指向下一个节点,一前一后从链表头开始依次向后移动。本来这位同学也想这么写,但是今天心情特别好,该同学想挑战一下:别人用两个指针才能玩转,我试试只用一个如何?于是,刷刷刷几笔写下了下面的代码(C语言):

T_LIST_NODE *node = head;

if (head != NULL)

{

do

{

node = node->next;

free(node->prev);

} while(node != head);

}

这代码非常简洁,算法也很精巧,先跳到下一个节点上,然后删除前一个,即使链表最初只有一个节点也能够work!很酷啊!编译、链接、运行,似乎一切正常。带着挑战成功的喜悦,该同学美滋滋地继续写其他程序去了。大约10分钟后,该同学突然灵光一闪,意识到这段代码似乎潜藏了威力巨大的bug,而且是一个潜藏极深的bug。

那些最笨的bug,是每次都必定重现的,而最聪明的bug总是时隐时现,隐时风平浪静,现时却翻江倒海,足让自以为是的程序员老鸟们也不得不挑灯夜战甚至折戟沉沙。上边这段代码就是非常聪明且狠毒的bug。它发作起来,这循环可能就永远出不来了,也可能不该释放的内存被释放了,重要的数据被破坏了…都不敢往下想了。最狠毒的bug,其破坏的方式每次都可以不同,没有固定的规律可循。

有没有其他同学可以帮助这位程序员哥哥分析一下这个bug?

哥写的不是代码,而是killer bug…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值