c语言非线程安全函数引发的BUG一列

  公司的机器最近遇到一个bug(其实这个bug一年前就出现过,只是未引起重视),现象是这样的:在生产环境中,用户连续打印票的时候,中间某张票的一个时间可能会出问题,该时间本来是一个未来的时间,却被打印成了系统当前的时间.其他同事认为是传入的参数出错了,加了大量的调试信息和日志进去,结果去令人掉眼镜,传入的参数是完全正确的,但是结果去不是预期的.

  最终排查BUG的任务转到了我手里,我简单分析了下上层流程,并无问题,于是把问题定位在底层库的FormatTime函数上,于是要了份FormatTime的代码查看(吐槽下,封闭的代码库往往造就一些隐蔽的问题),FormatTime的实现很简单,调用localtime函数,然后格式化输出,查看localtime函数的原型,如下

 struct tm *localtime(const time_t *timep);

  问题就出在localtime这个函数上,从函数原型来看,这个函数返回了一个struct tm的指针,但是传入参数并未有传入tm参数,那么就有3种情况

1,tm是内部malloc出来的

2,tm是一个全局变量

3,tm是一个局部static

  第一种情可以首先排除,因为调用完localtime后没要求free tm,或者提供相应的free函数,第2 3种情况可以视为一种情况,那即是:使用了内部全局变量!

  那么问题就来了,这个函数是个非线程安全的函数,在多线程的环境下使用,会发生重入的情况,即如果两个线程同时调用localtime函数,函数的返回结果都会是最后一次调用localtime的结果.这是一个典型的函数重入BUG.解决方法:使用线程安全的localtime_r函数替换localtime.至此,问题解决

  c语言中有不少函数都是非线程安全的,例如strtok,gethostbyname,看到返回值为指针类型的函数时,都要留个心眼.

转载于:https://www.cnblogs.com/Red_angelX/archive/2013/05/24/3097098.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值