注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我心飞翔

我有一个梦想,……

 
 
 

日志

 
 
 
 

C编程不易发现的严重问题  

2009-09-08 10:55:01|  分类: 软件编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C语言很灵活,但也容易出现问题,尤其是多任务大型软件工程,有些问题很难跟踪定位分析。近期工作中发现了几个不易察觉的问题,记录如下:

1、函数内声明缓冲区,通过函数sprintf对缓冲区进行格式化,其中一个参数为输入参数, 若输入参数超长,就会造成缓冲区溢出破坏其他数据进而造成系统运行异常。

       子函数甲( int  输入参数1 ,char 输入参数2 )

{

char  buf[40];

.....

sprintf( buf, "输入=%d,%s", 输入参数1, 输入参数2 );

.....

}

上述示例代码中,若输入参数2比较短时,程序运行正常, 若比较长, 则buf溢出, 系统会出现异常。

2、程序中直接用结构变量来作为缓冲区,传递给函数中进行赋值, 函数中对输入参数长度有字节对齐要求,若做字节对齐处理后,再填充内容,可能造成内存破坏进而系统后期运行崩溃。

结构类型  aa

{

....

}  bb;

 填充函数( char * buf, int len )

{

  // 调用子函数ff需要字节对齐, 这里先进行字节对齐处理

   len = (len+7)&(~7);     // 这是错误的用法 , 会增长输入缓冲区。

    ff ( buf, len );

}

调用: 填充函数( bb, sizeof( bb ) );

3, 复杂协议的直接解析中,步进解析时,若一步步进计算错误,就会造成程序运行异常,代码量大时还不容易察觉。 解决办法是:最好将复杂协议分层分级简化,通过一个个子函数实现解析和验证。并利用数据结构,将协议转化为数据结构成员。

 4,结构来做缓冲区,调用函数来填充缓冲区,若缓冲区长度写为常量,则很容易出错。

    tSETUP_CFG                          DataRead;
    error = E2P_read( kE2P_UASER_DATA_BASE, DATALENTH, (unsigned char *) DataRead );
如上面的写法里存在很大隐患,若DATALENTH 大于 DataRead 结构的长度, 则会因为填充越界而崩溃。如果,小于会由于数据结构后面的成员变量没有赋值而处理不正确。

     最好的方法是, 用结构变量的长度去读取。

 

  评论这张
 
阅读(154)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017