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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我是一个线程 [转]

我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里我发现了很多和我一模一样的同伴。 我身边的同伴0x6900 待的时间比较长,他带着沧桑的口气对我说:“我们线程的宿命就是处理包…

自动化运维之–Cobbler

Cobbler 自动化 Cobbler简介 Cobbler是一个快速网络安装linux的服务,而且在经过调整也可以支持网络安装windows。该工具使用python开发,小巧轻便(才15k行python代码),使用简单的命令即可完成PXE网络安装环境的配置&…

基于VC++6.0的DLL开发

原文地址:http://blog.163.com/twnhr126/blog/static/78927547200910254346804/ 基于VC6.0的DLL开发 最近在开发一个基于网络的模块,目标是将这个在CAsyncSocket基础上开发的扩展类,进行有效的封装,向应用程序提供模块化的功能&a…

开源jumpserver 堡垒机搭建

一、环境 CentOS 6.x x86_64 mini service iptables stop 关闭SELinux的方法: 修改/etc/selinux/config文件中的SELINUX”” 为 disabled ,然后重启。 如果不想重启系统,使用命令setenforce 0 1.指定yum源 wget -O /etc/yum.repos.d/e…

Standard Driver Routines(标准驱动程序)

标准驱动程序 This section describes the required and optional routines that you must implement in your driver to respond to calls from Windows or other drivers. 本节介绍当驱动被Windows或其它驱动程序调用时,为了做出适当的回应,你的驱动必…

Shell 变量及函数讲解 [2]

Shell 变量的输入 Shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入获得,read为bash内置命令,可以通过help read查看帮助【语法格式】read [参数] [变量名]【常用参数】-p prompt:设置提示信息-t timeout&…

python实例化次数怎么算,我需要一个Python类来跟踪它被实例化的次数

I need a class that works like this:>>> aFoo()>>> bFoo()>>> cFoo()>>> c.i3Here is my try:class Foo(object):i 0def __init__(self):Foo.i 1It works as required, but I wonder if there is a more pythonic way to do it.解决方…

多个域名要选择合适的SSL证书

一般来讲,一个网站(一个域名)对应一个SSL证书,因为SSL证书是绑定域名的。只有通配符证书和UCC多域名证书才支持多个域名。通配符证书适用于同一个域名下的多个子域。如同一服务器有多个网站:www.domain.comlogin.domai…

java大作业私人管家系统_重庆管家婆软件丨管家婆工贸PRO的E-MES管理详解

其实,ERP和MES在制造操作中扮演着独立而又互补的角色。ERP能将企业所有方面的数据进行实时、可用的全面集成,为管理决策提供高效、准确的业务决策支持;MES则能加强MRP计划的执行,把MRP计划同车间作业现场控制通过执行系统联系起来。这些“现场…

监控体系 [精]

监控体系 zabbix 监控对象:     1. 监控对象的理解:CPU是怎么工作的,原理     2. 监控对象的指标:CPU使用率 CPU负载 CPU个数 上下文切换     3. 确定性能基准线:怎么样才算故障?CPU负载多…

SD卡启动盘制作软件

下载地址:http://www.roadkil.net/program.php?ProgramID24转载于:https://www.cnblogs.com/wangf/archive/2013/06/04/3116882.html

vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...

一提到爸妈的朋友圈,就会想到养生鸡汤,中老年流量谣言,土味表情包而出于保护个人隐私拒绝被爸妈误解而遭受灵魂拷问的考虑很多人选择了两全其美的分组法给家人看到阳光可爱正能量的一面沙雕的一面只展现给沙雕网友们可如果不小心把屏蔽的内容…

KVM 安装

KVM介绍 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之…

彼聆智能语音机器人_电销行业的人工智能:智能语音电话机器人

随着人工智能的发展,越来越多的机器人出现在我们的日常生活中,用于电话营销公司的自动打电话机器人、快递公司用来送快递的机器人、餐厅里用来上菜的机器人,最近更是有一款会后空翻的机器人。机器人正活跃在各行各业中,代替人类去…

接触的第二个引擎 scaleform

最近在研究 一个全新的 引擎 scaleform 一个 基于 Flash 的 优化的一个引擎 这个引擎之前只有 U3D 和 UDK 两个 版本的工具 去年 改引擎 发布了 mobile 的 SDK 这个引擎有一个 很强大的地方就是 对 Flash 中矢量图的 优化 这个引擎配备了相对完备的 说明文档 (c2d相当于没有) 缺…

Shell 基础介绍 [1]

本文目录1.什么是Shell?2.脚本语言类型3.其他常用的脚本语句种类4.Shell脚本的建立和执行5.Shell 变量类型6.普通变量7.Shell 特殊重要变量8.Shell进程状态变量9.Parameter Expansion10.扩展:其他变量的替换11.变量的数值(整数)计…

c++创建二叉树_数据结构:查找(4)|| 平衡二叉树

在介绍平衡二叉树之前,应该先了解平衡因子的概念,平衡因子定义为左子树深度减去右子树深度,这个值的绝对值越大,非常容易理解它就对应着越不平衡的情况。一棵平衡的二叉树的平衡因子只能是1,0,-1如何构建一…

[批处理]截取for命令里面的变量%%i

写了一个批处理,里面需要call几个其他的批处理。 其中主进程需要根据批处理文件运行时的输入参数,选择合适的url,而url的定义写到另外的批处理里面 URLProxyAA.cmd URLProxyBB.cmd.... 我想在主程序运行时搜索一下当前目录,有多少…

华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)

索尼从2020年12月9日开始,向开发者免费提供针对索尼数码相机的软件开发工具包“ Camera Remote SDK” 1.03版。“ Camera Remote SDK”开发的软件可以远程更改相机设置、并执行诸如快门释放,实时取景监视(如取景和对焦)之类的操作。支持的操作系统包括Wi…

Linux 字体颜色设置

本文主要介绍Linux 字体颜色的调整,常用于shell脚本当中。我们举一个例子:echo-e"\033[44;37;5m ME \033[0m COOL" 以上命令设置背景成为蓝色,前景白色,闪烁光标,输出字符“ME”,然后重新设置屏幕…