Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685925
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: C/C++

2014-05-17 22:50:36

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
 


前两天修改了一个Bug,当时觉得那个问题很简单,直接从别处复制了代码就可以解决问题——好久没这么干了。结果引发了一个特别弱智的bug——这种bug也好久没犯了。所以,再简单的修改,如果不认真,还是会引出bug。当时修改完后,直接运行测试,也没有问题,就大意的认为解决了问题。其实按照我以往的习惯,我一般都是进行调试测试,保证覆盖所有代码以及检查中间变量。这次的问题由于太简单了,所以没有遵守以前的习惯。


下面简化的说一下问题吧。
  1. char *ptr;

  2. /*
  3. 这部分对ptr进行了处理,让ptr指向了输入量中的某一内存地址
  4. */
  5. if (condition1) {
  6.     if (condition2) {
  7.        do_something();
  8.     }
  9.     return;
  10. }

  11. ......
  
 /*
 一段对下面代码的注释。 
 */
  1. if (condition2 && 0 == memcmp(ptr, str, size)) {
  2.     do_something();
  3. }

  4. .......
这基本是老的代码。老的代码中,在判断condition2时,没有用ptr与str进行比较。这些老的代码不是我写的,按照我的风格对于重复的代码肯定会使用一个函数来代替。修改这个bug时,因为临近release,所以我没有整理这些重复代码,去新加一个函数,还是选择直接添加一个新的memcmp的代码。

当时看到ptr的比较,因为前面已经对ptr进行了处理,且后面的if (condition2 && 0 == memcmp(ptr, str, size))是一个独立段落,在这条语句和注释之间没有任何代码,所以就直接复制了memcmp的代码。

结果没成想,就这简单的复制拷贝就引发了bug。原来
  1. if (condition1) {
  2.    if (condition2 && 0 == memcmp(ptr, str, size) {
  3.       do_something();
  4.    }
  5. }

  6. ...... ......
  7. //这里对ptr进行了重用,且这个ptr只会被后面的判断用到
  8. ptr = msg_data();


  9. /*
  10. 一段对下面代码的注释
  11. */
  12. if (condition2 && 0 == memcmp(ptr, str, size)) {
  13.    do_something();
  14. }
注意红色的语句,在条件判读那个段落前面,老代码对变量ptr进行了重用,且这个语句与后面的判断直接,有几个空行。结果我当时没有注意到。导致新加的memcmp的判断有问题。


总结一下引发这个bug的原因:
1. 首先肯定是自己的问题,对于简单问题,一定不能掉以轻心。
2. 当复制拷贝自己不熟悉的代码时,一定要检查拷贝的代码之前的代码是否有影响;
3. 测试的时候,不能光看功能是否正常,还是要坚持调试测试;


这个bug归根到底是我引发的。但是我觉得以前的代码还是有问题的。
1. 重复代码使用函数代替;
2. 变量不要重用;这样容易导致变量的意义不明确;
3. 上面的代码风格明显有问题。
    当重用ptr = msg_data()时,既然这个ptr只会被后面的条件判断用到。那么就不要把这个重用的代码与后面的判断段落分开。

阅读(546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~