新闻中心

EEPW首页>牛人业话> 数组越界真可怕,莫名就闯到了别人家

数组越界真可怕,莫名就闯到了别人家

作者:天雷君 时间:2018-11-30 来源:电子产品世界 收藏

  第一步,打开冰箱,即计算出该数据位的字节位置和位位置,如前所述,第n+1个数据位的字节位置为(n>>3),位位置为(n & 0x07),这是通过下面这个函数实现的,

本文引用地址://m.amcfsurvey.com/article/201811/395096.htm

  void SetByteBitIdx(void)

  {

  uint16_t idx;

  idx = Rf_bit_count;

  Rf_rawbyte_idx = idx >> 3;

  Rf_rawbit_idx = idx & 0x07;

  Rf_bit_count++;

  }

  第二步,把数据位0或1这个‘大象’放到前面打开的‘冰箱’里,这是通过下面这个函数实现的。

  void StoreRfBit (bool data)

  {

  SetByteBitIdx();

  if(1 == data){

  Rx_rawbit[Rf_rawbyte_idx] |= 1 << Rf_rawbit_idx;

  }else{

  Rx_rawbit[Rf_rawbyte_idx] &= ~(1 << Rf_rawbit_idx);

  }

  }

  乍看下来,设计方案构思缜密,程序代码实现巧妙,设计和实现都堪称天衣无缝。按下遥控器,射频信号在空间汩汩流动,遥控接收板有序地把数据整齐码好,踏着相同的节拍,大家一起嗨起来。

  3

  但是,理想是美好的,现实永远是骨感的。

1543555728229384.jpg

  小心翼翼地把代码写好,反复检查了几遍,水平有限,着实检查不出来任何毛病,那就是骡子是马,拉出来溜溜吧。结果,一通测试下来,兴奋劲还没过去,一头冷水便照头泼了下来。按了遥控键,十次中倒有个两三次不好使,“永不消逝的电波”就好像泥牛入海,转眼间便走散了消息,不见了踪迹。

  被风撕碎的一片片白云在辽阔高远的天空中肆意飘荡着,火红的太阳炙烤着滚烫的大地。洒家背靠窗台,一面感受着顽强得透过隔温玻璃的阳光洒在脊背上的暖意,一边在空调房中体味着心中的阵阵寒意。电波到底去哪儿了?

  洒家搜索的目光在电脑屏幕上不断游离,心中条分缕析,早把各行代码都当成了嫌疑,最后,目光定格在判断接收到一帧完整的报文的语句那里:

  if(Rf_bit_count >= RF_RAWBIT_LEN){

  SetRfFrameComplete();

  }

  基本上,钥匙每短按一次,就会发送三帧报文,既然遥控不好使,大抵可以确认中间存在漏报文的情形,为了验证这种猜测,洒家加了一条测试语句:

  if(Rf_bit_count >= RF_RAWBIT_LEN){

  Rf_frame_times++;

  SetRfFrameComplete();

  }

  显然,短按一次,Rf_frame_times应该为3,短按n次,Rf_frame_times应该为(n*3)。

  马不停蹄地测试下来,果不其然,短按过十次后,Rf_frame_times的值不到30。难道是报文解析程序出了问题?




关键词:数组

评论


技术专区

关闭