本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
前两天修改了一个Bug,当时觉得那个问题很简单,直接从别处复制了代码就可以解决问题——好久没这么干了。结果引发了一个特别弱智的bug——这种bug也好久没犯了。所以,再简单的修改,如果不认真,还是会引出bug。当时修改完后,直接运行测试,也没有问题,就大意的认为解决了问题。其实按照我以往的习惯,我一般都是进行调试测试,保证覆盖所有代码以及检查中间变量。这次的问题由于太简单了,所以没有遵守以前的习惯。
下面简化的说一下问题吧。
- char *ptr;
-
-
/*
-
这部分对ptr进行了处理,让ptr指向了输入量中的某一内存地址
-
*/
-
if (condition1) {
-
if (condition2) {
-
do_something();
-
}
-
return;
-
}
-
-
......
/*
一段对下面代码的注释。
*/
-
if (condition2 && 0 == memcmp(ptr, str, size)) {
-
do_something();
-
}
-
-
.......
这基本是老的代码。老的代码中,在判断condition2时,没有用ptr与str进行比较。这些老的代码不是我写的,按照我的风格对于重复的代码肯定会使用一个函数来代替。修改这个bug时,因为临近release,所以我没有整理这些重复代码,去新加一个函数,还是选择直接添加一个新的memcmp的代码。
当时看到ptr的比较,因为前面已经对ptr进行了处理,且后面的if (condition2 && 0 == memcmp(ptr, str, size))是一个独立段落,在这条语句和注释之间没有任何代码,所以就直接复制了memcmp的代码。
结果没成想,就这简单的复制拷贝就引发了bug。原来
- if (condition1) {
-
if (condition2 && 0 == memcmp(ptr, str, size) {
-
do_something();
-
}
-
}
-
-
...... ......
- //这里对ptr进行了重用,且这个ptr只会被后面的判断用到
-
ptr = msg_data();
-
-
-
/*
-
一段对下面代码的注释
-
*/
-
if (condition2 && 0 == memcmp(ptr, str, size)) {
-
do_something();
-
}
注意红色的语句,在条件判读那个段落前面,老代码对变量ptr进行了重用,且这个语句与后面的判断直接,有几个空行。结果我当时没有注意到。导致新加的memcmp的判断有问题。
总结一下引发这个bug的原因:
1. 首先肯定是自己的问题,对于简单问题,一定不能掉以轻心。
2. 当复制拷贝自己不熟悉的代码时,一定要检查拷贝的代码之前的代码是否有影响;
3. 测试的时候,不能光看功能是否正常,还是要坚持调试测试;
这个bug归根到底是我引发的。但是我觉得以前的代码还是有问题的。
1. 重复代码使用函数代替;
2. 变量不要重用;这样容易导致变量的意义不明确;
3. 上面的代码风格明显有问题。
当重用ptr = msg_data()时,既然这个ptr只会被后面的条件判断用到。那么就不要把这个重用的代码与后面的判断段落分开。
阅读(3971) | 评论(2) | 转发(1) |