zoukankan      html  css  js  c++  java
  • 一次手误引出的bug

      在工作中写了这样一段代码:

     1 struct xx_param {
     2        int index1;
     3        int index2;
     4 };
     5 
     6 //func1, func2, func3为三个函数指针
     7 
     8 int init(a_func_t *func1, b_func_t *func2, c_func_t *func3, void *param)
     9 {
    10        struct xx_param *p = (struct xx_param *)param;
    11         func1(p->index1, p->index2);
    12 }
    13 
    14 int prepare_init(int xx_index_1, int xx_index_2)
    15 {
    16         int err;
    17         struct xx_param        xx;
    18         
    19        ......
    20 
    21         xx.index1 = xx_index1;
    22         xx.index2 = xx_index2;
    23 
    24         if(init(func1, func2, func3, &xx_index1))
    25                err = -xxx;
    26 20        ......
    27 
    28         return err;
    29 }

      很明显这个错误很普通,就是第24行应该为&xx,但是我手误错写成了&xx_index1。但是编译器不会报警,下面来说一下这个错误的神奇之处,在Debug下永远是正确的,但是Release下永远跑飞。下面来分析一下为什么:

      在Debug模式下参数是由栈来传递的,那么参数xx_index_1, xx_index_2在栈中的布局 与 xx结构体变量在栈中的布局完全一样,因此虽然我取错了地址,但是根据&xx_index_1处得到的地址来获到xx_index1, xx_index_2,其实相当于将结构体变量xx赋值然后从&xx地址处取xx.index1,xx.index2变量(貌似还少了几次内存拷贝,虽然他是一个bug, ^_&),因此在Debug模式下这断代码永远是正确的。

      但是在Release下却不正确,因为在VS下,O2的优化级别下xx_index_1, xx_index_2是由寄存器ecx, edx来传递的,xx_index_1, xx_index_2两个变量的值不会全部在栈中分配(由于对xx_index1进行取地址,因此会导致编译器为xx_index1分配内存,但是xx_index_2确不会分配内存),这样从&xx地址去取数据时xx.index2变量取到的数据总是垃圾数据,因此软件在Release下总是挂掉,但如果将优化关掉却又能良好运行。

      这个Bug很简单,但是现象却很诡异,因此感觉值得一记。

      

  • 相关阅读:
    如何复制图文消息封面图片?正文没显示
    微信企业号已开通账号超过10万 日均消息量超过100万条
    微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
    张小龙在微信公开课上的演讲
    做微信营销你知道男女用微信的习惯吗?
    微信时代,"邮"你选择 腾讯企业邮箱推新玩法
    亲身体验,不要再拖! 拖! 拖!
    The Promise of Deep Learning
    判断两个数组是否相等
    matlab学习笔记(一)单元数组
  • 原文地址:https://www.cnblogs.com/findstr/p/3606316.html
Copyright © 2011-2022 走看看